Tiempos de ejecución personalizados de AWS Lambda - AWS Lambda

Tiempos de ejecución personalizados de AWS Lambda

Puede implementar tiempos de ejecución de AWS Lambda con cualquier lenguaje de programación. El tiempo de ejecución es un programa que ejecuta un método de controlador de función de Lambda cuando se invoca la función. Puede incluir un tiempo de ejecución en el paquete de implementación de su función como un archivo ejecutable llamado bootstrap.

El tiempo de ejecución es responsable de ejecutar el código de configuración de la función, leer el nombre del controlador a partir de una variable de entorno y leer los eventos de invocación desde la API de tiempo de ejecución de Lambda. El tiempo de ejecución transfiere los datos de los eventos al controlador de la función y publica la respuesta desde el controlador de vuelta a Lambda.

Su tiempo de ejecución personalizado se ejecuta en el entorno de ejecución estándar de Lambda. Puede ser un script de shell, un script en un lenguaje incluido en Amazon Linux, o un archivo ejecutable binario compilado en Amazon Linux.

Para comenzar a utilizar tiempos de ejecución personalizados, consulte Tutorial: publicación de un tiempo de ejecución personalizado. También puede estudiar un tiempo de ejecución personalizado implementado en C++ en awslabs/aws-lambda-cpp en GitHub.

Uso de un tiempo de ejecución personalizado

Para utilizar un tiempo de ejecución personalizado, establezca el tiempo de ejecución de la función en provided. El tiempo de ejecución se puede incluir en el paquete de implementación de la función o en una capa.

ejemplo function.zip

. ├── bootstrap ├── function.sh

Si hay un archivo llamado bootstrap en el paquete de implementación, Lambda ejecuta ese archivo. De lo contrario, Lambda busca un tiempo de ejecución en el capas de la función. Si el no se encuentra archivo de arranque o no es ejecutable, la función devuelve un error tras la invocación.

Creación de un tiempo de ejecución personalizado

El punto de entrada de un tiempo de ejecución personalizado es un archivo ejecutable llamado bootstrap. El archivo de arranque puede ser el tiempo de ejecución o puede invocar otro archivo que cree el tiempo de ejecución. En el siguiente ejemplo se utiliza una versión empaquetada de Node.js para ejecutar un motor de ejecución de JavaScript en un archivo aparte llamado runtime.js.

ejemplo arranque

#!/bin/sh cd $LAMBDA_TASK_ROOT ./node-v11.1.0-linux-x64/bin/node runtime.js

Su código de tiempo de ejecución se encarga de completar algunas tareas de inicialización. Después procesa eventos de invocación en bucle hasta que se finaliza. Las tareas de inicialización se ejecutan una vez por instancia de la función para preparar el entorno para gestionar invocaciones.

Tareas de inicialización

  • Recuperar opciones de configuración–: leer variables de entorno para obtener detalles acerca de la función y el entorno.

    • _HANDLER–: la ubicación del controlador, a partir de la configuración de la función. El formato estándar es file.method, donde file es el nombre del archivo sin extensión, y method es el nombre de un método o una función que se define en el archivo.

    • LAMBDA_TASK_ROOT–: el directorio que contiene el código de la función.

    • AWS_LAMBDA_RUNTIME_API–: el host y el puerto de la API de tiempo de ejecución.

    Consulte en Variables definidas de entorno de tiempo de ejecución la lista completa de variables disponibles.

  • Inicializar la función–: cargar el archivo de controlador y ejecutar cualquier código global o estático en él. Las funciones deben crear los recursos estáticos, como clientes SDK y conexiones de bases de datos, una vez, y después volver a utilizarlos para varias invocaciones.

  • Gestionar errores–: si se produce un error, llamar a la API de error de inicialización y salir de forma inmediata.

La inicialización se tiene en cuenta al calcular el tiempo de ejecución y el tiempo de espera que se factura. Cuando una ejecución activa la inicialización de una nueva instancia de la función, puede ver el tiempo de inicialización en los registros y el rastreo de AWS X-Ray.

ejemplo log

REPORT RequestId: f8ac1208... Init Duration: 48.26 ms Duration: 237.17 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 26 MB

        Tiempo de inicialización en un rastreo de X-Ray.

Mientras se ejecuta, el tiempo de ejecución utiliza la interfaz de tiempo de ejecución de Lambda para administrar eventos entrantes e informar sobre errores. Después de completar las tareas de inicialización, el tiempo de ejecución procesa los eventos entrantes en bucle. En el código de tiempo de ejecución, realice los siguientes pasos en orden.

Procesamiento de tareas

  • Obtener un evento–: llamar a la API de la siguiente invocación para obtener el siguiente evento. El cuerpo de la respuesta contiene los datos del evento. Los encabezados de respuesta contienen el ID de la solicitud y otra información.

  • Propagar el encabezado de rastreo–: obtener el encabezado de rastreo de X-Ray desde el encabezado Lambda-Runtime-Trace-Id en la respuesta de la API. Establezca localmente la variable de entorno _X_AMZN_TRACE_ID con el mismo valor. El SDK de X-Ray utiliza este valor para conectar datos de rastreo entre servicios.

  • Crear un objeto context–: crear un objeto con información de contexto a partir de las variables de entorno y los encabezados en la respuesta de la API.

  • Invocar el controlador de la función–: transferir el evento y el objeto context al controlador.

  • Gestionar la respuesta–: llamar a la API de respuesta de invocación para publicar la respuesta desde el controlador.

  • Gestionar errores–: si se produce un error, llamar a la API de error de invocación.

  • Limpiar–: liberar recursos no utilizados, enviar datos a otros servicios o realizar tareas adicionales antes de obtener el siguiente evento.

Puede incluir el tiempo de ejecución del paquete de implementación de la función o distribuir el tiempo de ejecución aparte en una capa de función. Para ver un tutorial de ejemplo, consulte Tutorial: publicación de un tiempo de ejecución personalizado.