Utilice la detección de bucles recursivos de Lambda para evitar bucles infinitos
Cuando configura una función de Lambda para que se envíe al mismo servicio o recurso que invoca la función, es posible que se cree un bucle recursivo infinito. Por ejemplo, una función de Lambda puede escribir un mensaje en una cola de Amazon Simple Queue Service (Amazon SQS) y, a continuación, invocar la misma función. Esta invocación hace que la función escriba otro mensaje en la cola, que a su vez vuelve a invocar la función.
Los bucles recursivos involuntarios pueden hacer que se facturen cargos inesperados en su Cuenta de AWS. Los bucles también pueden hacer que Lambda escale y utilice toda la simultaneidad disponible en su cuenta. Para ayudar a reducir el impacto de los bucles involuntarios, Lambda detecta ciertos tipos de bucles recursivos poco después de que se produzcan. De forma predeterminada, cuando Lambda detecta un bucle recursivo, detiene la invocación de la función y se lo notifica. Si su diseño utiliza patrones recursivos de forma intencionada, puede cambiar la configuración predeterminada de una función para que se pueda invocar de forma recursiva. Para obtener más información, consulta Permiso para que una función de Lambda se ejecute en un bucle recursivo.
Secciones
- Descripción de la detección de bucles recursivos
- Servicios de AWS y SDK admitidos
- Notificaciones de bucle recursivo
- Cómo responder a las notificaciones de detección de bucles recursivos
- Permiso para que una función de Lambda se ejecute en un bucle recursivo
- Regiones en las que se admite la detección de bucles recursivos de Lambda
Descripción de la detección de bucles recursivos
La detección de bucles recursivos de Lambda funciona mediante el seguimiento de eventos. Lambda es un servicio de computación basado en eventos que ejecuta el código de una función cuando se producen ciertos eventos. Por ejemplo, cuando se agrega un elemento a una cola de Amazon SQS o a un tema de Amazon Simple Notification Service (Amazon SNS). Lambda pasa los eventos a la función como objetos JSON, que contienen información sobre el cambio en el estado del sistema. Cuando un evento hace que la función se ejecute, esto se denomina invocación.
Para detectar bucles recursivos, Lambda usa encabezados de seguimiento de AWS X-Ray. Cuando los Servicios de AWS que admiten la detección de bucles recursivos envían eventos a Lambda, esos eventos se anotan automáticamente con metadatos. Cuando la función de Lambda escribe uno de estos eventos en otro Servicio de AWS que admite una versión compatible de un SDK de AWS, se actualizan los metadatos. Los metadatos actualizados incluyen un recuento del número de veces que el evento ha invocado la función.
nota
No es necesario habilitar el seguimiento activo de X-Ray para que esta característica funcione. La detección de bucles recursivos está activada de forma predeterminada para todos los clientes de AWS. El uso de la característica es gratuito.
Una cadena de solicitudes es una secuencia de invocaciones de Lambda provocada por el mismo evento desencadenante. Por ejemplo, imagine que una cola de Amazon SQS invoca su función de Lambda. A continuación, la función de Lambda envía el evento procesado a la misma cola de Amazon SQS, que vuelve a invocar la función. En este ejemplo, cada invocación de la función se encuentra en la misma cadena de solicitudes.
Si su función se invoca aproximadamente 16 veces en la misma cadena de solicitudes, Lambda detiene automáticamente la siguiente invocación de la función en esa cadena de solicitudes y se lo notifica. Si la función está configurada con varios desencadenadores, las invocaciones de otros desencadenadores no se verán afectadas.
nota
Incluso cuando la configuración maxReceiveCount
de la política de redireccionamiento de la cola de origen es superior a 16, la protección contra la recursión de Lambda no impide que Amazon SQS vuelva a intentar el mensaje después de detectar y finalizar un bucle recursivo. Cuando Lambda detecta un bucle recursivo y descarta las invocaciones posteriores, devuelve un RecursiveInvocationException
a la asignación de orígenes de eventos. Esto aumenta el valor receiveCount
del mensaje. Lambda sigue reintentando el mensaje y sigue bloqueando las invocaciones de funciones hasta que Amazon SQS determine que maxReceiveCount
se ha superado y envía el mensaje a la cola de mensajes fallidos configurada.
Si tiene un destino en caso de error o una cola de mensajes fallidos configurados para su función, Lambda también envía el evento desde la invocación detenida a su destino o cola de mensajes fallidos. Cuando configura un destino o una cola de mensajes fallidos para su función, asegúrese de no usar un tema de Amazon SNS o una cola de Amazon SQS que su función también use como desencadenador de eventos o asignación de orígenes de eventos. Si envía eventos al mismo recurso que invoca su función, puede crear otro bucle recursivo.
Servicios de AWS y SDK admitidos
Lambda solo puede detectar bucles recursivos que incluyan ciertos Servicios de AWS admitidos. Para que se detecten bucles recursivos, la función también debe utilizar uno de los AWS SDK compatibles.
Servicios de AWS admitidos
Por el momento, Lambda detecta bucles recursivos entre sus funciones, Amazon SQS, Amazon S3 y Amazon SNS. Lambda también detecta bucles compuestos únicamente por funciones de Lambda, que pueden invocarse entre sí de forma sincrónica o asíncrona. En los siguientes diagramas, se muestran algunos ejemplos de bucles que Lambda puede detectar:
![Diagramas de bucles recursivos entre una función de Lambda, Amazon SNS, Amazon S3 y una cola de Amazon SQS.](images/RunawayWorkloadDetected_v3.png)
Por el momento, Lambda no puede detectar ni detener otro Servicio de AWS, como Amazon DynamoDB, cuando este forma parte del bucle.
Dado que, por ahora, Lambda solo detecta bucles recursivos que incluyan Amazon SQS, Amazon S3 y Amazon SNS, es posible que los bucles que incluyan otros Servicios de AWS puedan provocar un uso no deseado de las funciones de Lambda.
Para evitar que se le facturen cargos inesperados en su Cuenta de AWS, le recomendamos que configure las alarmas de Amazon CloudWatch para que le avisen sobre patrones de uso inusuales. Por ejemplo, puede configurar CloudWatch para que le notifique sobre picos en la simultaneidad o las invocaciones de las funciones de Lambda. También puede configurar una alarma de facturación para que le avise cuando el gasto en su cuenta supere el límite que especifique. También puede utilizar AWS Cost Anomaly Detection para recibir notificaciones sobre patrones de facturación inusuales.
AWS SDK admitidos
Para que Lambda detecte bucles recursivos, la función debe usar una de las siguientes versiones del SDK o una versión superior:
Tiempo de ejecución | Versión mínima requerida del AWS SDK |
---|---|
Node.js |
2.1147.0 (SDK versión 2) 3.105.0 (SDK versión 3) |
Python |
1.24.46 (boto3) 1.27.46 (botocore) |
Java 8 y Java 11 |
2.17.135 |
Java 17 |
2.20.81 |
Java 21 |
2.21.24 |
.NET |
3.7.293.0 |
Ruby |
3.134.0 |
PHP |
3.232.0 |
Go |
V2 SDK 1.57.0 |
Algunos tiempos de ejecución de Lambda, como Python y Node.js, incluyen una versión del AWS SDK. Si la versión del SDK incluida en el tiempo de ejecución de la función es inferior al mínimo requerido, puede agregar una versión compatible del SDK al paquete de despliegue de la función. También puede agregar una versión compatible del SDK a la función mediante una capa de Lambda. Para obtener una lista de los SDK incluidos en cada tiempo de ejecución de Lambda, consulte Tiempos de ejecución de Lambda.
Notificaciones de bucle recursivo
Cuando Lambda detiene un bucle recursivo, recibirá notificaciones por medio de AWS Health Dashboard
Notificaciones de AWS Health Dashboard
Cuando Lambda detiene una invocación recursiva, AWS Health Dashboard muestra una notificación en la página Estado de su cuenta, en Problemas abiertos y recientes
Alertas por correo electrónico
Cuando Lambda detiene por primera vez una invocación recursiva de su función, le envía una alerta por correo electrónico. Lambda envía un máximo de un correo electrónico cada 24 horas para cada función de su Cuenta de AWS. Después de que Lambda envíe una notificación por correo electrónico, no recibirá más correos electrónicos para esa función hasta dentro de 24 horas, incluso si Lambda detiene nuevas invocaciones recursivas de la función. Tenga en cuenta que pueden pasar hasta tres horas después de que Lambda detenga una invocación recursiva antes de que reciba esta alerta por correo electrónico.
Lambda envía alertas por correo electrónico sobre bucles recursivos al contacto de cuenta principal de su Cuenta de AWS y al contacto de operaciones alternativas. Para obtener información sobre cómo ver o actualizar las direcciones de correo electrónico de su cuenta, consulte Actualización de la información de contacto en la Referencia general de AWS.
Métricas de Amazon CloudWatch
La métrica de CloudWatch RecursiveInvocationsDropped
registra el número de invocaciones de funciones que Lambda ha detenido porque la función se ha invocado más de 16 veces aproximadamente en una sola cadena de solicitudes. Lambda emite esta métrica tan pronto como detiene una invocación recursiva. Para ver esta métrica, siga las instrucciones de Visualización de métricas en la consola de CloudWatch y elija la métrica RecursiveInvocationsDropped
.
Cómo responder a las notificaciones de detección de bucles recursivos
Cuando el mismo evento desencadenante invoca la función más de 16 veces aproximadamente, Lambda detiene la siguiente invocación de la función para que ese evento rompa el bucle recursivo. Para evitar que vuelva a aparecer un bucle recursivo que Lambda ha roto, haga lo siguiente:
-
Reduzca la simultaneidad disponible de la función a cero, lo que limita todas las invocaciones futuras.
-
Elimine o deshabilite el desencadenador o la asignación de orígenes de eventos que invoca su función.
-
Identifique y corrija los defectos del código que devuelven los eventos al recurso de AWS que invoca la función. Un origen común de defectos se produce cuando se utilizan variables para definir el origen y el destino de los eventos de una función. Compruebe que no está usando el mismo valor para ambas variables.
Además, si el origen de eventos de la función de Lambda es una cola de Amazon SQS, considere la posibilidad de configurar una cola de mensajes fallidos en la cola de origen.
nota
Asegúrese de configurar la cola de mensajes fallidos en la cola de origen y no en la función de Lambda. La cola de mensajes fallidos que configure en una función se utiliza para la cola de invocación asíncrona de la función, no para las colas de origen de eventos.
Si el origen del evento es un tema de Amazon SNS, considere agregar un destino en caso de error para su función.
Para reducir a cero la simultaneidad disponible de la función (consola)
Abra la página de Funciones
en la consola de Lambda. -
Elija el nombre de su función.
-
Elija Limitar.
-
En el cuadro de diálogo Limitar la función, seleccione Confirmar.
Para eliminar un desencadenador o una asignación de orígenes de eventos de la función (consola)
Abra la página de Funciones
en la consola de Lambda. -
Elija el nombre de su función.
-
Elija la pestaña Configuración y, a continuación, seleccione Desencadenadores.
-
En Desencadenadores, seleccione el desencadenador o la asignación de orígenes de eventos que desee eliminar y, a continuación, seleccione Eliminar.
-
En el cuadro de diálogo Eliminar desencadenadores, seleccione Eliminar.
Para deshabilitar una asignación de orígenes de eventos de la función (AWS CLI)
-
Para encontrar el UUID de la asignación de orígenes de eventos que desea deshabilitar, ejecute el comando de AWS Command Line Interface (AWS CLI) list-event-source-mappings
. aws lambda list-event-source-mappings
-
Para deshabilitar la asignación de orígenes de eventos, ejecute el siguiente comando de AWS CLI update-event-source-mapping
. aws lambda update-event-source-mapping --function-name
MyFunction
\ --uuida1b2c3d4-5678-90ab-cdef-EXAMPLE11111
--no-enabled
Permiso para que una función de Lambda se ejecute en un bucle recursivo
Si su diseño utiliza un bucle recursivo de forma intencionada, puede configurar una función de Lambda para que se pueda invocar de forma recursiva. Recomendamos que evite el uso de bucles recursivos en su diseño. Los errores de implementación pueden provocar invocaciones recursivas con toda la simultaneidad disponible de la Cuenta de AWS y hacer que se facturen cargos imprevistos a su cuenta.
importante
Si utiliza bucles recursivos, trátelos con precaución. Implemente las medidas de protección recomendadas para minimizar los riesgos de errores de implementación. Para obtener más información sobre las prácticas recomendadas para usar patrones recursivos, consulte Recursive patterns that cause run-away Lambda functions
Puede configurar funciones para permitir bucles recursivos mediante la consola de Lambda, la AWS Command Line Interface (AWS CLI) y la API PutFunctionRecursionConfig. También puede configurar el parámetro de detección de bucles recursivos de una función en AWS SAM y AWS CloudFormation.
De forma predeterminada, Lambda detecta y termina los bucles recursivos. A menos que su diseño utilice bucles recursivos de forma intencionada, le recomendamos que no cambie la configuración predeterminada de sus funciones.
Tenga en cuenta que cuando configura una función para permitir bucles recursivos, no se emite la métrica de CloudWatch RecursiveInvocationsDropped
.
Puede volver a cambiar la configuración de la función a la configuración predeterminada para que Lambda termine los bucles recursivos cuando los detecte. Edite la configuración de la función mediante la consola de Lambda o la AWS CLI.
Regiones en las que se admite la detección de bucles recursivos de Lambda
La detección de bucles recursivos de Lambda se admite en las siguientes Regiones de AWS.
-
Este de EE. UU. (Norte de Virginia)
-
Este de EE. UU. (Ohio)
-
Oeste de EE. UU. (Norte de California)
-
Oeste de EE. UU. (Oregón)
-
África (Ciudad del Cabo)
-
Asia-Pacífico (Hong Kong)
-
Asia-Pacífico (Yakarta)
-
Asia-Pacífico (Bombay)
-
Asia-Pacífico (Osaka)
-
Asia-Pacífico (Seúl)
-
Asia-Pacífico (Singapur)
-
Asia-Pacífico (Sídney)
-
Asia-Pacífico (Tokio)
-
Canadá (centro)
-
Europa (Fráncfort)
-
Europa (Irlanda)
-
Europa (Londres)
-
Europa (Milán)
-
Europa (París)
-
Europa (Estocolmo)
-
Medio Oriente (Baréin)
-
América del Sur (São Paulo)