

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Implementar funciones de Lambda con imágenes de contenedor
<a name="deploy-lambda-functions-with-container-images"></a>

*Ram Kandaswamy, Amazon Web Services*

## Resumen
<a name="deploy-lambda-functions-with-container-images-summary"></a>

AWS Lambda admite imágenes de contenedores como modelo de implementación. Este patrón muestra cómo implementar funciones de Lambda a través de imágenes de contenedor. 

Lambda es un servicio de computación controlado por eventos sin servidor que permite ejecutar código para prácticamente cualquier tipo de aplicación o servicio de backend, sin aprovisionar ni administrar servidores. La compatibilidad con imágenes de contenedores para las funciones de Lambda le otorga hasta 10 GB de almacenamiento para el artefacto de la aplicación y la posibilidad de utilizar herramientas de desarrollo de imágenes de contenedores conocidas.

El ejemplo de este patrón usa Python como lenguaje de programación subyacente, pero puede usar otros lenguajes, como Java, Node.js o Go. Para la fuente, considere un sistema basado en Git como GitHub GitLab, o Bitbucket, o utilice Amazon Simple Storage Service (Amazon S3).

## Requisitos previos y limitaciones
<a name="deploy-lambda-functions-with-container-images-prereqs"></a>

**Requisitos previos **
+ Amazon Elastic Container Registry (Amazon ECR) activado
+ Código de la aplicación
+ Imágenes de Docker con el cliente de interfaz de tiempo de ejecución y la última versión de Python
+ Conocimientos prácticos de Git

**Limitaciones**
+ El máximo tamaño de imagen soportado es de 10 GB.
+ El tiempo de ejecución máximo para una implementación de contenedores basada en Lambda es de 15 minutos.

## Arquitectura
<a name="deploy-lambda-functions-with-container-images-architecture"></a>

**Arquitectura de destino**

![\[Proceso de cuatro pasos para crear la función de Lambda.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/e421cc58-d33e-493d-b0bb-c3ffe39c2eb9/images/7f36d3d8-d161-497a-b036-26d886a16c69.png)


 

1. Cree un repositorio de Git y confirme el código de la aplicación en el repositorio.

1. El AWS CodeBuild proyecto se desencadena mediante la confirmación de cambios.

1. El CodeBuild proyecto crea la imagen de Docker y publica la imagen creada en Amazon ECR.

1. Cree una función de Lambda con la imagen de Amazon ECR.

**Automatización y escala**

Este patrón se puede automatizar mediante operaciones de API o mediante AWS CloudFormation el AWS Cloud Development Kit (AWS CDK) uso de operaciones de API desde un SDK. Lambda puede escalar automáticamente en función del número de solicitudes y se puede ajustar mediante los parámetros de simultaneidad. Para obtener más información, consulte la [documentación de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-concurrency.html).

## Tools (Herramientas)
<a name="deploy-lambda-functions-with-container-images-tools"></a>

**Servicios de AWS**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)AWS, CloudFormationhelps usted configura AWS los recursos, los aprovisiona de forma rápida y coherente y los administra a lo largo de su ciclo de vida en todo el Cuentas de AWS mundo Regiones de AWS. Este patrón utiliza [AWS CloudFormation Application Composer](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/app-composer-for-cloudformation.html), que le ayuda a ver y editar CloudFormation plantillas de forma visual.
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) es un servicio de compilación completamente administrado que le permite compilar código fuente, poner en marcha pruebas unitarias y producir artefactos listos para implementar.
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) es un servicio de registro de imágenes de contenedor administrado que es seguro, escalable y fiable.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.

**Otras herramientas**
+ [Docker](https://www.docker.com/) es un conjunto de productos de plataforma como servicio (PaaS) que utiliza la virtualización a nivel del sistema operativo para entregar software en contenedores.
+ [GitHub[GitLab](https://docs.gitlab.com/ee/user/get_started/get_started_projects.html)](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories), y [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/tutorial-learn-bitbucket-with-git/) son algunos de los sistemas de control de código fuente basados en Git más utilizados para realizar un seguimiento de los cambios en el código fuente.

## Prácticas recomendadas
<a name="deploy-lambda-functions-with-container-images-best-practices"></a>
+ Cree funciones lo más eficientes y pequeñas que sea posible para evitar la carga de archivos innecesarios.
+ Trate de colocar las capas estáticas en la parte superior de la lista de archivos de Docker y coloque las capas que cambien con más frecuencia en la parte inferior. Esto mejora el almacenamiento en caché, lo que mejora el rendimiento.
+ El propietario de la imagen es responsable de actualizar y parchear la imagen. Añada esa cadencia de actualización a sus procesos operativos. Para obtener más información, consulte la [Documentación de AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html#function-code).

## Epics
<a name="deploy-lambda-functions-with-container-images-epics"></a>

### Crea un proyecto en CodeBuild
<a name="create-a-project-in-codebuild"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un repositorio de Git. | Cree un repositorio de Git que contendrá el código fuente de la aplicación, el Dockerfile y el archivo `buildspec.yaml`.  | Desarrollador | 
| Crea un CodeBuild proyecto. | Para usar un CodeBuild proyecto para crear la imagen Lambda personalizada, haga lo siguiente: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/deploy-lambda-functions-with-container-images.html) | Desarrollador | 
| Edite el Dockerfile. | El Dockerfile debe estar ubicado en el directorio de nivel superior en el que se está desarrollando la aplicación. El código de Python debe estar en la carpeta `src`.Al crear la imagen, utilice las [imágenes oficiales compatibles con Lambda](https://gallery.ecr.aws/lambda?page=1). De lo contrario, se producirá un error de arranque que dificultará el proceso de empaquetado.Para obtener más información, consulte la sección [Información adicional](#deploy-lambda-functions-with-container-images-additional). | Desarrollador | 
| Cree un repositorio en Amazon ECR. | Cree un repositorio de contenedores en Amazon ECR. En el siguiente comando de ejemplo, el nombre del repositorio creado es `cf-demo`:<pre>aws ecr create-repository --cf-demo </pre>Se hará referencia al repositorio en el archivo `buildspec.yaml`. | Administrador de AWS, desarrollador | 
| Enviar la imagen a Amazon ECR. | Puede utilizarla CodeBuild para realizar el proceso de creación de imágenes. CodeBuild necesita permiso para interactuar con Amazon ECR y trabajar con S3. Como parte del proceso, la imagen de Docker se compila y envía al registro de Amazon ECR. Para obtener información sobre la plantilla y el código, consulte la sección [Información adicional](#deploy-lambda-functions-with-container-images-additional). | Desarrollador | 
| Verificar que la imagen está en el repositorio. | Para verificar que la imagen se encuentra en el repositorio, seleccione **Repositorios** en la consola de Amazon ECR. Si esa característica estaba activada en la configuración de Amazon ECR, la imagen debería aparecer en la lista, junto con etiquetas y los resultados de un informe de análisis de vulnerabilidades.  Para obtener más información, consulte la [documentación de AWS](https://docs.aws.amazon.com/cli/latest/reference/ecr/put-registry-scanning-configuration.html). | Desarrollador | 

### Crear la función de Lambda para ejecutar la imagen
<a name="create-the-lambda-function-to-run-the-image"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Crear la función de Lambda. | En la consola de Lambda, seleccione **Crear función** y, a continuación, seleccione **Imagen de contenedor**. Introduzca el nombre de la función y el URI de la imagen que se encuentra en el repositorio de Amazon ECR y, a continuación, seleccione **Crear función**. Para obtener más información, consulte la [documentación de AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html). | Desarrollador de aplicaciones | 
| Probar la función de Lambda. | Seleccione **Probar** para invocar y probar la función. Para obtener más información, consulte la [documentación de AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html). | Desarrollador de aplicaciones | 

## Resolución de problemas
<a name="deploy-lambda-functions-with-container-images-troubleshooting"></a>


| Problema | Solución | 
| --- | --- | 
| La compilación no se está realizando correctamente. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/deploy-lambda-functions-with-container-images.html) | 

## Recursos relacionados
<a name="deploy-lambda-functions-with-container-images-resources"></a>
+ [Imágenes base para Lambda](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-images.html)
+ [Ejemplo de Docker para CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker.html)
+ [Credenciales de paso temporales](https://aws.amazon.com/premiumsupport/knowledge-center/codebuild-temporary-credentials-docker/)

## Información adicional
<a name="deploy-lambda-functions-with-container-images-additional"></a>

**Editar el Dockerfile**

El siguiente código muestra los comandos que edita en el Dockerfile.

```
FROM public.ecr.aws/lambda/python:3.xx

# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT} 
COPY requirements.txt  ${LAMBDA_TASK_ROOT} 

# install dependencies
RUN pip3 install --user -r requirements.txt

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.lambda_handler" ]
```

En el comando `FROM`, utilice el valor adecuado para la versión de Python compatible con Lambda (por ejemplo, `3.12`). Será la imagen base que estará disponible en el repositorio público de imágenes de Amazon ECR. 

El comando `COPY app.py ${LAMBDA_TASK_ROOT}` copia el código en el directorio raíz de la tarea, que la función de Lambda utilizará. Este comando usa la variable de entorno, por lo que no hay que preocuparse por la ruta real. La función que se va a ejecutar se pasa como argumento al comando `CMD [ "app.lambda_handler" ]`.

El comando `COPY requirements.txt` captura las dependencias necesarias para el código. 

El comando `RUN pip install --user -r requirements.txt` instala las dependencias en el directorio de usuarios local. 

Para compilar su imagen, ejecute el siguiente comando.

```
docker build -t <image name> .
```

**Cómo añadir la imagen en Amazon ECR**

En el siguiente código, sustituya `aws_account_id` por el número de cuenta, y sustituya `us-east-1` si utiliza una región diferente. El `buildspec` archivo usa el número de CodeBuild compilación para identificar de forma exclusiva las versiones de las imágenes como un valor de etiqueta. Puede cambiarlo para adaptarlo a sus necesidades.

*El código personalizado de buildspec*

```
phases:
  install:
    runtime-versions:
       python: 3.xx
  pre_build:
    commands:
      - python3 --version
      - pip3 install --upgrade pip
      - pip3 install --upgrade awscli
      - sudo docker info
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - ls
      - cd app
      - docker build -t cf-demo:$CODEBUILD_BUILD_NUMBER .
      - docker container ls
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-east-1.amazonaws.com
      - docker tag cf-demo:$CODEBUILD_BUILD_NUMBER aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER
      - docker push aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER
```