Crear una función de Lambda con una imagen de contenedor - AWS Lambda

Crear una función de Lambda con una imagen de contenedor

El código de la función AWS Lambda se compone de scripts o programas compilados y sus dependencias. Utiliza un paquete de implementación para implementar su código de función en Lambda. Lambda admite dos tipos de paquetes de implementación: imágenes de contenedor y archivos .zip.

Hay tres formas de crear una imagen de contenedor para una función de Lambda:

sugerencia

Para reducir el tiempo que tardan las funciones de contenedor de Lambda en activarse, consulte Uso de compilaciones de varias fases en la documentación de Docker. Para compilar imágenes de contenedor eficientes, siga Prácticas recomendadas para escribir Dockerfiles.

Para crear una función de Lambda a partir de una imagen de contenedor, cree su imagen de manera local y cárguela en un repositorio de Amazon Elastic Container Registry (Amazon ECR). A continuación, especifique el URI del repositorio cuando cree la función. El repositorio Amazon ECR debe estar en el mismo Región de AWS que la función de Lambda. Puede crear una función con una imagen de una cuenta AWS diferente, siempre que la imagen esté en la misma región que la función de Lambda. Para obtener más información, consulte Permisos entre cuentas de Amazon ECR.

nota

Lambda no admite puntos de conexión FIPS de Amazon ECR para imágenes de contenedores. Si el URI de su repositorio incluye ecr-fips, está utilizando un punto de conexión FIPS. Ejemplo:111122223333.dkr.ecr-fips.us-east-1.amazonaws.com.

En esta página, se explican los tipos de imágenes base y los requisitos para crear imágenes de contenedor compatibles con Lambda.

nota

No puede cambiar el tipo de paquete de implementación (.zip o imagen de contenedor) de una función existente. Por ejemplo, no se puede convertir una función de imagen de contenedor para utilizar un archivo .zip. Debe crear una nueva función.

Requisitos

Instale la versión 2 de la AWS CLI y la CLI de Docker. Además, tenga en cuenta los siguientes requisitos:

  • La imagen de contenedor debe implementar la Uso de la API de tiempo de ejecución de Lambda para tiempos de ejecución personalizados. Los clientes de interfaz de tiempo de ejecución de AWS de código abierto implementan la API. Puede agregar un cliente de interfaz de tiempo de ejecución a su imagen base preferida para que sea compatible con Lambda.

  • La imagen de contenedor debe poder ejecutarse en un sistema de archivos de solo lectura. Su código de función puede acceder a un directorio /tmp con escritura permitida con entre 512 MB y 10,240 MB, en incrementos de 1 MB, de almacenamiento.

  • El usuario predeterminado de Lambda debe ser capaz de leer todos los archivos necesarios para ejecutar el código de función. Lambda sigue las prácticas recomendadas de seguridad definiendo un usuario predeterminado de Linux con permisos de privilegio mínimo. Esto significa que no tiene que especificar un USUARIO en el Dockerfile. Compruebe que el código de su aplicación no depende de los archivos que otros usuarios de Linux tienen restricciones para ejecutar.

  • Lambda solo admite imágenes de contenedor basadas en Linux.

  • Lambda proporciona imágenes base de varias arquitecturas. Sin embargo, la imagen que crea para su función debe tener como destino a solo una de las arquitecturas. Lambda no admite funciones que utilizan imágenes de contenedor de varias arquitecturas.

Uso de una imagen base de AWS para Lambda

Puede utilizar una de las imágenes base de AWS para Lambda a fin de crear la imagen de contenedor para el código de función. Las imágenes base están precargadas con un tiempo de ejecución de lenguaje y otros componentes necesarios para ejecutar una imagen contenedor en Lambda. Agregue su código de función y dependencias a la imagen base y luego lo empaqueta como una imagen de contenedor.

AWS proporciona periódicamente actualizaciones a las imágenes base AWS para Lambda. Si su Dockerfile incluye el nombre de la imagen en la propiedad FROM, el cliente de Docker extrae la última versión de la imagen del repositorio de Amazon ECR. Para utilizar la imagen base actualizada, debe reconstruir la imagen contenedor y actualizar el código de función.

Las imágenes base de Node.js 20, Python 3.12, Java 21, .NET 8, Ruby 3.3 y versiones posteriores se basan en la imagen de contenedor mínima de Amazon Linux 2023. Las imágenes base anteriores utilizan Amazon Linux 2. AL2023 ofrece varias ventajas con respecto a Amazon Linux 2, incluida una huella de implementación más reducida y versiones actualizadas de bibliotecas como glibc.

Las imágenes basadas en AL2023 utilizan microdnf (enlazadas simbólicamente como dnf) como administrador de paquetes en lugar de yum, que es el administrador de paquetes predeterminado en Amazon Linux 2. microdnf es una implementación independiente de dnf. Para obtener una lista de los paquetes que se incluyen en las imágenes basadas en AL2023, consulte las columnas de Minimal Container de Comparing packages installed on Amazon Linux 2023 Container Images. Para obtener más información sobre las diferencias entre AL2023 y Amazon Linux 2, consulte Introducing the Amazon Linux 2023 runtime for AWS Lambda en el Blog de informática de AWS.

nota

Para ejecutar imágenes basadas en AL2023 de forma local, incluso con AWS Serverless Application Model (AWS SAM), debe usar Docker en la versión 20.10.10 o posterior.

Para crear una imagen de contenedor a partir de una imagen base de AWS, elija las instrucciones para el lenguaje que prefiera:

Uso de una imagen base exclusiva del sistema operativo de AWS

Las imágenes base exclusivas del sistema operativo de AWScontienen una distribución de Amazon Linux y el emulador de interfaz de tiempo de ejecución. Por lo general, estas imágenes se utilizan para crear imágenes contenedoras para lenguajes compilados, como Go y Rust, y para un lenguaje o versión de un lenguaje para los que Lambda no proporciona una imagen base, como Node.js 19. También puede usar imágenes base exclusivas del sistema operativo para implementar un tiempo de ejecución personalizado. Para que la imagen sea compatible con Lambda, debe incluir en ella un cliente de interfaz de tiempo de ejecución para su lenguaje.

Etiquetas Tiempo de ejecución Sistema operativo Dockerfile Obsolescencia

al2023

Tiempo de ejecución exclusivo del sistema operativo Amazon Linux 2023 Dockerfile para tiempo de ejecución exclusivo del sistema operativo en GitHub

No programado

al2

Tiempo de ejecución exclusivo del sistema operativo Amazon Linux 2 Dockerfile para tiempo de ejecución exclusivo del sistema operativo en GitHub

No programado

Galería pública de Amazon Elastic Container Registry: gallery.ecr.aws/lambda/provided

Uso de una imagen base que no es de AWS

Lambda admite cualquier imagen que se ajuste a uno de los siguientes formatos de manifiesto de imagen:

  • Docker Image Manifest V2 Schema 2 (usado con Docker versión 1.10 y posteriores)

  • Especificaciones de la iniciativa de contenedores abiertos (OCI) (versión 1.0.0 y posteriores)

Lambda admite un tamaño máximo de imagen sin comprimir de 10 GB, incluidas todas las capas.

nota

Para que la imagen sea compatible con Lambda, debe incluir en ella un cliente de interfaz de tiempo de ejecución para su lenguaje.

Clientes de interfaz de tiempo de ejecución

Si utiliza una imagen base exclusiva del sistema operativo o una imagen base alternativa, debe incluir un cliente de interfaz de tiempo de ejecución en su imagen. El cliente de interfaz de tiempo de ejecución debe extender la Uso de la API de tiempo de ejecución de Lambda para tiempos de ejecución personalizados, que administra la interacción entre Lambda y el código de función. AWS proporciona clientes de interfaz de tiempo de ejecución de código abierto para los siguientes lenguajes:

Si utiliza un lenguaje que no tiene un cliente de interfaz de tiempo de ejecución de AWS, debe crear el suyo propio.

Permisos de Amazon ECR

Antes de crear la función de Lambda desde una imagen de contenedor, debe crear la imagen de forma local y cargarla en un repositorio de Amazon ECR. Cuando cree la función, especifique el URI del repositorio de Amazon ECR.

Asegúrese de que los permisos para el usuario o el rol que crean la función incluyan 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:us-east-1:111122223333:repository/hello-world" } ] }

Políticas de repositorios de Amazon ECR

Para una función en la misma cuenta que la imagen de contenedor en Amazon ECR, puede agregar los permisos ecr:BatchGetImage y ecr:GetDownloadUrlForLayer a su política de repositorios 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 privado 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 de contenedor. Lambda puede agregar estos permisos solo si la entidad 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 Establecer una instrucción de política de repositorio privado 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 instrucciones para otorgar 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 instrucción es necesaria para que Lambda pueda recuperar la imagen de contenedor para su optimización y almacenamiento en caché en nombre de la función propiedad de 123456789012.

ejemplo — Agregar permiso entre cuentas al 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 de la entidad 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 la práctica recomendada de seguridad de AWS de establecer permisos limitados en las políticas de IAM.

Además de los permisos de Lambda, el usuario o rol que crea la función también debe tener los permisos BatchGetImage y GetDownloadUrlForLayer.

Ciclo de vida de la función

Después de cargar una imagen de contenedor nueva o actualizada, Lambda la optimiza antes de que la función pueda procesar las invocaciones. El proceso de optimización puede tardar unos segundos. La función permanece en el estado Pending hasta que se completa el proceso. A continuación, la función pasa al estado Active. Mientras que el estado es Pending, puede invocar la función, pero otras operaciones en la función fallan. Las invocaciones que se producen mientras una actualización de imagen está en curso ejecutan el código de la imagen anterior.

Si una función no se invoca durante varias semanas, Lambda recupera su versión optimizada y la función pasa al estado Inactive. Para reactivar la función, debe invocarla. Lambda rechaza la primera invocación y la función entra en el estado Pending hasta que Lambda vuelva a optimizar la imagen. A continuación, la función regresa al Active estado.

Lambda recupera periódicamente la imagen del contenedor asociado del repositorio de Amazon ECR. Si la imagen de contenedor correspondiente ya no existe en Amazon ECR o se revocan los permisos, la función entra en estado Failed y Lambda devuelve un error para cualquier invocación de la función.

Puede utilizar la API de Lambda para obtener información sobre el estado de una función. Para obtener más información, consulte Estados de función de Lambda.