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.
Gestion des erreurs pour une source d’événements SQS dans Lambda
Pour gérer les erreurs liées à une source d’événement SQS, Lambda utilise automatiquement une stratégie de nouvelle tentative associée à une stratégie de backoff. Vous pouvez également personnaliser le comportement de gestion des erreurs en configurant votre mappage des sources d’événements SQS de manière à renvoyer des réponses par lots partielles.
Stratégie d’interruption pour les invocations ayant échoué
Lorsqu’une invocation échoue, Lambda tente de réessayer l’invocation tout en mettant en œuvre une stratégie d’interruption. La stratégie d’interruption diffère légèrement selon que Lambda a rencontré l’échec à cause d’une erreur dans votre code de fonction, ou à cause de la limitation.
-
Si votre code de fonction est à l'origine de l'erreur, Lambda arrête le traitement et réessaie l'invocation. Dans le même temps, Lambda réduit progressivement les tentatives en diminuant la quantité de simultanéité allouée à votre mappage des sources d’événements Amazon SQS. Une fois le délai de visibilité de votre file d'attente expiré, le message réapparaît dans la file d'attente.
-
Si l’invocation échoue en raison d’une limitation, Lambda réduit progressivement les tentatives en diminuant la quantité de simultanéité allouée à votre mappage des sources d’événements Amazon SQS. Lambda continue à réessayer le message jusqu’à ce que l’horodatage du message dépasse le délai de visibilité de votre file d’attente, auquel cas Lambda abandonne le message.
Mise en œuvre de réponses partielles de lot
Lorsque votre fonction Lambda rencontre une erreur lors du traitement d’un lot, tous les messages de ce lot redeviennent par défaut visibles dans la file d’attente, y compris les messages traités avec succès par Lambda. Par conséquent, votre fonction peut finir par traiter le même message plusieurs fois.
Pour éviter de retraiter les messages traités avec succès d’un lot en échec, vous pouvez configurer le mappage des sources d’événements pour que seuls les messages ayant échoué soient à nouveau visibles. C’est ce que l’on appelle une réponse partielle de lot. Pour activer les réponses partielles par lots, spécifiez l'FunctionResponseTypesaction ReportBatchItemFailures à effectuer lors de la configuration de votre mappage de sources d'événements. Avec ce paramètre, votre fonction peut renvoyer un succès partiel, ce qui peut contribuer à réduire le nombre de nouvelles tentatives inutiles sur les enregistrements.
Note
L'utilitaire Batch Processor de Powertools pour AWS Lambda gère automatiquement toute la logique de réponse partielle par lots. Cet utilitaire simplifie la mise en œuvre de modèles de traitement par lots et réduit le code personnalisé nécessaire pour gérer correctement les échecs d’éléments de lots. Il est disponible pour Python, Java, TypeScript et .NET.
Lorsque ReportBatchItemFailures est activé, Lambda ne réduit pas la taille de l’interrogation des messages lorsque les invocations de fonctions échouent. Si vous vous attendez à ce que certains messages échouent et que vous ne voulez pas que ces échecs aient un impact sur le taux de traitement des messages, utilisez ReportBatchItemFailures.
Note
Gardez les points suivants à l’esprit lorsque vous utilisez des réponses partielles de lot :
-
Si la fonction génère une exception, l’ensemble du lot est considéré comme un échec complet.
-
Si vous utilisez cette fonctionnalité avec une file d’attente FIFO, votre fonction doit arrêter le traitement des messages après le premier échec et renvoyer tous les messages échoués et non traités dans
batchItemFailures. Cela permet de préserver l’ordre des messages dans votre file d’attente.
Pour activer les rapports partiels de lot
-
Consultez les bonnes pratiques pour la mise en œuvre des réponses partielles de lot.
-
Exécutez la commande suivante pour activer
ReportBatchItemFailurespour votre fonction. Pour récupérer l'UUID de votre mappage de sources d'événements, exécutez la commande https://docs.aws.amazon.com/cli/latest/reference/lambda/list-event-source-mappings.html AWS CLI list-event-source-mappings.aws lambda update-event-source-mapping \ --uuid"a1b2c3d4-5678-90ab-cdef-11111EXAMPLE"\ --function-response-types"ReportBatchItemFailures" -
Mettez à jour le code de votre fonction afin de capturer toutes les exceptions et de renvoyer les messages d’échec dans une réponse JSON
batchItemFailures. La réponsebatchItemFailuresdoit inclure une liste d’identifiants de message, sous forme de valeurs JSONitemIdentifier.Supposons par exemple que vous avez un lot de cinq messages avec des identifiants de message
id1,id2,id3,id4etid5. Votre fonction traite avec succèsid1,id3etid5. Pour rendre les messagesid2etid4visibles de nouveau dans la file d’attente, votre fonction doit renvoyer la réponse suivante :{ "batchItemFailures": [ { "itemIdentifier": "id2" }, { "itemIdentifier": "id4" } ] }Voici quelques exemples de codes de fonctions qui renvoient la liste des identifiants des messages ayant échoué dans le lot :
Si les événements ayant échoué ne sont pas renvoyés dans la file d'attente, voir Comment résoudre les problèmes liés à la fonction Lambda SQS ? ReportBatchItemFailures
Conditions de réussite et d’échec
Lambda traite un lot comme un succès complet si votre fonction renvoie l’un des éléments suivants :
-
Une liste
batchItemFailuresvide -
Une liste
batchItemFailuresnulle -
Une
EventResponsevide -
Une
EventResponsenulle
Lambda traite un lot comme un échec complet si votre fonction renvoie l’un des éléments suivants :
-
Une réponse JSON non valide
-
Une chaîne
itemIdentifiervide -
Un
itemIdentifiernul -
Un
itemIdentifieravec un nom de clé incorrect -
Une valeur
itemIdentifieravec un ID de message inexistant
CloudWatch métriques
Pour déterminer si votre fonction signale correctement les défaillances d'articles par lots, vous pouvez surveiller les métriques NumberOfMessagesDeleted et ApproximateAgeOfOldestMessage Amazon SQS sur Amazon CloudWatch.
-
NumberOfMessagesDeletedsuit le nombre de messages supprimés de votre file d’attente. Si cela tombe à 0, cela indique que la réponse de votre fonction ne renvoie pas correctement les messages d’échec. -
ApproximateAgeOfOldestMessagesuit combien de temps le message le plus ancien est resté dans votre file d’attente. Une forte augmentation de cette métrique peut indiquer que votre fonction ne renvoie pas correctement les messages d’échec.
Utilisation de Powertools pour AWS Lambda processeur par lots
L'utilitaire de traitement par lots de Powertools gère AWS Lambda automatiquement la logique de réponse partielle par lots, réduisant ainsi la complexité de la mise en œuvre des rapports de défaillance par lots. Voici des exemples d’utilisation de l’utilitaire de traitement par lots :
- Python
-
Note
Pour des exemples complets et des instructions de configuration, consultez la documentation de l’utilitaire de traitement par lots.
Traitement des messages Amazon SQS à l'aide d'un processeur AWS Lambda par lots.
import json from aws_lambda_powertools import Logger from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType, process_partial_response from aws_lambda_powertools.utilities.data_classes import SQSEvent from aws_lambda_powertools.utilities.typing import LambdaContext processor = BatchProcessor(event_type=EventType.SQS) logger = Logger() def record_handler(record): logger.info(record) # Your business logic here # Raise an exception to mark this record as failed def lambda_handler(event, context: LambdaContext): return process_partial_response( event=event, record_handler=record_handler, processor=processor, context=context ) - TypeScript
-
Note
Pour des exemples complets et des instructions de configuration, consultez la documentation de l’utilitaire de traitement par lots.
Traitement des messages Amazon SQS à l'aide d'un processeur AWS Lambda par lots.
import { BatchProcessor, EventType, processPartialResponse } from '@aws-lambda-powertools/batch'; import { Logger } from '@aws-lambda-powertools/logger'; import type { SQSEvent, Context } from 'aws-lambda'; const processor = new BatchProcessor(EventType.SQS); const logger = new Logger(); const recordHandler = async (record: any): Promise<void> => { logger.info('Processing record', { record }); // Your business logic here // Throw an error to mark this record as failed }; export const handler = async (event: SQSEvent, context: Context) => { return processPartialResponse(event, recordHandler, processor, { context, }); };