Utilice la detección de bucles recursivos de Lambda para evitar bucles infinitos - AWS Lambda

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 puede detectar ciertos tipos de bucles recursivos poco después de que se produzcan. 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 intencional, puede solicitar que se desactive la detección de bucles recursivos de Lambda. Para solicitar este cambio, póngase en contacto con AWS Support.

importante

Si su diseño utiliza una función de Lambda de forma intencional para volver a escribir datos en el mismo recurso de AWS que invoca la función, tenga cuidado e implemente las medidas de protección adecuadas para evitar que se facturen cargos inesperados en su Cuenta de AWS. Para obtener más información sobre las prácticas recomendadas para usar patrones de invocación recursiva, consulte Patrones recursivos que provocan funciones de Lambda descontroladas en Serverless Land.

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 más de 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

Cuando la configuración maxReceiveCount de la política de redrive 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 SDK de AWS compatibles.

Servicios de AWS admitidos

Por el momento, Lambda detecta bucles recursivos entre sus funciones, Amazon SQS 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 y una cola de Amazon SQS.

Por el momento, Lambda no puede detectar ni detener otro Servicio de AWS, como Amazon DynamoDB o Amazon Simple Storage Service (Amazon S3), cuando este forma parte del bucle.

Dado que por ahora Lambda solo detecta bucles recursivos que incluyan Amazon SQS 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.

SDK de AWS 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 SDK de AWS

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

1.12.200 (SDK versión 1)

2.17.135 (SDK versión 2)

Java 17

2.20.81

Java 21

2.21.24

.NET

3.7.293.0

Ruby

3.134.0

PHP

3.232.0

Algunos tiempos de ejecución de Lambda, como Python y Node.js, incluyen una versión del SDK de AWS. 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.

La detección de recursión de Lambda no es compatible con el tiempo de ejecución de Lambda Go.

Notificaciones de bucle recursivo

Cuando Lambda detiene un bucle recursivo, recibirá notificaciones por medio de AWS Health Dashboard y a través del correo electrónico. También puede usar las métricas de CloudWatch para supervisar la cantidad de invocaciones recursivas que ha detenido Lambda.

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. Tenga en cuenta que pueden pasar hasta tres horas después de que Lambda detenga una invocación recursiva antes de que se muestre esta notificación. Para obtener más información sobre cómo ver los eventos de la cuenta en AWS Health Dashboard, consulte Introducción al Panel de AWS Health: el estado de su cuenta en la Guía del usuario de AWS Health.

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 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, 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)
  1. Abra la página de Funciones en la consola de Lambda.

  2. Elija el nombre de su función.

  3. Elija Limitar.

  4. 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)
  1. Abra la página de Funciones en la consola de Lambda.

  2. Elija el nombre de su función.

  3. Elija la pestaña Configuración y, a continuación, seleccione Desencadenadores.

  4. En Desencadenadores, seleccione el desencadenador o la asignación de orígenes de eventos que desee eliminar y, a continuación, seleccione Eliminar.

  5. 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)
  1. 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
  2. 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 \ --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 --no-enabled