

# Implementar funciones de Python Lambda con imágenes de contenedor
<a name="python-image"></a>

Hay tres formas de crear una imagen de contenedor para una función de Lambda en Python:
+ [Uso de una imagen base de AWS para Python](#python-image-instructions)

  Las [imágenes base de AWS](images-create.md#runtimes-images-lp) 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](images-create.md#runtimes-images-provided)

  [Las imágenes base exclusivas del sistema operativo de AWS](https://gallery.ecr.aws/lambda/provided)contienen una distribución de Amazon Linux y el [emulador de interfaz de tiempo de ejecución](https://github.com/aws/aws-lambda-runtime-interface-emulator/). Por lo general, estas imágenes se utilizan para crear imágenes contenedoras para lenguajes compilados, como [Go](go-image.md#go-image-provided) y [Rust](lambda-rust.md), 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](runtimes-custom.md). Para que la imagen sea compatible con Lambda, debe incluir el [cliente de interfaz de tiempo de ejecución para Python](#python-image-clients) en la imagen.
+ [Uso de una imagen base que no sea de AWS](#python-image-clients)

  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 el [cliente de interfaz de tiempo de ejecución para Python](#python-image-clients) en la imagen.

**sugerencia**  
Para reducir el tiempo que tardan las funciones de contenedor de Lambda en activarse, consulte [Uso de compilaciones de varias fases](https://docs.docker.com/build/building/multi-stage/) en la documentación de Docker. Para compilar imágenes de contenedores eficientes, siga [Prácticas recomendadas para escribir Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/).

En esta página, se explica cómo compilar, probar e implementar imágenes de contenedor para Lambda.

**Topics**
+ [

## AWS imágenes base para Python
](#python-image-base)
+ [

## Uso de una imagen base de AWS para Python
](#python-image-instructions)
+ [

## Uso de una imagen base alternativa con el cliente de interfaz de tiempo de ejecución
](#python-image-clients)

## AWS imágenes base para Python
<a name="python-image-base"></a>

AWS proporciona las siguientes imágenes base para Python:


| Etiquetas | Tiempo de ejecución | Sistema operativo | Dockerfile | Obsolescencia | 
| --- | --- | --- | --- | --- | 
| 3.14 | Python 3.14 | Amazon Linux 2023 | [Dockerfile para Python 3.14 en GitHub](https://github.com/aws/aws-lambda-base-images/blob/python3.14/Dockerfile.python3.14) |   30 de junio de 2029   | 
| 3.13 | Python 3.13 | Amazon Linux 2023 | [Dockerfile para Python 3.13 en GitHub](https://github.com/aws/aws-lambda-base-images/blob/python3.13/Dockerfile.python3.13) |   30 de junio de 2029   | 
| 3.12 | Python 3.12 | Amazon Linux 2023 | [Dockerfile para Python 3.12 en GitHub](https://github.com/aws/aws-lambda-base-images/blob/python3.12/Dockerfile.python3.12) |   31 de octubre de 2028   | 
| 3.11 | Python 3.11 | Amazon Linux 2 | [Dockerfile para Python 3.11 en GitHub](https://github.com/aws/aws-lambda-base-images/blob/python3.11/Dockerfile.python3.11) |   30 de junio de 2027   | 
| 3.10 | Python 3.10 | Amazon Linux 2 | [Dockerfile para Python 3.10 en GitHub](https://github.com/aws/aws-lambda-base-images/blob/python3.10/Dockerfile.python3.10) |   31 de octubre de 2026   | 

Repositorio de Amazon ECR: [gallery.ecr.aws/lambda/python](https://gallery.ecr.aws/lambda/python)

Las imágenes base de Python 3.12 y versiones posteriores se basan en la [imagen de contenedor mínima de Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/minimal-container.html). Las imágenes de Python 3.8-3.11 se basan en la imagen de Amazon Linux 2. (). Las imágenes basadas en AL2023 ofrecen 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](https://docs.aws.amazon.com/linux/al2023/ug/al2023-container-image-types.html). 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](https://aws.amazon.com/blogs/compute/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.

### Ruta de búsqueda de dependencias en las imágenes base
<a name="python-image-searchpath"></a>

Cuando utilice una instrucción `import` en su código, el tiempo de ejecución de Python buscará en los directorios de su ruta de búsqueda hasta que encuentre el módulo o el paquete. De forma predeterminada, el tiempo de ejecución busca en el directorio `{LAMBDA_TASK_ROOT}` primero. Si incluye una versión de una biblioteca incluida en el tiempo de ejecución de su imagen, esta versión tendrá prioridad sobre la versión incluida en el tiempo de ejecución.

Los demás pasos de la ruta de búsqueda dependen de la versión de la imagen base de Lambda para Python que utilice:
+ **Python 3.11 y posteriores**: las bibliotecas incluidas en el tiempo de ejecución y las bibliotecas instaladas con pip se instalan en el directorio `/var/lang/lib/python3.11/site-packages`. Este directorio tiene prioridad sobre `/var/runtime` en la ruta de búsqueda. Puede anular el SDK mediante pip para instalar una versión más reciente. Puede usar pip para comprobar que el SDK incluido en el tiempo de ejecución y sus dependencias son compatibles con los paquetes que instale.
+ **Python 3.8-3.10**: las bibliotecas incluidas en el tiempo de ejecución se instalan en el directorio `/var/runtime`. Las bibliotecas instaladas con pip se instalan en el directorio `/var/lang/lib/python3.x/site-packages`. El directorio `/var/runtime` tiene prioridad sobre `/var/lang/lib/python3.x/site-packages` en la ruta de búsqueda.

Para ver la ruta de búsqueda completa de la función de Lambda, agregue el siguiente fragmento de código.

```
import sys
      
search_path = sys.path
print(search_path)
```

## Uso de una imagen base de AWS para Python
<a name="python-image-instructions"></a>

### Requisitos previos
<a name="python-image-prerequisites"></a>

Para completar los pasos de esta sección, debe disponer de lo siguiente:
+ [AWS CLI versión 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://docs.docker.com/get-docker) (versión mínima 25.0.0)
+ El [complemento buildx](https://github.com/docker/buildx/blob/master/README.md) de Docker.
+ Python

### Creación de una imagen a partir de una imagen base
<a name="python-image-create"></a>

**Para crear una imagen de contenedor a partir de una imagen base de AWS para Python**

1. Cree un directorio para el proyecto y, a continuación, cambie a ese directorio.

   ```
   mkdir example
   cd example
   ```

1. Cree un nuevo archivo denominado `lambda_function.py`. Puede agregar el siguiente código de función de muestra al archivo para realizar pruebas o utilizar su propio código.  
**Example Función de Python**  

   ```
   import sys
   def handler(event, context):
       return 'Hello from AWS Lambda using Python' + sys.version + '!'
   ```

1. Cree un nuevo archivo denominado `requirements.txt`. Si utiliza el código de función de ejemplo del paso anterior, puede dejar el archivo vacío porque no hay dependencias. De lo contrario, enumere cada biblioteca requerida. Por ejemplo, este es el aspecto que `requirements.txt` debería tener si la función usa AWS SDK para Python (Boto3):  
**Example requirements.txt**  

   ```
   boto3
   ```

1. Cree un nuevo archivo Dockerfile con la siguiente configuración:
   + Establezca la propiedad `FROM` en el [URI de la imagen base](https://gallery.ecr.aws/lambda/python/).
   + Utilice el comando COPY para copiar el código de la función y las dependencias del tiempo de ejecución a `{LAMBDA_TASK_ROOT}`, una [variable de entorno definido de Lambda](configuration-envvars.md#configuration-envvars-runtime).
   + Establezca el argumento `CMD` para el controlador de la función de Lambda.

   Tenga en cuenta que el Dockerfile de ejemplo no incluye una [instrucción USER](https://docs.docker.com/reference/dockerfile/#user). Al implementar una imagen de contenedor en Lambda, Lambda define automáticamente un usuario predeterminado de Linux con permisos de privilegio mínimo. Esto es diferente del comportamiento estándar de Docker, que utiliza de forma predeterminada el usuario `root` cuando no se proporciona ninguna instrucción `USER`.  
**Example Dockerfile**  

   ```
   FROM public.ecr.aws/lambda/python:3.12
   
   # Copy requirements.txt
   COPY requirements.txt ${LAMBDA_TASK_ROOT}
   
   # Install the specified packages
   RUN pip install -r requirements.txt
   
   # Copy function code
   COPY lambda_function.py ${LAMBDA_TASK_ROOT}
   
   # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
   CMD [ "lambda_function.handler" ]
   ```

1. Cree la imagen de Docker con el comando [docker build](https://docs.docker.com/engine/reference/commandline/build/). En el siguiente ejemplo se asigna un nombre a la imagen `docker-image` y se le asigna la [etiqueta](https://docs.docker.com/engine/reference/commandline/build/#tag) `test`. Para que la imagen sea compatible con Lambda, debe usar la opción `--provenance=false`.

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**nota**  
El comando especifica la opción `--platform linux/amd64` para garantizar que el contenedor sea compatible con el entorno de ejecución de Lambda, independientemente de la arquitectura de la máquina de compilación. Si tiene intención de crear una función de Lambda con la arquitectura del conjunto de instrucciones ARM64, asegúrese de cambiar el comando para utilizar la opción `--platform linux/arm64` en su lugar.

### (Opcional) Prueba de la imagen de forma local
<a name="python-image-test"></a>

1. Inicie la imagen de Docker con el comando **docker run**. En este ejemplo, `docker-image` es el nombre de la imagen y `test` es la etiqueta.

   ```
   docker run --platform linux/amd64 -p 9000:8080 docker-image:test
   ```

   Este comando ejecuta la imagen como un contenedor y crea un punto de conexión local en `localhost:9000/2015-03-31/functions/function/invocations`.
**nota**  
Si creó la imagen de Docker para la arquitectura del conjunto de instrucciones ARM64, asegúrese de utilizar la opción `--platform linux/arm64` en lugar de `--platform linux/amd64`.

1. Desde una nueva ventana de terminal, publique un evento en el punto de conexión local.

------
#### [ Linux/macOS ]

   En Linux y macOS, ejecute el siguiente comando `curl`:

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

   Este comando invoca la función con un evento vacío y devuelve una respuesta. Si utiliza su propio código de función en lugar del código de función de ejemplo, quizás quiera invocar la función con una carga JSON. Ejemplo:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
   ```

------
#### [ PowerShell ]

   En PowerShell, ejecute el siguiente comando `Invoke-WebRequest`:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
   ```

   Este comando invoca la función con un evento vacío y devuelve una respuesta. Si utiliza su propio código de función en lugar del código de función de ejemplo, quizás quiera invocar la función con una carga JSON. Ejemplo:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
   ```

------

1. Obtenga el ID del contenedor.

   ```
   docker ps
   ```

1. Use el comando [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) para detener el contenedor. En este comando, reemplace `3766c4ab331c` por el ID del contenedor del paso anterior.

   ```
   docker kill 3766c4ab331c
   ```

### Implementación de la imagen
<a name="python-image-deploy"></a>

**Para cargar la imagen en Amazon ECR y crear la función de Lambda**

1. Para autenticar la CLI de Docker en su registro de Amazon ECR, ejecute el comando [get-login-password](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html).
   + Establezca el valor de `--region` en la Región de AWS en la que desee crear el repositorio de Amazon ECR.
   + Reemplace `111122223333` por el ID de su Cuenta de AWS.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. Cree un repositorio en Amazon ECR con el comando [create-repository](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html).

   ```
   aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**nota**  
El repositorio de Amazon ECR debe estar en la misma Región de AWS que la función de Lambda.

   Si se realiza de la forma correcta, verá una respuesta como la siguiente:

   ```
   {
       "repository": {
           "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
           "registryId": "111122223333",
           "repositoryName": "hello-world",
           "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
           "createdAt": "2023-03-09T10:39:01+00:00",
           "imageTagMutability": "MUTABLE",
           "imageScanningConfiguration": {
               "scanOnPush": true
           },
           "encryptionConfiguration": {
               "encryptionType": "AES256"
           }
       }
   }
   ```

1. Copie el valor de `repositoryUri` de la salida del paso anterior.

1. Ejecute el comando [docker tag](https://docs.docker.com/engine/reference/commandline/tag/) para etiquetar la imagen local en su repositorio de Amazon ECR como la versión más reciente. En este comando:
   + `docker-image:test` es el nombre y la [etiqueta](https://docs.docker.com/engine/reference/commandline/build/#tag) de su imagen de Docker. Son el nombre y la etiqueta de la imagen que especificó en el comando `docker build`.
   + Reemplace `<ECRrepositoryUri>` por el `repositoryUri` que ha copiado. Asegúrese de incluir `:latest` al final del URI.

   ```
   docker tag docker-image:test <ECRrepositoryUri>:latest
   ```

   Ejemplo:

   ```
   docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. Ejecute el comando [docker push](https://docs.docker.com/engine/reference/commandline/push/) para implementar la imagen local en el repositorio de Amazon ECR. Asegúrese de incluir `:latest` al final del URI del repositorio.

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

1. [Cree un rol de ejecución](lambda-intro-execution-role.md#permissions-executionrole-api) para la función si aún no tiene uno. Necesitará el nombre de recurso de Amazon (ARN) del rol en el paso siguiente.

1. Cree la función de Lambda. En `ImageUri`, especifique el URI del repositorio anterior. Asegúrese de incluir `:latest` al final del URI.

   ```
   aws lambda create-function \
     --function-name hello-world \
     --package-type Image \
     --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
     --role arn:aws:iam::111122223333:role/lambda-ex
   ```
**nota**  
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](images-create.md#configuration-images-xaccount-permissions).

1. Invoque la función.

   ```
   aws lambda invoke --function-name hello-world response.json
   ```

   Debería ver una respuesta como la siguiente:

   ```
   {
     "ExecutedVersion": "$LATEST", 
     "StatusCode": 200
   }
   ```

1. Para ver la salida de la función, compruebe el archivo `response.json`.

Para actualizar el código de la función, debe volver a compilar la imagen, cargar la nueva imagen en el repositorio de Amazon ECR y, a continuación, utilizar el comando [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) para implementar la imagen en la función de Lambda.

Lambda resuelve la etiqueta de la imagen en un resumen de imagen específico. Esto significa que si apunta la etiqueta de imagen que se utilizó para implementar la función a una nueva imagen en Amazon ECR, Lambda no actualiza automáticamente la función para usar la nueva imagen.

Para implementar la nueva imagen en la misma función de Lambda, debe usar el comando [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html), incluso si la etiqueta de la imagen en Amazon ECR sigue siendo la misma. En el siguiente ejemplo, la opción `--publish` crea una nueva versión de la función con la imagen del contenedor actualizada.

```
aws lambda update-function-code \
  --function-name hello-world \
  --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
  --publish
```

## Uso de una imagen base alternativa con el cliente de interfaz de tiempo de ejecución
<a name="python-image-clients"></a>

Si usa una [imagen base exclusiva del sistema operativo](images-create.md#runtimes-images-provided) o una imagen base alternativa, debe incluir el cliente de interfaz de tiempo de ejecución en su imagen. El cliente de interfaz de tiempo de ejecución extiende el [API de tiempo de ejecución](runtimes-api.md), que administra la interacción entre Lambda y el código de la función.

Instale el [cliente de interfaz de tiempo de ejecución para Python](https://pypi.org/project/awslambdaric) mediante el administrador de paquetes pip:

```
pip install awslambdaric
```

También puede descargar el [cliente de interfaz de tiempo de ejecución de Python](https://github.com/aws/aws-lambda-python-runtime-interface-client/) desde GitHub.

En el siguiente ejemplo, se muestra cómo crear una imagen de contenedor para Python mediante una imagen base que no es de AWS. El Dockerfile de ejemplo usa una imagen base oficial de Python. El Dockerfile incluye el cliente de interfaz de tiempo de ejecución para Python.

### Requisitos previos
<a name="python-alt-prerequisites"></a>

Para completar los pasos de esta sección, debe disponer de lo siguiente:
+ [AWS CLI versión 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://docs.docker.com/get-docker) (versión mínima 25.0.0)
+ El [complemento buildx](https://github.com/docker/buildx/blob/master/README.md) de Docker.
+ Python

### Creación de imágenes a partir de una imagen base alternativa
<a name="python-alt-create"></a>

**Para crear una imagen de contenedor a partir de una imagen base que no es de AWS**

1. Cree un directorio para el proyecto y, a continuación, cambie a ese directorio.

   ```
   mkdir example
   cd example
   ```

1. Cree un nuevo archivo denominado `lambda_function.py`. Puede agregar el siguiente código de función de muestra al archivo para realizar pruebas o utilizar su propio código.  
**Example Función de Python**  

   ```
   import sys
   def handler(event, context):
       return 'Hello from AWS Lambda using Python' + sys.version + '!'
   ```

1. Cree un nuevo archivo denominado `requirements.txt`. Si utiliza el código de función de ejemplo del paso anterior, puede dejar el archivo vacío porque no hay dependencias. De lo contrario, enumere cada biblioteca requerida. Por ejemplo, este es el aspecto que `requirements.txt` debería tener si la función usa AWS SDK para Python (Boto3):  
**Example requirements.txt**  

   ```
   boto3
   ```

1. Cree un nuevo Dockerfile. El siguiente Dockerfile usa una imagen base oficial de Python en lugar de una [imagen base de AWS](images-create.md#runtimes-images-lp). El Dockerfile incluye el [cliente de interfaz de tiempo de ejecución](https://pypi.org/project/awslambdaric), que hace que la imagen sea compatible con Lambda. El siguiente Dockerfile de ejemplo utiliza una [compilación de varias etapas](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#use-multi-stage-builds).
   + Establezca la propiedad `FROM` como la imagen base.
   + Configure `ENTRYPOINT` como el módulo que desea que el contenedor de Docker ejecute cuando se inicie. En este caso, el módulo es el cliente de interfaz de tiempo de ejecución.
   + Establezca el `CMD` como el controlador de la función de Lambda.

   Tenga en cuenta que el Dockerfile de ejemplo no incluye una [instrucción USER](https://docs.docker.com/reference/dockerfile/#user). Al implementar una imagen de contenedor en Lambda, Lambda define automáticamente un usuario predeterminado de Linux con permisos de privilegio mínimo. Esto es diferente del comportamiento estándar de Docker, que utiliza de forma predeterminada el usuario `root` cuando no se proporciona ninguna instrucción `USER`.  
**Example Dockerfile**  

   ```
   # Define custom function directory
   ARG FUNCTION_DIR="/function"
   
   FROM python:3.12 AS build-image
   
   # Include global arg in this stage of the build
   ARG FUNCTION_DIR
   
   # Copy function code
   RUN mkdir -p ${FUNCTION_DIR}
   COPY . ${FUNCTION_DIR}
   
   # Install the function's dependencies
   RUN pip install \
       --target ${FUNCTION_DIR} \
           awslambdaric
   
   # Use a slim version of the base Python image to reduce the final image size
   FROM python:3.12-slim
   
   # 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 built dependencies
   COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}
   
   # Set runtime interface client as default command for the container runtime
   ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
   # Pass the name of the function handler as an argument to the runtime
   CMD [ "lambda_function.handler" ]
   ```

1. Cree la imagen de Docker con el comando [docker build](https://docs.docker.com/engine/reference/commandline/build/). En el siguiente ejemplo se asigna un nombre a la imagen `docker-image` y se le asigna la [etiqueta](https://docs.docker.com/engine/reference/commandline/build/#tag) `test`. Para que la imagen sea compatible con Lambda, debe usar la opción `--provenance=false`.

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**nota**  
El comando especifica la opción `--platform linux/amd64` para garantizar que el contenedor sea compatible con el entorno de ejecución de Lambda, independientemente de la arquitectura de la máquina de compilación. Si tiene intención de crear una función de Lambda con la arquitectura del conjunto de instrucciones ARM64, asegúrese de cambiar el comando para utilizar la opción `--platform linux/arm64` en su lugar.

### (Opcional) Prueba de la imagen de forma local
<a name="python-alt-test"></a>

Utilice el [emulador de interfaz de tiempo de ejecución](https://github.com/aws/aws-lambda-runtime-interface-emulator/) para probar la imagen localmente. Puede [crear el emulador en su imagen](https://github.com/aws/aws-lambda-runtime-interface-emulator/?tab=readme-ov-file#build-rie-into-your-base-image) o usar el procedimiento siguiente para instalarlo en su equipo local.

**Para instalar y ejecutar el emulador de interfaz de tiempo de ejecución en su equipo local**

1. Desde el directorio del proyecto, ejecute el siguiente comando para descargar el emulador de interfaz de tiempo de ejecución (arquitectura x86-64) de GitHub e instalarlo en su equipo local.

------
#### [ Linux/macOS ]

   ```
   mkdir -p ~/.aws-lambda-rie && \
       curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \
       chmod +x ~/.aws-lambda-rie/aws-lambda-rie
   ```

   Para instalar el emulador arm64, reemplace la URL del repositorio de GitHub en el comando anterior por lo siguiente:

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------
#### [ PowerShell ]

   ```
   $dirPath = "$HOME\.aws-lambda-rie"
   if (-not (Test-Path $dirPath)) {
       New-Item -Path $dirPath -ItemType Directory
   }
         
   $downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie"
   $destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie"
   Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath
   ```

   Para instalar el emulador arm64, reemplace el `$downloadLink` con lo siguiente:

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------

1. Inicie la imagen de Docker con el comando **docker run**. Tenga en cuenta lo siguiente:
   + `docker-image` es el nombre de la imagen y `test` es la etiqueta.
   + `/usr/local/bin/python -m awslambdaric lambda_function.handler` es el `ENTRYPOINT` seguido del `CMD` de su Dockerfile.

------
#### [ Linux/macOS ]

   ```
   docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
       --entrypoint /aws-lambda/aws-lambda-rie \
       docker-image:test \
           /usr/local/bin/python -m awslambdaric lambda_function.handler
   ```

------
#### [ PowerShell ]

   ```
   docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 `
   --entrypoint /aws-lambda/aws-lambda-rie `
   docker-image:test `
       /usr/local/bin/python -m awslambdaric lambda_function.handler
   ```

------

   Este comando ejecuta la imagen como un contenedor y crea un punto de conexión local en `localhost:9000/2015-03-31/functions/function/invocations`.
**nota**  
Si creó la imagen de Docker para la arquitectura del conjunto de instrucciones ARM64, asegúrese de utilizar la opción `--platform linux/arm64` en lugar de `--platform linux/amd64`.

1. Publique un evento en el punto de conexión local.

------
#### [ Linux/macOS ]

   En Linux y macOS, ejecute el siguiente comando `curl`:

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

   Este comando invoca la función con un evento vacío y devuelve una respuesta. Si utiliza su propio código de función en lugar del código de función de ejemplo, quizás quiera invocar la función con una carga JSON. Ejemplo:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
   ```

------
#### [ PowerShell ]

   En PowerShell, ejecute el siguiente comando `Invoke-WebRequest`:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
   ```

   Este comando invoca la función con un evento vacío y devuelve una respuesta. Si utiliza su propio código de función en lugar del código de función de ejemplo, quizás quiera invocar la función con una carga JSON. Ejemplo:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
   ```

------

1. Obtenga el ID del contenedor.

   ```
   docker ps
   ```

1. Use el comando [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) para detener el contenedor. En este comando, reemplace `3766c4ab331c` por el ID del contenedor del paso anterior.

   ```
   docker kill 3766c4ab331c
   ```

### Implementación de la imagen
<a name="python-alt-deploy"></a>

**Para cargar la imagen en Amazon ECR y crear la función de Lambda**

1. Para autenticar la CLI de Docker en su registro de Amazon ECR, ejecute el comando [get-login-password](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html).
   + Establezca el valor de `--region` en la Región de AWS en la que desee crear el repositorio de Amazon ECR.
   + Reemplace `111122223333` por el ID de su Cuenta de AWS.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. Cree un repositorio en Amazon ECR con el comando [create-repository](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html).

   ```
   aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**nota**  
El repositorio de Amazon ECR debe estar en la misma Región de AWS que la función de Lambda.

   Si se realiza de la forma correcta, verá una respuesta como la siguiente:

   ```
   {
       "repository": {
           "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
           "registryId": "111122223333",
           "repositoryName": "hello-world",
           "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
           "createdAt": "2023-03-09T10:39:01+00:00",
           "imageTagMutability": "MUTABLE",
           "imageScanningConfiguration": {
               "scanOnPush": true
           },
           "encryptionConfiguration": {
               "encryptionType": "AES256"
           }
       }
   }
   ```

1. Copie el valor de `repositoryUri` de la salida del paso anterior.

1. Ejecute el comando [docker tag](https://docs.docker.com/engine/reference/commandline/tag/) para etiquetar la imagen local en su repositorio de Amazon ECR como la versión más reciente. En este comando:
   + `docker-image:test` es el nombre y la [etiqueta](https://docs.docker.com/engine/reference/commandline/build/#tag) de su imagen de Docker. Son el nombre y la etiqueta de la imagen que especificó en el comando `docker build`.
   + Reemplace `<ECRrepositoryUri>` por el `repositoryUri` que ha copiado. Asegúrese de incluir `:latest` al final del URI.

   ```
   docker tag docker-image:test <ECRrepositoryUri>:latest
   ```

   Ejemplo:

   ```
   docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. Ejecute el comando [docker push](https://docs.docker.com/engine/reference/commandline/push/) para implementar la imagen local en el repositorio de Amazon ECR. Asegúrese de incluir `:latest` al final del URI del repositorio.

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

1. [Cree un rol de ejecución](lambda-intro-execution-role.md#permissions-executionrole-api) para la función si aún no tiene uno. Necesitará el nombre de recurso de Amazon (ARN) del rol en el paso siguiente.

1. Cree la función de Lambda. En `ImageUri`, especifique el URI del repositorio anterior. Asegúrese de incluir `:latest` al final del URI.

   ```
   aws lambda create-function \
     --function-name hello-world \
     --package-type Image \
     --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
     --role arn:aws:iam::111122223333:role/lambda-ex
   ```
**nota**  
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](images-create.md#configuration-images-xaccount-permissions).

1. Invoque la función.

   ```
   aws lambda invoke --function-name hello-world response.json
   ```

   Debería ver una respuesta como la siguiente:

   ```
   {
     "ExecutedVersion": "$LATEST", 
     "StatusCode": 200
   }
   ```

1. Para ver la salida de la función, compruebe el archivo `response.json`.

Para actualizar el código de la función, debe volver a compilar la imagen, cargar la nueva imagen en el repositorio de Amazon ECR y, a continuación, utilizar el comando [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) para implementar la imagen en la función de Lambda.

Lambda resuelve la etiqueta de la imagen en un resumen de imagen específico. Esto significa que si apunta la etiqueta de imagen que se utilizó para implementar la función a una nueva imagen en Amazon ECR, Lambda no actualiza automáticamente la función para usar la nueva imagen.

Para implementar la nueva imagen en la misma función de Lambda, debe usar el comando [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html), incluso si la etiqueta de la imagen en Amazon ECR sigue siendo la misma. En el siguiente ejemplo, la opción `--publish` crea una nueva versión de la función con la imagen del contenedor actualizada.

```
aws lambda update-function-code \
  --function-name hello-world \
  --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
  --publish
```

Para obtener un ejemplo de cómo crear una imagen de Python a partir de una imagen base Alpine, consulte [Soporte de imágenes de contenedor para Lambda](https://aws.amazon.com/blogs/aws/new-for-aws-lambda-container-image-support/) en el Blog AWS.