Implementación de funciones de Lambda como imágenes de contenedor - AWS Lambda

Implementación de funciones de Lambda como imágenes de contenedor

Cuando se crea una función Lambda, empaquete el código de función en un paquete de implementación. Lambda admite dos tipos de paquetes de implementación: imágenes de contenedor y archivos .zip. El flujo de trabajo para crear una función es diferente según el tipo de paquete de implementación. Para configurar una función definida como un archivo .zip, consulte Implementación de funciones de Lambda como archivos .zip.

Puede utilizar la consola de Lambda y la API de Lambda para crear una función definida como una imagen contenedor, actualizar y probar el código de imagen y configurar otras opciones de función.

nota

No se puede convertir una función de archivo de archivo .zip existente para utilizar una imagen contenedor. Debe crear una nueva función.

Cuando selecciona una imagen mediante una etiqueta de imagen, Lambda convierte esa etiqueta en el resumen de imagen subyacente. Para recuperar el resumen de la imagen, utilice la operación API GetFunctionConfiguration. Para actualizar la función a una versión de imagen más reciente, debe utilizar la consola de Lambda para actualizar el código de función o utilizar la operación API UpdateFunctionCode. Las operaciones de configuración como UpdateFunctionConfiguration no actualizan la imagen contenedor de la función.

Requisitos previos

Para completar los pasos siguientes, necesitará un shell o un terminal de línea de comando para ejecutar los comandos. Los comandos y la salida esperada se enumeran en bloques separados:

aws --version

Debería ver los siguientes datos de salida:

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

Para comandos largos, se utiliza un carácter de escape (\) para dividir un comando en varias líneas.

En Linux y macOS, use su administrador de shell y paquetes preferido. En Windows 10, puede instalar Windows Subsystem para Linux para obtener una versión de Ubuntu y Bash integrada con Windows.

Antes de crear la función, debe crear una imagen de contenedor y cargarla en Amazon ECR.

Permisos

Asegúrese de que los permisos para el usuario IAM o rol que crea la función contienen las políticas administradas de AWS, GetRepositoryPolicy y SetRepositoryPolicy.

Por ejemplo, utilice la consola de IAM para crear un rol con la siguiente política:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": ["ecr:SetRepositoryPolicy","ecr:GetRepositoryPolicy"], "Resource": "arn:aws:ecr:<region>:<account>:repository/<repo name>/" } ] }

Permisos de Amazon ECR

Para una función en la misma cuenta que la imagen del contenedor en Amazon ECR, puede agregar los permisos ecr:BatchGetImage y ecr:GetDownloadUrlForLayer a su repositorio de Amazon ECR. En el siguiente ejemplo se muestra la política mínima:

{ "Sid": "LambdaECRImageRetrievalPolicy", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ] }

Para obtener más información sobre los permisos de repositorio de Amazon ECR, consulte Políticas de repositorio en la Guía del usuario de Amazon Elastic Container Registry.

Si el repositorio de Amazon ECR no incluye estos permisos, Lambda agrega ecr:BatchGetImage y ecr:GetDownloadUrlForLayer a los permisos del repositorio de imágenes del contenedor. Lambda puede agregar estos permisos solo si el principal que llama a Lambda tiene los permisos ecr:getRepositoryPolicy y ecr:setRepositoryPolicy.

Para ver o editar los permisos del repositorio de Amazon ECR, siga las instrucciones de Configuración de una instrucción de política de repositorio en la Guía del usuario de Amazon Elastic Container Registry.

Permisos entre cuentas de Amazon ECR

Una cuenta diferente en la misma región puede crear una función que utiliza una imagen de contenedor propiedad de su cuenta. En el siguiente ejemplo, su política de permisos de repositorio de Amazon ECR necesita las siguientes declaraciones para conceder acceso al número de cuenta 123456789012.

  • CrossAccountPermission: permite a la cuenta 123456789012 crear y actualizar funciones Lambda que utilizan imágenes de este repositorio ECR.

  • LambdaECRImageCrossAccountRetrievalPolicy: con el tiempo, Lambda establecerá el estado de una función como inactiva si esta no se invoca durante un período prolongado. Esta declaración es necesaria para que Lambda pueda recuperar la imagen del contenedor para su optimización y almacenamiento en caché en nombre de la función propiedad de 123456789012.

ejemplo Agregar permiso entre cuentas a su repositorio

{"Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountPermission", "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Principal": { "AWS": "arn:aws:iam::123456789012:root" } }, { "Sid": "LambdaECRImageCrossAccountRetrievalPolicy", "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Principal": { "Service": "lambda.amazonaws.com" }, "Condition": { "StringLike": { "aws:sourceARN": "arn:aws:lambda:us-east-1:123456789012:function:*" } } } ] }

Para brindar acceso a varias cuentas, agregue los ID de cuenta a la lista Principal en la política CrossAccountPermission y a la lista de evaluación de condiciones en LambdaECRImageCrossAccountRetrievalPolicy.

Si está trabajando con varias cuentas en una organización de AWS, le recomendamos que enumere cada ID de cuenta en la política de permisos ECR. Este enfoque se alinea con las prácticas recomendadas de seguridad de AWS establecer permisos limitados en las políticas de IAM.

Creación de la función

Para crear una función definida como imagen contenedor, primero debe crear la imagen y, a continuación, almacenar la imagen en el repositorio de Amazon ECR.

Para crear la función

  1. Abra la página de Functions (Funciones) en la consola de Lambda.

  2. Elija Create function (Crear función).

  3. Elija la opción Imagen de contenedor.

  4. Bajo Basic information (Información básica), haga lo siguiente:

    1. En Nombre de función, escriba el nombre de la función.

    2. Para Container image URI (URI de imagen de contenedor), proporcione una imagen de contenedor compatible con la arquitectura del conjunto de instrucciones que desea para el código de función.

      Puede ingresar el URI de imagen de Amazon ECR o buscar la imagen de Amazon ECR.

      • Ingrese el URI de imagen de Amazon ECR.

      • O bien, para buscar la imagen en un repositorio Amazon ECR, elija Examinar imágenes. Seleccione el repositorio de Amazon ECR en la lista desplegable y, a continuación, seleccione la imagen.

  5. (Opcional) Para anular los parámetros de configuración que se incluyen en Dockerfile, expanda Sustituciones de imágenes de contenedor. Puede anular cualquiera de los siguientes parámetros:

    • Para Punto de entrada, introduzca la ruta completa del ejecutable en tiempo de ejecución. En el ejemplo siguiente se muestra un punto de entrada para una función Node.js:

      "/usr/bin/npx", "aws-lambda-ric"
    • En Comando, introduzca parámetros adicionales para pasar a la imagen con Punto de entrada. En el ejemplo siguiente se muestra un comando para una función Node.js:

      "app.handler"
    • En Directorio de trabajo, introduzca la ruta completa del directorio de trabajo para la función. En el ejemplo siguiente se muestra el directorio de trabajo de una imagen base de AWS para Lambda:

      "/var/task"
    nota

    Para la configuración de anulación, asegúrese de que encierra cada cadena entre comillas (" ").

  6. (Opcional) Para Architecture (Arquitectura), elija la arquitectura del conjunto de instrucciones para la función. La arquitectura predeterminada es x86_64. Nota: Cuando cree la imagen de contenedor para su función, asegúrese de que sea compatible con esta arquitectura del conjunto de instrucciones.

  7. (Opcional) En Permisos, expanda Cambiar función de ejecución predeterminada. A continuación, elija crear un nuevo rol de ejecucióno utilizar un rol existente.

  8. Elija Create function (Crear función).

Lambda crea una función y un rol de ejecución que otorga a la función permiso para cargar los registros. Lambda asume el rol de ejecución cuando se invoca la función y utiliza el rol de ejecución para crear credenciales para el AWS SDK y leer datos de orígenes de eventos.

Cuando implementa código como imagen contenedor en una función de Lambda, la imagen se somete a un proceso de optimización para ejecutarse en Lambda. Este proceso puede tardar unos segundos, durante los cuales la función está en estado pendiente. Cuando se completa el proceso de optimización, la función entra en el estado activo.

Prueba de la función

Invoque la función de Lambda utilizando los datos del evento de muestra que se proporcionan en la consola.

Para invocar una función

  1. Después de seleccionar la función, elija la pestaña Prueba.

  2. En la sección Evento de prueba, elija Nuevo evento. En Plantilla, deje la opción predeterminada hello-world. Introduzca un nombre para esta prueba y tenga en cuenta la siguiente plantilla de evento de ejemplo:

    { "key1": "value1", "key2": "value2", "key3": "value3" }
  3. Elija Save changes (Guardar cambios) y después Test (Probar). Cada usuario puede crear hasta 10 eventos de prueba por función. Dichos eventos de prueba no están disponibles para otros usuarios.

    Lambda ejecuta la función en su nombre. El controlador de funciones recibe y procesa el evento de muestra.

  4. Si se realiza correctamente, puede ver los resultados en la consola.

    • El resultado de ejecución muestra el estado de ejecución correctamente. Para ver los resultados de ejecución de la función, expanda Detalles. Tenga en cuenta que el enlace de los logs (registros) abre la página de Log groups (Grupos de registro) en la consola de CloudWatch.

    • La sección Summary (Resumen) muestra la información principal proporcionada en la sección Log output (Resultado del registro) (la línea REPORT del registro de ejecución).

    • La sección de Log output (Salida de registro) muestra el registro que Lambda genera para cada invocación. La función escribe estos registros en CloudWatch. La consola de Lambda muestra estos registros para su comodidad. Elija Click here (Haga clic aquí) para agregar registros al grupo de registros de CloudWatch y abra la página Log groups (Grupos de registro) en la consola CloudWatch.

  5. Ejecute la función (elija Test) unas cuantas veces más para recopilar algunas métricas que puede ver en el siguiente paso.

  6. Elija la pestaña Monitor (Monitorear). Esta página muestra gráficos de las métricas que Lambda envía a CloudWatch.

    Para obtener más información acerca de estos gráficos, consulte Funciones de monitoreo en la consola de Lambda.

Anulación de la configuración del contenedor

Puede usar la consola de Lambda o la API de Lambda para anular la siguiente configuración de imagen de contenedor:

  • ENTRYPOINT: especifica la ruta absoluta del punto de entrada a la aplicación.

  • CMD: especifica los parámetros que desea pasar con ENTRYPOINT.

  • WORKDIR: especifica la ruta absoluta del directorio de trabajo.

  • ENV: especifica una variable de entorno para la función de Lambda.

Cualquier valor que proporcione en la consola de Lambda o en la API de Lambda anula los valores del Dockerfile.

Para anular los valores de configuración en la imagen contenedor

  1. Abra la página de Functions (Funciones) en la consola de Lambda.

  2. Elija la función que desea actualizar.

  3. En Configuración de imagen, elija Editar.

  4. Introduzca nuevos valores para cualquiera de los parámetros de anulación y, a continuación, elija Guardar.

  5. (Opcional) Para agregar o anular variables de entorno, en Variables de entorno, elija Editar.

    Para obtener más información, consulte Uso de variables de entorno de AWS Lambda .

Actualización del código de función

Después de implementar una imagen contenedor en una función, la imagen es de solo lectura. Para actualizar el código de función, primero debe implementar una nueva versión de imagen. Cree una nueva versión de imagen, y a continuación, almacene la imagen en el repositorio de Amazon ECR.

Para configurar la función para utilizar una imagen de contenedor actualizada

  1. Abra la página de Functions (Funciones) en la consola de Lambda.

  2. Elija la función que desea actualizar.

  3. En Imagen, elija Implementar nueva imagen.

  4. Elija Examinar imágenes.

  5. En el cuadro de diálogo Seleccionar imagen de contenedor, seleccione el repositorio de Amazon ECR en la lista desplegable y, a continuación, seleccione la nueva versión de imagen.

  6. Seleccione Save.

Versión de la función $LATEST

Al publicar una versión de función, el código y la mayoría de las opciones de configuración se bloquean para mantener una experiencia coherente para los usuarios de esa versión. Puede cambiar el código y muchas opciones de configuración solo en la versión no publicada de la función. De forma predeterminada, la consola muestra información de configuración para la versión no publicada de la función. Para ver las versiones de una función, elija Cualificadores. La versión no publicada se denomina $LATEST.

Tenga en cuenta que Amazon Elastic Container Registry (Amazon ECR) también utiliza una etiqueta más reciente para indicar la última versión de la imagen del contenedor. Tenga cuidado de no confundir esta etiqueta con la versión de la función $LATEST.

Para obtener más información acerca de la administración de versiones, consulte Versiones de la función de Lambda.

Uso de la API de Lambda

Para administrar funciones definidas como imágenes de contenedor, utilice las siguientes operaciones de API:

Para crear una función definida como imagen contenedor, utilice el comando create-function. Establezca la package-type a Image y especifique el URI de la imagen del contenedor utilizando el code parámetro.

Cuando crea la función, puede especificar la arquitectura del conjunto de instrucciones. La arquitectura predeterminada es x86-64. Asegúrese de que el código de la imagen de contenedor sea compatible con la arquitectura.

Puede crear la función desde la misma cuenta que el registro de contenedores o desde una cuenta diferente en la misma región que el registro de contenedores en Amazon ECR. Para el acceso entre cuentas, configure los permisos de Amazon ECR para la imagen.

aws lambda create-function --region sa-east-1 --function-name my-function \ --package-type Image \ --code ImageUri=<ECR Image URI> \ --role arn:aws:iam::123456789012:role/lambda-ex

Para actualizar el código de función, utilice el comando update-function-code. Especifique la ubicación de la imagen del contenedor mediante el parámetro image-uri.

nota

No se puede cambiar el package-type de una función.

aws lambda update-function-code --region sa-east-1 --function-name my-function \ --image-uri <ECR Image URI> \

Para actualizar los parámetros de la función, utilice la update-function-configuration operación. Especifique EntryPoint y Command como matrices de cadenas, y WorkingDirectory como una cadena.

aws lambda update-function-configuration --function-name my-function \ --image-config '{"EntryPoint": ["/usr/bin/npx", "aws-lambda-ric"], \ "Command": ["app.handler"] , \ "WorkingDirectory": "/var/task"}'

AWS CloudFormation

Puede utilizar AWS CloudFormation para crear funciones de Lambda definidas como imágenes contenedoras. En la plantilla AWS CloudFormation, el recurso de AWS::Lambda::Function especifica la función de Lambda. Para obtener descripciones de las propiedades del recurso AWS::Lambda::Function, consulte AWS::Lambda::Function en la Guía del usuario de AWS CloudFormation.

En el AWS::Lambda::Function recurso, establezca las siguientes propiedades para crear una función definida como una imagen contenedor:

  • AWS::Lambda::Function

    • PackageType: establecer en Image.

    • Código: introduzca el URI de la imagen del contenedor en el campo ImageUri.

    • ImageConfig: (opcional) anule las propiedades de configuración de la imagen del contenedor.

La propiedad ImageConfig en AWS::Lambda::Function contiene los siguientes campos:

  • Comando: especifica los parámetros con los que desea pasar EntryPoint.

  • EntryPoint: especifica el punto de entrada de la aplicación.

  • WorkingDirectory: especifica el directorio de trabajo.

nota

Si declara una propiedad ImageConfig en la AWS CloudFormation plantilla, debe proporcionar valores para las tres propiedades de ImageConfig.

Para obtener más información, consulte ImageConfig en la Guía del usuario de AWS CloudFormation.