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.
Utilisation de la détection de boucle récursive Lambda pour prévenir les boucles infinies
Lorsque vous configurez une fonction d'événement Lambda pour qu'elle soit envoyée au même service ou à la même ressource qui invoque la fonction, il est possible de créer une boucle récursive infinie. Par exemple, une fonction d'événement Lambda peut écrire un message dans une file d'attente Amazon Simple Queue Service (Amazon SQS), 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 réduire l’impact des boucles non intentionnelles, Lambda détecte certains types de boucles récursives peu de temps après leur apparition.
Par défaut, lorsque Lambda détecte une boucle récursive, il arrête l’invocation de votre fonction et vous en informe. Si votre conception utilise intentionnellement des schémas récursifs, vous pouvez modifier la configuration par défaut d’une fonction pour permettre à celle-ci d’être invoquée de manière récursive. Pour plus d’informations, consultez Autoriser l'exécution d'une fonction d'événement Lambda dans une boucle récursive.
Sections
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 élément est ajouté à une file d'attente Amazon SQS ou à une rubrique Amazon Simple Notification Service (Amazon SNS). Lambda transmet les événements à votre fonction sous forme d'objets JSON, qui contiennent des informations sur la modification d'é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 d'événement 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 d'un 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 X-Ray actif pour que cette fonctionnalité fonctionne. 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 file d'attente Amazon SQS invoque votre fonction d'événement Lambda. Votre fonction d'événement Lambda renvoie ensuite l'événement traité à la même file d'attente Amazon SQS, 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’invocation de fonction suivante dans cette chaîne de requêtes 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 paramètre maxReceiveCount de la politique de redirection de la file d’attente source est supérieur à 16, la protection contre la récursion Lambda n’empêche pas Amazon SQS 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 valeur receiveCount du message. Lambda continue de réessayer le message et de bloquer les invocations de fonctions jusqu’à ce qu’Amazon SQS détermine que le délai maxReceiveCount est dépassé et envoie le message à la file d’attente de lettres mortes configurée.
Si vous avez configuré une destination en cas de défaillance ou une file d'attente de lettres mortes pour votre fonction d'événement, Lambda envoie également l'événement depuis l'invocation interrompue vers votre destination ou votre file d'attente de lettres mortes. Lorsque vous configurez une file d’attente de destination ou une file d’attente de lettres mortes pour votre fonction, assurez-vous de ne pas utiliser un déclencheur d’événement ou mappage des sources d'événements que votre fonction utilise également. Si vous envoyez des événements à la même ressource qui appelle votre fonction, vous pouvez créer une autre boucle récursive et cette boucle sera également interrompue. Si vous désactivez la détection des boucles de récursivité, cette boucle n'est pas interrompue.
Pris en charge Services AWS et SDK
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 d'événement doit également utiliser l'un des AWS SDK pris en charge.
Pris en charge Services AWS
Lambda détecte actuellement les boucles récursives entre vos fonctions, Amazon SQS, Amazon S3, Amazon SNS et les bus d'événements Amazon Custom. EventBridge Lambda détecte également les boucles composées uniquement de fonctions d'événement Lambda, qui peuvent s'invoquer mutuellement de manière synchrone ou asynchrone. Les schémas suivants montrent quelques exemples de boucles que Lambda peut détecter :
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 des bus d'événements Amazon SQS, Amazon S3, Amazon SNS et EventBridge Amazon Custom, il est toujours possible que des boucles impliquant Services AWS d'autres bus entraînent une utilisation involontaire de votre fonction d'événement 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 d'événement 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.
Pris en charge AWS Kits SDK
Pour que Lambda détecte les boucles récursives, votre fonction doit utiliser l'une des versions suivantes ou plus récentes du kit SDK :
| Environnement d’exécution | Version minimale du AWS SDK requise |
|---|---|
|
Node.js |
2.1147.0 (kit SDK version 2) 3.105.0 (kit SDK version 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 |
SDK V2 1.57.0 |
Certains environnements d'exécution Lambda, tels que Python, Node.js incluent une version du SDK. AWS Si la version du kit SDK incluse dans l'exécution de votre fonction est inférieure au minimum requis, vous pouvez ajouter une version prise en charge du kit SDK au package de déploiement de votre fonction. Vous pouvez également ajouter une version du kit SDK compatible à votre fonction à l'aide d'une couche Lambda. Pour obtenir la liste des kits SDK inclus dans chaque exécution Lambda, consultez Exécutions de la fonction d'événement Lambda.
Notifications de boucles récursives
Lorsque Lambda arrête une boucle récursive, vous recevez des notifications le Tableau de bord Health
Tableau de bord Health notifications
Lorsque Lambda arrête un appel récursif, une notification s' Tableau de bord Health affiche sur la page de santé de votre compte, sous Problèmes ouverts
Alertes par e-mail
Lorsque Lambda arrête pour la première fois un appel récursif de votre fonction d'événement, 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 et demie 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 d'événement 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énement de votre fonction d'événement Lambda est une file d'attente Amazon SQS, envisagez de configurer une file d'attente de lettres mortes dans la file d'attente source.
Note
Assurez-vous de configurer la file d'attente contenant des lettres mortes sur la file d'attente source, et non sur la fonction d'événement 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 une rubrique Amazon SNS, pensez à ajouter une destination en cas d'échec pour votre fonction.
Pour réduire à zéro la simultanéité disponible de votre fonction événementielle (console)
Ouvrez la page Event Functions
de la console Lambda. -
Choisissez le nom de votre fonction événementielle.
-
Choisissez Limiter.
-
Dans la boîte de dialogue Limiter votre fonction, choisissez Confirmer.
Pour supprimer un déclencheur ou un mappage de source d'événement pour votre fonction d'événement (console)
Ouvrez la page Event Functions
de la console Lambda. -
Choisissez le nom de votre fonction événementielle.
-
Choisissez l'onglet Configuration, puis Déclencheurs.
-
Sous Déclencheurs, sélectionnez le déclencheur ou le mappage des sources d'événements que vous souhaitez supprimer, puis choisissez Supprimer.
-
Dans la boîte de dialogue Supprimer des déclencheurs, choisissez Supprimer.
Pour désactiver le mappage d'une source d'événement pour votre fonction d'événement (AWS CLI)
-
Pour trouver l'UUID du mappage des sources d'événements que vous souhaitez désactiver, exécutez la commande AWS Command Line Interface (AWS CLI) list-event-source-mappings
. aws lambda list-event-source-mappings -
Pour désactiver le mappage des sources d'événements, exécutez la commande AWS CLI update-event-source-mapping
suivante. aws lambda update-event-source-mapping --function-nameMyFunction\ --uuida1b2c3d4-5678-90ab-cdef-EXAMPLE11111--no-enabled
Autoriser l'exécution d'une fonction d'événement Lambda dans une boucle récursive
Si votre conception utilise intentionnellement une boucle récursive, vous pouvez configurer une fonction d'événement 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 barrières de protection conformes aux pratiques exemplaires afin de minimiser les risques d’erreurs de mise en œuvre. Pour en savoir plus sur les pratiques exemplaires en matière d’utilisation de modèles d’invocation récursifs, consultez Recursive patterns that cause run-away Lambda functions
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 PutFunctionRecursionConfigde l'API. Vous pouvez également configurer le paramètre de détection de boucle récursive d'une fonction dans AWS SAM et 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.
Vous pouvez rétablir la configuration par défaut de votre fonction d'événement 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 de l’ AWS CLI.
Régions prises en charge pour la détection des boucles récursives de Lambda
La détection par boucle récursive Lambda est prise en charge dans toutes les régions commerciales.