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:
-
Uso de una imagen base de AWS para Lambda
Las imágenes base de AWS vienen precargadas con un tiempo de ejecución de lenguaje, un cliente de interfaz de tiempo de ejecución para administrar la interacción entre Lambda y el código de la función y un emulador de interfaz de tiempo de ejecución para realizar pruebas a nivel local.
-
Uso de una imagen base exclusiva del sistema operativo de AWS
Las imágenes base exclusivas del sistema operativo de AWS
contienen 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. -
Uso de una imagen base que no es de AWS
Puede utilizar una imagen base alternativa de otro registro de contenedores, como Alpine Linux o Debian. También puede utilizar una imagen personalizada creada por su organización. Para que la imagen sea compatible con Lambda, debe incluir en ella un cliente de interfaz de tiempo de ejecución para su lenguaje.
sugerencia
Para reducir el tiempo que tardan las funciones de contenedor de Lambda en activarse, consulte Uso de compilaciones de varias fases
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.
Temas
Requisitos
Instale la versión 2 de la AWS CLI y la CLI de Docker
-
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
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
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
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 AWS
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.