Utilisez la détection des boucles récursives Lambda pour empêcher les boucles infinies - AWS Lambda

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisez la détection des boucles récursives Lambda pour empêcher les boucles infinies

Lorsque vous configurez une fonction Lambda pour qu'elle envoie une sortie au même service ou à la même ressource que celui ou celle qui l'invoque, il est possible de créer une boucle récursive infinie. Par exemple, une fonction Lambda peut écrire un message dans une file d'attente Amazon Simple Queue Service SQS (Amazon), qui invoque ensuite la même fonction. Cette invocation amène la fonction à écrire un autre message dans la file d'attente, qui à son tour invoque à nouveau la fonction.

Les boucles récursives involontaires peuvent entraîner la facturation de frais imprévus à votre charge. Compte AWS Les boucles peuvent également entraîner la mise à l'échelle de Lambda et l'utilisation de toute la simultanéité disponible de votre compte. Pour aider à réduire l'impact des boucles involontaires, Lambda détecte certains types de boucles récursives peu après leur apparition. Par défaut, lorsque Lambda détecte une boucle récursive, il arrête l'appel de votre fonction et vous en informe. Si votre conception utilise intentionnellement des modèles récursifs, vous pouvez modifier la configuration par défaut d'une fonction pour lui permettre d'être invoquée de manière récursive. Pour plus d’informations, consultez Autoriser l'exécution d'une fonction Lambda dans une boucle récursive.

Comprendre la détection de boucles récursives

La détection de boucles récursives dans Lambda fonctionne en suivant les événements. Lambda est un service de calcul piloté par les événements qui exécute le code de votre fonction lorsque certains événements se produisent. Par exemple, lorsqu'un article est ajouté à une SQS file d'attente Amazon ou à une rubrique Amazon Simple Notification Service (AmazonSNS). Lambda transmet les événements à votre fonction sous forme JSON d'objets contenant des informations sur la modification de l'état du système. Lorsqu'un événement provoque l'exécution de votre fonction, cela s'appelle une invocation.

Pour détecter les boucles récursives, Lambda utilise des en-têtes de suivi AWS X-Ray. Lorsque les Services AWS qui prennent en charge cette la détection des boucles récursives envoient des événements à Lambda, ces événements sont automatiquement annotés avec des métadonnées. Lorsque votre fonction Lambda écrit l'un de ces événements dans une autre fonction prise en charge à Service AWS l'aide d'une version prise en charge de an AWS SDK, elle met à jour ces métadonnées. Les métadonnées mises à jour comprennent un décompte du nombre de fois où l'événement a invoqué la fonction.

Note

Il n'est pas nécessaire d'activer le suivi actif de X-Ray pour que cette fonctionnalité soit active. La détection des boucles récursives est activée par défaut pour tous les clients AWS . L'utilisation de cette fonctionnalité est gratuite.

Une chaîne de requêtes est une séquence d'invocations Lambda provoquée par le même événement déclencheur. Par exemple, imaginez qu'une SQS file d'attente Amazon appelle votre fonction Lambda. Votre fonction Lambda renvoie ensuite l'événement traité à la même SQS file d'attente Amazon, qui invoque à nouveau votre fonction. Dans cet exemple, chaque invocation de votre fonction appartient à la même chaîne de requêtes.

Si votre fonction est invoquée environ 16 fois dans la même chaîne de requêtes, Lambda arrête automatiquement l'appel de fonction suivant dans cette chaîne de demandes et vous en informe. Si votre fonction est configurée avec plusieurs déclencheurs, les invocations provenant d'autres déclencheurs ne sont pas affectées.

Note

Même lorsque le maxReceiveCount paramètre de la politique de redrive de la file d'attente source est supérieur à 16, la protection récursive Lambda n'empêche pas SQS Amazon de réessayer le message après la détection et l'arrêt d'une boucle récursive. Lorsque Lambda détecte une boucle récursive et interrompt les invocations suivantes, il renvoie une RecursiveInvocationException au mappage des sources d'événements. Cela augmente la receiveCount valeur du message. Lambda continue de réessayer le message et de bloquer les appels de fonctions jusqu'à ce qu'SQSAmazon détermine que maxReceiveCount le délai est dépassé et envoie le message à la file d'attente de lettres mortes configurée.

Si vous avez configuré une destination en cas d'échec ou une file d'attente de lettres mortes pour votre fonction, Lambda envoie également l'événement de l'invocation arrêtée vers votre destination ou votre file d'attente de lettres mortes. Lorsque vous configurez une file d'attente de destination ou de lettre morte pour votre fonction, veillez à ne pas utiliser de SNS rubrique Amazon ou de SQS file d'attente Amazon que votre fonction utilise également comme déclencheur d'événement ou comme mappage de source d'événement. Si vous envoyez des événements à la même ressource qui invoque votre fonction, vous pouvez créer une autre boucle récursive.

Pris en charge Services AWS et SDKs

Lambda ne peut détecter que les boucles récursives dont certaines sont prises en charge. Services AWS Pour que les boucles récursives soient détectées, votre fonction doit également utiliser l'une des boucles prises en charge AWS SDKs.

Soutenu Services AWS

Lambda détecte actuellement les boucles récursives entre vos fonctions, Amazon, Amazon SQS S3 et Amazon. SNS Lambda détecte également les boucles composées uniquement de fonctions Lambda, qui peuvent s'invoquer de manière synchrone ou asynchrone. Les schémas suivants montrent quelques exemples de boucles que Lambda peut détecter :

Schémas de boucles récursives entre une fonction Lambda, Amazon, SNS Amazon S3 et une file d'attente AmazonSQS.

Lorsqu'une autre Service AWS , telle qu'Amazon DynamoDB, fait partie de la boucle, Lambda ne peut actuellement pas la détecter ni l'arrêter.

Comme Lambda ne détecte actuellement que les boucles récursives impliquant Amazon, Amazon SQS S3 et AmazonSNS, il est toujours possible que les boucles impliquant d'autres Services AWS boucles entraînent une utilisation involontaire de vos fonctions Lambda.

Pour éviter que des frais imprévus ne vous soient facturés Compte AWS, nous vous recommandons de configurer les CloudWatchalarmes Amazon pour vous avertir des habitudes d'utilisation inhabituelles. Par exemple, vous pouvez configurer pour vous CloudWatch avertir des pics de simultanéité ou d'invocation des fonctions Lambda. Vous pouvez également configurer une alarme de facturation pour vous avertir lorsque les dépenses sur votre compte dépassent un seuil que vous avez spécifié. Vous pouvez également utiliser AWS Cost Anomaly Detectionpour vous alerter en cas de schémas de facturation inhabituels.

Soutenu AWS SDKs

Pour que Lambda détecte les boucles récursives, votre fonction doit utiliser l'une des SDK versions suivantes ou supérieures :

Environnement d’exécution AWS SDKVersion minimale requise

Node.js

2.1147.0 (SDKversion 2)

3.105.0 (SDKversion 3)

Python

1.24.46 (boto3)

1.27.46 (botocore)

Java 8 et Java 11

2,17135

Java 17

2,20,81

Java 21

2,21,24

.NET

3,7,293,0

Ruby

3,134,0

PHP

3,232,0

Go

SDKV2 (utiliser la dernière version)

Certains environnements d'exécution Lambda tels que Python et Node.js incluent une version du. AWS SDK Si la SDK version incluse dans le runtime de votre fonction est inférieure à la version minimale requise, vous pouvez ajouter une version prise en charge SDK au package de déploiement de votre fonction. Vous pouvez également ajouter une SDK version prise en charge à votre fonction à l'aide d'une couche Lambda. Pour obtenir la liste des composants SDKs inclus dans chaque environnement d'exécution Lambda, consultez. Environnements d’exécution (runtimes) Lambda

Notifications de boucles récursives

Lorsque Lambda arrête une boucle récursive, vous recevez des notifications le AWS Health Dashboard et par e-mail. Vous pouvez également utiliser CloudWatch des métriques pour surveiller le nombre d'appels récursifs interrompus par Lambda.

AWS Health Dashboard notifications

Lorsque Lambda arrête un appel récursif, une notification s' AWS Health Dashboard affiche sur la page de santé de votre compte, sous Problèmes ouverts et récents. Notez qu'il peut s'écouler jusqu'à trois heures après l'arrêt d'une invocation récursive par Lambda avant que cette notification ne s'affiche. Pour plus d'informations sur l'affichage des événements du compte dans le AWS Health Dashboard, consultez Getting started with your AWS Health Dashboard — Your account health dans le AWS Health User Guide.

Alertes par e-mail

Lorsque Lambda arrête pour la première fois une invocation récursive de votre fonction, il vous envoie une alerte par e-mail. Lambda envoie au maximum un e-mail toutes les 24 heures pour chaque fonction de votre Compte AWS. Une fois que Lambda a envoyé une notification par e-mail, vous ne recevrez plus d'e-mails pour cette fonction pendant 24 heures, même si Lambda arrête d'autres invocations récursives de la fonction. Notez qu'il peut s'écouler jusqu'à trois heures après l'arrêt d'une invocation récursive par Lambda avant que vous ne receviez cette alerte par e-mail.

Lambda envoie des alertes par e-mail en boucle récursive au contact principal Compte AWS de votre compte et au contact opérationnel alternatif. Pour plus d'informations sur l'affichage ou la mise à jour des adresses e-mail de votre compte, consultez la section Mise à jour des informations de contact dans la Référence générale AWS .

CloudWatch Métriques Amazon

La CloudWatch métrique RecursiveInvocationsDropped enregistre le nombre d'invocations de fonctions que Lambda a arrêtées parce que votre fonction a été invoquée plus de 16 fois environ au cours d'une même chaîne de requêtes. Lambda émet cette métrique dès qu'il arrête une invocation récursive. Pour afficher cette métrique, suivez les instructions relatives à l'affichage des métriques sur la CloudWatch console et choisissez la métriqueRecursiveInvocationsDropped.

Répondre aux notifications de détection de boucles récursives

Lorsque votre fonction est invoquée plus de 16 fois environ par le même événement déclencheur, Lambda arrête l'appel de fonction suivant pour cet événement afin de rompre la boucle récursive. Pour éviter qu'une boucle récursive interrompue par Lambda ne se reproduise, procédez comme suit :

  • Réduisez la simultanéité disponible de votre fonction à zéro, ce qui limite toutes les invocations futures.

  • Supprimez ou désactivez le déclencheur ou le mappage des sources d'événements qui invoque votre fonction.

  • Identifiez et corrigez les défauts de code qui réécrivent les événements dans la AWS ressource qui appelle votre fonction. Une source fréquente de défauts survient lorsque vous utilisez des variables pour définir la source et la cible des événements d'une fonction. Vérifiez que vous n'utilisez pas la même valeur pour les deux variables.

En outre, si la source d'événements de votre fonction Lambda est une SQS file d'attente Amazon, envisagez de configurer une file d'attente de lettres mortes dans la file d'attente source.

Note

Veillez à configurer la file d’attente de lettres mortes sur la file d’attente source, non sur la fonction Lambda. La file d’attente de lettres mortes que vous configurez dans une fonction est utilisée pour la file d’attente d’invocation asynchrone et non pour les files d’attente source d’événement.

Si la source de l'événement est un SNS sujet Amazon, pensez à ajouter une destination en cas d'échec pour votre fonction.

Pour réduire à zéro la simultanéité disponible de votre fonction (console)
  1. Ouvrez la page Functions (Fonctions) de la console Lambda.

  2. Choisissez le nom de votre fonction .

  3. Choisissez Limiter.

  4. Dans la boîte de dialogue Limiter votre fonction, choisissez Confirmer.

Pour supprimer un déclencheur ou un mappage des sources d'événements pour votre fonction (console)
  1. Ouvrez la page Functions (Fonctions) de la console Lambda.

  2. Choisissez le nom de votre fonction .

  3. Choisissez l'onglet Configuration, puis Déclencheurs.

  4. Sous Déclencheurs, sélectionnez le déclencheur ou le mappage des sources d'événements que vous souhaitez supprimer, puis choisissez Supprimer.

  5. Dans la boîte de dialogue Supprimer des déclencheurs, choisissez Supprimer.

Pour désactiver un mappage des sources d'événements pour votre fonction (AWS CLI)
  1. Pour trouver le UUID mappage des sources d'événements que vous souhaitez désactiver, exécutez la list-event-source-mappingscommande AWS Command Line Interface (AWS CLI).

    aws lambda list-event-source-mappings
  2. Pour désactiver le mappage des sources d'événements, exécutez la AWS CLI update-event-source-mappingcommande suivante.

    aws lambda update-event-source-mapping --function-name MyFunction \ --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 --no-enabled

Autoriser l'exécution d'une fonction Lambda dans une boucle récursive

Si votre conception utilise intentionnellement une boucle récursive, vous pouvez configurer une fonction Lambda pour permettre son appel récursif. Nous vous recommandons d'éviter d'utiliser des boucles récursives dans votre conception. Les erreurs de mise en œuvre peuvent entraîner des appels récursifs utilisant toutes les données disponibles simultanément et des frais imprévus facturés sur votre Compte AWS compte.

Important

Si vous utilisez des boucles récursives, traitez-les avec prudence. Mettez en œuvre des garde-fous conformes aux meilleures pratiques afin de minimiser les risques d'erreurs de mise en œuvre. Pour en savoir plus sur les meilleures pratiques relatives à l'utilisation de modèles récursifs, consultez la section Modèles récursifs qui provoquent des fonctions Lambda incontrôlables dans Serverless Land.

Vous pouvez configurer des fonctions pour autoriser les boucles récursives à l'aide de la console Lambda, AWS Command Line Interface du AWS CLI() et du. PutFunctionRecursionConfigAPI Vous pouvez également configurer le paramètre de détection de boucle récursive d'une fonction dans AWS SAM et AWS CloudFormation.

Par défaut, Lambda détecte et arrête les boucles récursives. À moins que votre conception n'utilise intentionnellement une boucle récursive, nous vous recommandons de ne pas modifier la configuration par défaut de vos fonctions.

Notez que lorsque vous configurez une fonction pour autoriser les boucles récursives, la CloudWatch métrique RecursiveInvocationsDropped n'est pas émise.

Console
Pour autoriser l'exécution d'une fonction dans une boucle récursive (console)
  1. Ouvrez la page Functions (Fonctions) de la console Lambda.

  2. Choisissez le nom de votre fonction pour ouvrir la page détaillée de la fonction.

  3. Choisissez l'onglet Configuration, puis sélectionnez Concurrence et détection de récursivité.

  4. À côté de Détection de boucle récursive, choisissez Modifier.

  5. Sélectionnez Autoriser les boucles récursives.

  6. Choisissez Save (Enregistrer).

AWS CLI

Vous pouvez utiliser le PutFunctionRecursionConfigAPIpour permettre à votre fonction d'être invoquée dans une boucle récursive. Spécifiez Allow le paramètre de boucle récursive. Par exemple, vous pouvez appeler cela API avec la put-function-recursion-config AWS CLI commande :

aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Allow

Vous pouvez rétablir la configuration par défaut de votre fonction afin que Lambda mette fin aux boucles récursives lorsqu'il les détecte. Modifiez la configuration de votre fonction à l'aide de la console Lambda ou du. AWS CLI

Console
Pour configurer une fonction de manière à ce que les boucles récursives soient interrompues (console)
  1. Ouvrez la page Functions (Fonctions) de la console Lambda.

  2. Choisissez le nom de votre fonction pour ouvrir la page détaillée de la fonction.

  3. Choisissez l'onglet Configuration, puis sélectionnez Concurrence et détection de récursivité.

  4. À côté de Détection de boucle récursive, choisissez Modifier.

  5. Sélectionnez Terminer les boucles récursives.

  6. Choisissez Save (Enregistrer).

AWS CLI

Vous pouvez utiliser le PutFunctionRecursionConfigAPIpour configurer votre fonction afin que Lambda mette fin aux boucles récursives lorsqu'il les détecte. Spécifiez Terminate le paramètre de boucle récursive. Par exemple, vous pouvez appeler cela API avec la put-function-recursion-config AWS CLI commande :

aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Terminate

Régions prises en charge pour la détection des boucles récursives Lambda

La détection de boucle récursive Lambda est prise en charge dans ce qui suit. Régions AWS

  • USA Est (Virginie du Nord)

  • USA Est (Ohio)

  • USA Ouest (Californie du Nord)

  • USA Ouest (Oregon)

  • Afrique (Le Cap)

  • Asie-Pacifique (Hong Kong)

  • Asia Pacific (Mumbai)

  • Asie-Pacifique (Osaka)

  • Asia Pacific (Seoul)

  • Asie-Pacifique (Singapour)

  • Asie-Pacifique (Sydney)

  • Asie-Pacifique (Tokyo)

  • Canada (Centre)

  • Europe (Francfort)

  • Europe (Irlande)

  • Europe (Londres)

  • Europe (Milan)

  • Europe (Paris)

  • Europe (Stockholm)

  • Moyen-Orient (Bahreïn)

  • Amérique du Sud (Sao Paulo)