Pruebas de imágenes de contenedor Lambda en forma local - AWS Lambda

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.

Pruebas de imágenes de contenedor Lambda en forma local

Puede utilizar el emulador de interfaz de tiempo de ejecución de Lambda para probar de forma local una función de imagen de contenedor antes de subirla a Amazon Elastic Container Registry (Amazon ECR) e implementarla en Lambda. El emulador es un proxy para la Tiempos de ejecución de la API de Lambda. Es un servidor web ligero que convierte solicitudes HTTP en eventos JSON para pasarlos a la función de Lambda en la imagen de contenedor.

Las imágenes base de AWS y las imágenes base exclusivas del sistema operativo incluyen el emulador de interfaz de tiempo de ejecución. Si utiliza una imagen base alternativa, como una imagen de Alpine Linux o Debian, puede compilar el emulador en su imagen o instalarlo en su equipo local.

El emulador de interfaz de ejecución está disponible en el AWS GitHub repositorio. Existen paquetes distintos para las arquitecturas x86-64 y arm64.

Directrices para el uso del emulador de interfaz de tiempo de ejecución

Tenga en cuenta las siguientes directrices cuando use el emulador de interfaz de tiempo de ejecución:

  • El RIE no emula las configuraciones de seguridad y autenticación de Lambda, ni la orquestación de Lambda.

  • Lambda proporciona un emulador para cada una de las arquitecturas del conjunto de instrucciones.

  • El emulador no admite el seguimiento AWS X-Ray ni otras integraciones de Lambda.

Variables de entorno

El emulador de interfaz de tiempo de ejecución admite un subconjunto de variables de entorno para la función de Lambda en la imagen local en ejecución.

Si su función utiliza credenciales de seguridad, puede configurar las credenciales estableciendo las siguientes variables de entorno:

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN

  • AWS_DEFAULT_REGION

Para establecer el tiempo de espera de la función, configure AWS_LAMBDA_FUNCTION_TIMEOUT. Introduzca el número máximo de segundos que desea permitir que se ejecute la función.

El emulador no rellena las siguientes variables de entorno de Lambda. Sin embargo, puede configurarlos para que coincidan con los valores que espera cuando la función se ejecuta en el servicio de Lambda:

  • AWS_LAMBDA_FUNCTION_VERSION

  • AWS_LAMBDA_FUNCTION_NAME

  • AWS_LAMBDA_FUNCTION_MEMORY_SIZE

Prueba de imágenes creadas a partir de imágenes base de AWS

Las imágenes base AWS para Lambda incluyen el emulador de interfaz de tiempo de ejecución. Después de compilar la imagen de Docker, siga estos pasos para probarla de forma local.

  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.

  2. 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 Invoke-WebRequest comando:

    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"
  3. Obtenga el ID del contenedor.

    docker ps
  4. Use el comando docker kill para detener el contenedor. En este comando, reemplace 3766c4ab331c por el ID del contenedor del paso anterior.

    docker kill 3766c4ab331c

Prueba de imágenes compiladas a partir de imágenes base alternativas

Si utiliza una imagen base alternativa, como una imagen de Alpine Linux o Debian, puede compilar el emulador en su imagen o instalarlo en su equipo local.

Construcción del emulador de interfaz de tiempo de ejecución en una imagen

Para construir el emulador en su imagen
  1. Cree un script y guárdelo en el directorio del proyecto. Configure los permisos de ejecución para el archivo del script.

    El script verifica la presencia de la variable de entorno AWS_LAMBDA_RUNTIME_API, que indica la presencia de la API de tiempo de ejecución. Si la API de tiempo de ejecución está presente, el script ejecuta el cliente de interfaz de tiempo de ejecución. De lo contrario, el script ejecuta el emulador de interfaz de tiempo de ejecución.

    Elija un lenguaje para ver un script de ejemplo:

    Node.js

    En el siguiente ejemplo, /usr/local/bin/npx aws-lambda-ric es el comando npx para iniciar el cliente de interfaz de tiempo de ejecución de Node.js.

    ejemplo entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/local/bin/npx aws-lambda-ric $@ else exec /usr/local/bin/npx aws-lambda-ric $@ fi
    nota

    Si utiliza Windows, asegúrese de guardar el script con los finales de línea LF. Si el script usa CRLF, aparecerá un error similar al siguiente cuando intente ejecutar la imagen de Docker:

    exec /entry_script.sh: no such file or directory
    Python

    En el siguiente ejemplo, /usr/local/bin/python -m awslambdaric es el comando del intérprete de Python para ejecutar el cliente de interfaz de tiempo de ejecución de Python como un script.

    ejemplo entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/local/bin/python -m awslambdaric $@ else exec /usr/local/bin/python -m awslambdaric $@ fi
    nota

    Si utiliza Windows, asegúrese de guardar el script con los finales de línea LF. Si el script usa CRLF, aparecerá un error similar al siguiente cuando intente ejecutar la imagen de Docker:

    exec /entry_script.sh: no such file or directory
    Java

    En el siguiente ejemplo, /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda establece la ruta de clases para el cliente de interfaz de tiempo de ejecución de Java.

    ejemplo entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda $@ else exec /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda $@ fi
    nota

    Si utiliza Windows, asegúrese de guardar el script con los finales de línea LF. Si el script usa CRLF, aparecerá un error similar al siguiente cuando intente ejecutar la imagen de Docker:

    exec /entry_script.sh: no such file or directory
    Go

    En el siguiente ejemplo, /main es el binario que se compila durante la compilación de Docker.

    ejemplo entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /main $@ else exec /main $@ fi
    nota

    Si utiliza Windows, asegúrese de guardar el script con los finales de línea LF. Si el script usa CRLF, aparecerá un error similar al siguiente cuando intente ejecutar la imagen de Docker:

    exec /entry_script.sh: no such file or directory
    Ruby

    En el siguiente ejemplo, aws_lambda_ric es el cliente de interfaz de tiempo de ejecución de Ruby.

    ejemplo entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie aws_lambda_ric $@ else exec aws_lambda_ric $@ fi
    nota

    Si utiliza Windows, asegúrese de guardar el script con los finales de línea LF. Si el script usa CRLF, aparecerá un error similar al siguiente cuando intente ejecutar la imagen de Docker:

    exec /entry_script.sh: no such file or directory
  2. Descargue el emulador de interfaz de ejecución para su arquitectura de destino desde GitHub el directorio de su proyecto. Lambda proporciona un emulador para cada una de las arquitecturas del conjunto de instrucciones.

    Linux/macOS
    curl -Lo aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie \ && chmod +x aws-lambda-rie

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

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
    PowerShell
    Invoke-WebRequest -Uri https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie -OutFile aws-lambda-rie

    Para instalar el emulador arm64, reemplace el Uri con lo siguiente:

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
  3. Añada las siguientes líneas al Dockerfile. ENTRYPOINT incluye el script que ha creado en el paso 1 y su controlador de funciones.

    ejemplo líneas para agregar a Dockerfile

    En el siguiente ejemplo, reemplace lambda_function.handler con su controlador de funciones.

    COPY ./entry_script.sh /entry_script.sh RUN chmod +x /entry_script.sh ADD aws-lambda-rie /usr/local/bin/aws-lambda-rie ENTRYPOINT [ "/entry_script.sh","lambda_function.handler" ]
  4. Compile la imagen de Docker con el comando docker build. En el ejemplo siguiente se asigna un nombre a la imagen docker-image y se le asigna la etiqueta test.

    docker build --platform linux/amd64 -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.

  5. 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.

  6. 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 Invoke-WebRequest comando:

    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"
  7. Obtenga el ID del contenedor.

    docker ps
  8. Use el comando docker kill para detener el contenedor. En este comando, reemplace 3766c4ab331c por el ID del contenedor del paso anterior.

    docker kill 3766c4ab331c

Instalación local del emulador de la interfaz de tiempo de ejecución

Para instalar el emulador de interfaz de ejecución en su máquina local, descargue el paquete de la arquitectura que prefiera desde GitHub. A continuación, utilice el comando docker run para iniciar la imagen de contenedor y configurar el --entrypoint en el emulador. Para obtener más información, elija las instrucciones para el lenguaje que prefiera: