Entorno de ejecución de AWS Lambda - AWS Lambda

Entorno de ejecución de AWS Lambda

Lambda invoca la función en un entorno de ejecución, que proporciona un entorno en tiempo de ejecución seguro y aislado. El entorno de ejecución administra los recursos necesarios para ejecutar la función. El entorno de ejecución también proporciona compatibilidad del ciclo de vida para el tiempo de ejecución de la función y cualquier extensión externa asociada a la función.

El tiempo de ejecución de la función de Lambda se comunica con mediante la API de tiempo de ejecución. Las extensiones se comunican con Lambda mediante la API de extensiones. Las extensiones también pueden recibir mensajes de registro de la función mediante la suscripción a registros mediante la API de registros.


            Diagrama de arquitectura del entorno de ejecución.

Al crear una función de Lambda, se debe especificar información de configuración, como la cantidad de memoria y el tiempo máximo de ejecución asignados a su función. Lambda utiliza esta información para configurar el entorno de ejecución.

El tiempo de ejecución de la función y cada extensión externa son procesos que se ejecutan dentro del entorno de ejecución. Los permisos, recursos, credenciales y variables de entorno se comparten entre la función y las extensiones.

Ciclo de vida del entorno de ejecución de Lambda

El ciclo de vida del entorno de ejecución incluye las siguientes fases:

  • Init: durante esta fase, Lambda crea o descongela un entorno de ejecución con los recursos que ha configurado, descarga el código de función y todas las capas, inicializa las extensiones, inicializa el tiempo de ejecución y ejecuta el código de inicialización de la función (el código fuera del controlador principal). La fase Init ocurre durante la primera invocación, o antes de las invocaciones de función si ha habilitado simultanidad aprovisionada.

    La fase Init se divide en tres subfases: Extension init, Runtime init y Function init. Estas subfases garantizan que todas las extensiones y el tiempo de ejecución completen sus tareas de configuración antes de que se ejecute el código de función.

  • Invoke: en esta fase, Lambda invoca el controlador de funciones. Después de que la función se ejecuta hasta su finalización, Lambda se prepara para manejar otra invocación de función.

  • Shutdown: esta fase se activa si la función Lambda no recibe ninguna invocación durante un período de tiempo. En la fase Shutdown, Lambda apaga el tiempo de ejecución, alerta a las extensiones para que se detengan limpiamente y, a continuación, elimina el entorno. Lambda envía un evento Shutdown a cada extensión, lo que indica a la extensión que el entorno está a punto de cerrarse.


            A la fase Init le siguen una o más invocaciones de función. Cuando no hay solicitudes de invocación, Lambda inicia la fase SHutdown.

Cada fase comienza con un evento que Lambda envía al tiempo de ejecución y a todas las extensiones registradas. El tiempo de ejecución y cada extensión registrada indica la finalización mediante el envío de una solicitud API Next. Lambda congela el entorno de ejecución cuando el tiempo de ejecución y cada extensión se han completado y no hay eventos pendientes.

Fase "init"

En la fase Init, Lambda realiza tres tareas:

  • Comenzar todas las extensiones (Extension init)

  • Bootstrap del tiempo de ejecución (Runtime init)

  • Ejecutar el código estático de la función (Function init)

La fase Init finaliza cuando el tiempo de ejecución y todas las extensiones señalan que están listas mediante el envío de una solicitud Next a la API. La fase Init está limitada a 10 segundos. Si las tres tareas no se completan en 10 segundos, Lambda vuelve a intentar la fase Init en el momento de la primera invocación de la función.

Fase "invoke"

Cuando se invoca una función de Lambda en respuesta a una solicitud API Next, Lambda envía un evento Invoke al tiempo de ejecución y a cada extensión.

La configuración de tiempo de espera de la función limita la duración de toda la fase Invoke. Por ejemplo, si establece el tiempo de espera de la función en 360 segundos, la función y todas las extensiones deben completarse en 360 segundos. Tenga en cuenta que no hay una fase posterior a "invoke" independiente. La duración es la suma de todo el tiempo de invocación (tiempo de ejecución + extensiones) y no se calcula hasta que la función y todas las extensiones han terminado la ejecución.

La fase "invoke" finaliza después de que el tiempo de ejecución y todas las extensiones indiquen que se han terminado mediante el envío de una solicitud Next a la API.

Si la función Lambda se bloquea o agota el tiempo de espera durante la fase Invoke, Lambda restablece el entorno de ejecución. El restablecimiento se comporta como un evento Shutdown. Primero, Lambda apaga el tiempo de ejecución. Después Lambda envía un evento Shutdown a cada extensión externa registrada. El evento incluye el motivo del apagado. Si otro evento Invoke da como resultado la reutilización de este entorno de ejecución, Lambda inicializa el tiempo de ejecución y las extensiones como parte de la siguiente invocación.

nota

El restablecimiento de Lambda no borra el contenido del directorio /tmp antes de la siguiente fase de inicio. Este comportamiento es coherente con la fase de apagado regular.


            Esta es mi imagen.

Fase "shutdown"

Cuando Lambda está a punto de cerrar el tiempo de ejecución, envía un evento Shutdown a cada extensión externa registrada. Las extensiones pueden utilizar este tiempo para las tareas de limpieza finales. El evento Shutdown es una respuesta a una solicitud Next a la API.

Duración: toda la fase Shutdown está limitada a 2 segundos. Si el tiempo de ejecución o cualquier extensión no responde, Lambda lo termina a través de una señal (SIGKILL).

Después de que la función y todas las extensiones se hayan completado, Lambda mantiene el entorno de ejecución durante algún tiempo en previsión de otra invocación de función. En efecto, Lambda congela el entorno de ejecución. Cuando se invoca de nuevo la función, Lambda descongela el entorno para su reutilización. La reutilización del entorno de ejecución tiene las siguientes implicaciones:

  • Los objetos declarados fuera del método del controlador de la función permanecen inicializados, lo que proporciona una optimización adicional cuando la función se invoca de nuevo. Por ejemplo, si la función de Lambda establece una conexión con una base de datos, en lugar de volver a establecer la conexión, se utiliza la conexión original en posteriores invocaciones. Le recomendamos que agregue lógica al código para comprobar si existe una conexión antes de crear una nueva.

  • Cada entorno de ejecución proporciona de 512 MB a 10 240 MB en incrementos de 1 MB de espacio en disco en el directorio de /tmp. El contenido del directorio se conserva al congelar el entorno de ejecución, proporcionando una caché transitoria que se puede utilizar para varias invocaciones. Puede agregar código adicional para comprobar si la caché dispone de los datos que se almacenaron. Para obtener más información sobre los límites de tamaño de implementación, consulte Cuotas de Lambda.

  • Los procesos en segundo plano o devoluciones de llamada iniciados por la función de Lambda y no completados cuando la función finalizó se reanudan si reutiliza el entorno de ejecución. Asegúrese de que los procesos en segundo plano o las devoluciones de llamada del código se completen antes de que este finalice.

Cuando escriba el código de la función, no presuponga que Lambda reutiliza automáticamente el entorno de ejecución para las siguientes invocaciones de la función. Otros factores pueden dictar la necesidad de que Lambda cree un nuevo entorno de ejecución, lo que puede producir resultados inesperados, como errores de conexión a la base de datos.