Creación de un tiempo de ejecución personalizado para AWS Lambda - AWS Lambda

Creación de un tiempo de ejecución personalizado para 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. El tiempo de ejecución se puede incluir en el paquete de implementación de la función o se puede distribuir en una capa. Cuando cree la función de Lambda, elija un tiempo de ejecución exclusivo del sistema operativo (la familia de tiempos de ejecución provided).

nota

La creación de un tiempo de ejecución personalizado es un caso de uso avanzado. Si busca información sobre la compilación en un binario nativo o el uso de un tiempo de ejecución estándar de terceros, consulte Cuándo utilizar los tiempos de ejecución exclusivos del sistema operativo de Lambda.

Para ver un recorrido por el proceso de implementación de un tiempo de ejecución personalizado, consulte Tutorial: Creació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.

Requisitos

Los tiempos de ejecución personalizados deben completar determinadas tareas de inicialización y procesamiento. El tiempo de ejecución ejecuta el código de configuración de la función, lee el nombre del controlador a partir de una variable de entorno y lee 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.

Tareas de inicialización

Las tareas de inicialización se ejecutan una vez por instancia de la función para preparar el entorno para gestionar invocaciones.

  • Retrieve settings (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.

    Para obtener una lista completa de variables disponibles, consulte Variables definidas de entorno de tiempo de ejecución.

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

  • Administración de 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 registro
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

Procesamiento de tareas

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.

  • Get an event (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.

  • Propagate the tracing header (Propagar el encabezado de rastreo): obtenga 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.

  • Create a context object (Crear un objeto context): cree un objeto con información de contexto a partir de las variables de entorno y los encabezados en la respuesta de la API.

  • Invoke the function handler (Invocar el controlador de la función): transfiera el evento y el objeto context al controlador.

  • Handle the response (Administrar la respuesta): llame a la API de respuesta de invocación para publicar la respuesta desde el controlador.

  • Handle errors (Administrar errores): si se produce un error, llamar a la API de error de invocación.

  • Cleanup (Limpiar): libere recursos no utilizados, envíe datos a otros servicios o realice tareas adicionales antes de obtener el siguiente evento.

Punto de entrada

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. Si la raíz del paquete de implementación no contiene un archivo con el nombre bootstrap, Lambda busca el archivo en las capas de la función. Si el archivo bootstrap no existe o no es ejecutable, la función devuelve el error Runtime.InvalidEntrypoint tras la invocación.

Este es un ejemplo de un archivo bootstrap que utiliza una versión empaquetada de Node.js para ejecutar un tiempo de ejecución de JavaScript en un archivo aparte llamado runtime.js.

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

Implementación de la transmisión de respuestas en un entorno de ejecución personalizado

Para las funciones de transmisión de respuestas, los puntos de conexión de response y error han modificado ligeramente su comportamiento, lo que permite que el tiempo de ejecución transmita respuestas parciales al cliente y devuelva las cargas en fragmentos. Para obtener más información sobre el comportamiento específico, consulte lo siguiente:

  • /runtime/invocation/AwsRequestId/response: propaga el encabezado Content-Type desde el tiempo de ejecución para enviarlo al cliente. Lambda devuelve la carga de respuesta en fragmentos mediante la codificación de transferencia fragmentada de HTTP/1.1. El tamaño máximo de transmisión de respuesta es de 20 MiB. Para transmitir la respuesta a Lambda, el tiempo de ejecución debe realizar lo siguiente:

    • Establecer el encabezado HTTP Lambda-Runtime-Function-Response-Mode en streaming.

    • Establezca el encabezado Transfer-Encoding en chunked.

    • Escribir la respuesta de acuerdo con la especificación de codificación de transferencia fragmentada de HTTP/1.1.

    • Cerrar la conexión subyacente después de que la respuesta se haya escrito correctamente.

  • /runtime/invocation/AwsRequestId/error: el tiempo de ejecución puede utilizar este punto de conexión para informar sobre errores de función o tiempo de ejecución a Lambda, que también acepta el encabezado Transfer-Encoding. Solo se puede llamar a este punto de conexión antes de que el tiempo de ejecución comience a enviar una respuesta de invocación.

  • Informe los errores intermedios mediante los tráileres de errores en /runtime/invocation/AwsRequestId/response: el tiempo de ejecución puede adjuntar opcionalmente los encabezados finales de HTTP con los nombres Lambda-Runtime-Function-Error-Type yLambda-Runtime-Function-Error-Body para informar sobre los errores que se producen después de haber empezado a escribir la respuesta de invocación. Lambda trata esto como una respuesta correcta y reenvía los metadatos de error proporcionados por el tiempo de ejecución al cliente.

    nota

    Para adjuntar encabezados finales, el tiempo de ejecución debe establecer el valor del encabezado Trailer al principio de la solicitud HTTP. Este es un requisito de la especificación de codificación de transferencia fragmentada de HTTP/1.1.

    • Lambda-Runtime-Function-Error-Type: el tipo de error que encontró el tiempo de ejecución. Este encabezado consta de un valor de cadena. Lambda acepta cualquier cadena, pero recomendamos un formato de <category.reason>. Por ejemplo, Runtime.APIKeyNotFound.

    • Lambda-Runtime-Function-Error-Body: información sobre el error codificada en Base64.