Entorno de ejecución de Lambda - AWS Lambda

Entorno de ejecución de 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 y otros datos de telemetría de la función mediante la API de telemetría.

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

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)

  • Ejecute cualquier enlace en tiempo beforeCheckpoint de ejecución (solo Lambda SnapStart )

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 con el tiempo de espera de la función configurado.

Si Lambda SnapStart está activada, la fase Init ocurre cuando publica una versión de la función. Lambda guarda una instantánea del estado de la memoria y del disco del entorno de ejecución iniciado, conserva la instantánea cifrada y la almacena en caché para acceder a ella con baja latencia. Si tiene un enlace de tiempo de ejecución beforeCheckpoint, el código se ejecuta al final de la fase Init.

nota

El tiempo de espera de 10 segundos no se aplica a las funciones que utilizan la simultaneidad aprovisionada o. SnapStart En el caso de la simultaneidad y SnapStart las funciones aprovisionadas, el código de inicialización puede durar hasta 15 minutos. El límite de tiempo es de 130 segundos o el tiempo de espera de la función configurado (máximo de 900 segundos), lo que sea mayor.

Cuando utiliza la simultaneidad aprovisionada, Lambda inicializa el entorno de ejecución al configurar los ajustes del equipo para una función. Lambda también garantiza que los entornos de ejecución inicializados se encuentren siempre disponibles antes de las invocaciones. Es posible que vea intervalos entre las fases de inicialización e invocación de la función. Dependiendo del tiempo de ejecución y la configuración de memoria de su función, es posible que también vea variabilidad de latencia en la primera invocación en un entorno de ejecución inicializado.

En el caso de las funciones que utilizan la simultaneidad bajo demanda, Lambda puede, en ocasiones, inicializar los entornos de ejecución antes de las solicitudes de invocación. Cuando esto ocurre, también puede observar un intervalo de tiempo entre las fases de inicialización e invocación de la función. Se recomienda que no dependa de este comportamiento.

Errores durante la fase Init

Si una función se bloquea o agota el tiempo de espera durante la fase Init, Lambda emite la información sobre el error en el registro INIT_REPORT.

ejemplo — Registro INIT_REPORT para el tiempo de espera
INIT_REPORT Init Duration: 1236.04 ms Phase: init Status: timeout
ejemplo — Registro INIT_REPORT para un error en la extensión
INIT_REPORT Init Duration: 1236.04 ms Phase: init Status: error Error Type: Extension.Crash

Si la Init fase se realiza correctamente, Lambda no emite el INIT_REPORT registro, a menos que esté activada. SnapStart SnapStart las funciones siempre se emiten. INIT_REPORT Para obtener más información, consulte Supervisión de Lambda SnapStart.

Fase de restauración (solo Lambda SnapStart )

Cuando se invoca una SnapStartfunción por primera vez y a medida que la función se amplía, Lambda reanuda los nuevos entornos de ejecución a partir de la instantánea persistente en lugar de inicializar la función desde cero. Si tiene un enlace de tiempo de ejecución afterRestore(), el código se ejecuta al final de la fase Restore. Se le cobrará por la duración de los enlaces de tiempo de ejecución afterRestore(). El tiempo de ejecución (JVM) debe cargarse, y los enlaces del tiempo de ejecución afterRestore() deben completarse antes de que transcurra el tiempo de espera (10 segundos). De lo contrario, obtendrá un. SnapStartTimeoutException Cuando se completa la fase Restore, Lambda invoca el controlador de funciones (la fase Fase "invoke").

Errores durante la fase de Restauración

Si la fase Restore falla, Lambda emite la información sobre el error en el registro RESTORE_REPORT.

ejemplo — Registro RESTORE_REPORT para el tiempo de espera
RESTORE_REPORT Restore Duration: 1236.04 ms Status: timeout
ejemplo — Registro RESTORE_REPORT para errores en el enlace del tiempo de ejecución
RESTORE_REPORT Restore Duration: 1236.04 ms Status: error Error Type: Runtime.ExitError

Para obtener más información sobre el registro RESTORE_REPORT, consulte Supervisión de Lambda SnapStart.

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.

Errores durante la fase Invoke

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 siguiente diagrama ilustra el comportamiento del entorno de ejecución de Lambda cuando se produce un error de invocación:

En el diagrama anterior:

  • La primera fase es la fase INIT, que se ejecuta sin errores.

  • La segunda fase es la fase INVOKE, que se ejecuta sin errores.

  • En algún punto, supongamos que la función tiene un error de invocación (como un error de tiempo de espera de función o de tiempo de ejecución). La tercera fase, denominada INVOKE WITH ERROR, ilustra este escenario. Cuando esto sucede, el servicio de Lambda efectúa un reinicio. El restablecimiento se comporta como un evento Shutdown. Primero, Lambda apaga el tiempo de ejecución, luego envía un evento Shutdown a cada extensión externa registrada. El evento incluye el motivo del apagado. Si este entorno se utiliza para una nueva invocación, Lambda reinicia la extensión y el tiempo de ejecución juntos 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.

  • La cuarta fase representa la fase de INVOKE que sigue de inmediato a un error de invocación. Aquí, Lambda vuelve a inicializar el entorno al volver a ejecutar la fase INIT. Esto se denomina inicio suprimido. Cuando se suprimen los inicios, Lambda no informa explícitamente de una fase de INICIO adicional en los registros. CloudWatch En cambio, puede observar que la duración de la línea INFORME incluye una duración INIT adicional + la duración de INVOKE. Por ejemplo, supongamos que ve los siguientes registros: CloudWatch

    2022-12-20T01:00:00.000-08:00 START RequestId: XXX Version: $LATEST 2022-12-20T01:00:02.500-08:00 END RequestId: XXX 2022-12-20T01:00:02.500-08:00 REPORT RequestId: XXX Duration: 3022.91 ms Billed Duration: 3000 ms Memory Size: 512 MB Max Memory Used: 157 MB

    En este ejemplo, la diferencia entre las marcas de tiempo de INFORME e INICIO es de 2,5 segundos. Esto no coincide con la duración reportada de 3022,91 milisegundos, porque no tiene en cuenta el tiempo INIT adicional (inicio suprimido) que realizó Lambda. En este ejemplo, puede inferir que la fase de INVOKE real tardó 2,5 segundos.

    Para obtener más información sobre este comportamiento, puede utilizar la API de telemetría de Lambda. La API de telemetría emite eventos de INIT_START, INIT_RUNTIME_DONE y INIT_REPORT con phase=invoke siempre que se supriman inicializaciones entre las fases de invocación.

  • La quinta fase representa la fase SHUTDOWN, que se ejecuta sin errores.

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 entre 512 MB y 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.