Creación de imágenes de contenedor Lambda - AWS Lambda

Creación de imágenes de contenedor Lambda

Puede empaquetar su código de función Lambda y dependencias como una imagen contenedor, utilizando herramientas como la CLI de Docker. A continuación, puede cargar la imagen en su registro contenedor alojado en Amazon EC2 Container Registry (Amazon ECR). Tenga en cuenta que debe crear la Lambda función desde la misma cuenta que el registro contenedor en Amazon ECR.

AWS proporciona un conjunto de imágenes base de código abierto que puede utilizar para crear la imagen contenedor. Estas imágenes base incluyen un cliente de interfaz de tiempo de ejecución para administrar la interacción entre Lambda y el código de función.

También puede utilizar una imagen base alternativa de otro registro contenedor. Lambda proporciona clientes de interfaz de tiempo de ejecución de código abierto que se agregan a una imagen base alternativa para hacerla compatible con Lambda.

Para ver aplicaciones de ejemplo, incluidos un ejemplo de Node.js y un ejemplo de Python, vea Soporte de imágenes de contenedor para Lambda en el AWS Blog.

Tipos de imagen

Puede utilizar una imagen base AWS proporcionada o una imagen base alternativa, como Alpine o Debian. 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 imágenes de hasta 10 GB de tamaño.

Herramientas para contenedores

Para crear la imagen contenedor, puede utilizar cualquier herramienta de desarrollo que admita uno de los siguientes formatos de manifiesto de imagen contenedor:

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

  • Especificaciones de OCI (v1.0.0 y superior)

Por ejemplo, puede utilizar la CLI de Docker para compilar, probar e implementar las imágenes de contenedor.

Lambda requisitos para las imágenes de contenedor

Para implementar una imagen de contenedor en Lambda, tenga en cuenta los siguientes requisitos:

  1. La imagen contenedor debe implementar la API de Lambda tiempo de ejecución. Los clientes de interfaz de tiempo de ejecución de AWS 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.

  2. 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 /tmp directorio de escritura con 512 MB de almacenamiento. Si está utilizando una imagen que requiere un directorio de escritura fuera de /tmp, configúrela para escribir en un directorio bajo el directorio /tmp.

  3. El Lambda usuario predeterminado 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 al definir un usuario predeterminado de Linux con permisos con menos privilegios. Compruebe que el código de su aplicación no depende de los archivos que otros usuarios de Linux tienen restricciones para ejecutar.

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

Configuración de imagen del contenedor

Lambda admite la siguiente configuración de imagen contenedor en Dockerfile:

  • ENTRYPOINT – Especifica la ruta absoluta al punto de entrada de la aplicación.

  • CMD – Especifica los parámetros que desea pasar con ENTRYPOINT.

  • WORKDIR – Especifica la ruta absoluta al directorio de trabajo.

  • ENV – Especifica una variable de entorno para la Lambda función.

nota

Lambda ignora los valores de cualquier configuración de imagen contenedor no admitida en Dockerfile.

Para obtener más información acerca de cómo Docker utiliza la configuración de la imagen contenedor, consulte ENTRYPOINT en la referencia Dockerfile en el sitio Web Docker Docs. Para obtener más información acerca del uso de ENTRYPOINT y CMD, vea Desmitificar ENTRYPOINT y CMD en Docker en el blog de código AWS abierto.

Puede especificar la configuración de la imagen contenedor en Dockerfile cuando construya la imagen. También puede anular estas configuraciones mediante la Lambda consola o la Lambda API. Esto le permite implementar varias funciones que implementan la misma imagen contenedor pero con diferentes configuraciones de tiempo de ejecución.

aviso

Cuando especifique ENTRYPOINT o CMD en el Dockerfile o como anulación, asegúrese de introducir la ruta absoluta. Además, no utilice enlaces simbólicos como punto de entrada al contenedor.

Crear una imagen a partir de una imagen AWS base para Lambda

Para crear una imagen contenedor para una nueva Lambda función, puede comenzar con una imagen AWS base para Lambda.

nota

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

Requisitos previos

  • La AWS Command Line Interface (AWS CLI)

    Las siguientes instrucciones utilizan las operaciones AWS CLI de API AWS de servicio para llamar. Para instalar el AWS CLI, consulte Instalación, actualización y desinstalación de AWS CLI en AWS Command Line Interface Guía del usuario.

  • Docker de escritorio

    Las siguientes instrucciones utilizan los comandos de la CLI de Docker para crear la imagen contenedor. Para instalar la CLI de Docker, consulte Obtener Docker en el sitio Web Docs de Docker.

  • Su código de función

Para crear una imagen a partir de una imagen AWS base para Lambda

  1. En su máquina local, cree un directorio de proyecto para su nueva función.

  2. Cree un directorio de aplicaciones en el directorio del proyecto y, a continuación, agregue el código del controlador de funciones al directorio de aplicaciones.

  3. Utilice un editor de texto para crear un nuevo Dockerfile.

    Las imágenes AWS base proporcionan las siguientes variables de entorno:

    • lambda_task_root=/var/tarea

    • Lambda_runtime_dir=/var/Runtime

    A continuación se muestra un ejemplo Dockerfile para Node.js versión 12. :

    FROM public.ecr.aws/lambda/nodejs:12 # Alternatively, you can pull the base image from Docker Hub: amazon/aws-lambda-nodejs:12 COPY app.js package.json /var/task/ # Install NPM dependencies for function RUN npm install # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "app.handler" ]
  4. Cree su imagen Docker con el comando docker build. Introduzca un nombre para la imagen. En el ejemplo siguiente se asigna un nombre a la imagen hello-world.

    docker build -t hello-world .
  5. (Opcional) Pruebe su aplicación localmente utilizando el emulador de interfaz de tiempo de ejecución. Desde una nueva ventana de terminal, publique un evento en el siguiente extremo mediante un comando curl:

    curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    Este comando invoca la función que se ejecuta en la imagen contenedor y devuelve una respuesta.

  6. Autenticar la CLI de Docker en su Amazon ECR registro.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
  7. Etiquetar la imagen para que coincida con el nombre de su repositorio e implemente la imagen Amazon ECR con el comando docker push.

    docker tag hello-world:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

Crear una imagen a partir de una imagen base alternativa

Requisitos previos

  • La AWS CLI

  • Docker de escritorio

  • Su código de función

Para crear una imagen utilizando una imagen base alternativa

  1. Elija una imagen base. Lambda soporta todas las distribuciones Linux, como Alpine, Debian y Ubuntu.

  2. En su máquina local, cree un directorio de proyecto para su nueva función.

  3. Cree un directorio de aplicaciones en el directorio del proyecto y, a continuación, agregue el código del controlador de funciones al directorio de aplicaciones.

  4. Utilice un editor de texto para crear un nuevo Dockerfile con la siguiente configuración:

    • Establezca la propiedad FROM en el URI de la imagen base.

    • Agregue instrucciones para instalar el cliente de interfaz de tiempo de ejecución.

    • Establezca la propiedad ENTRYPOINT para invocar el cliente de interfaz de tiempo de ejecución.

    • Establezca el argumento CMD para especificar el controlador de función Lambda.

    En el siguiente ejemplo se muestra un archivo Dockerfile para Python:

    # Define function directory ARG FUNCTION_DIR="/function" FROM python:buster as build-image # Install aws-lambda-cpp build dependencies RUN apt-get update && \ apt-get install -y \ g++ \ make \ cmake \ unzip \ libcurl4-openssl-dev # Include global arg in this stage of the build ARG FUNCTION_DIR # Create function directory RUN mkdir -p ${FUNCTION_DIR} # Copy function code COPY app/* ${FUNCTION_DIR} # Install the runtime interface client RUN pip install \ --target ${FUNCTION_DIR} \ awslambdaric # Multi-stage build: grab a fresh copy of the base image FROM python:buster # Include global arg in this stage of the build ARG FUNCTION_DIR # Set working directory to function root directory WORKDIR ${FUNCTION_DIR} # Copy in the build image dependencies COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR} ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ] CMD [ "app.handler" ]
  5. Cree su imagen Docker con el comando docker build. Introduzca un nombre para la imagen. En el ejemplo siguiente se asigna un nombre a la imagen hello-world.

    docker build -t hello-world .
  6. (Opcional) Pruebe la aplicación localmente utilizando el emulador de interfaz de tiempo de ejecución.

  7. Autenticar la CLI de Docker en su Amazon ECR registro.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
  8. Etiquetar la imagen para que coincida con el nombre de su repositorio e implemente la imagen Amazon ECR con el comando docker push.

    docker tag hello-world:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

Crear una imagen utilizando el kit de herramientas AWS SAM

Puede utilizar el kit de herramientas Modelo de aplicación sin servidor de AWS (AWS SAM) para crear e implementar una función definida como una imagen contenedor. Para un proyecto nuevo, puede utilizar el comando init AWS SAM CLI para configurar el andamio del proyecto en su tiempo de ejecución preferido.

En la plantilla AWS SAM, establece el Runtime tipo Image y proporciona el URI de la imagen base.

Para obtener más información, consulte Creación de aplicaciones en Guía para desarrolladores de Modelo de aplicación sin servidor de AWS.