J'ai configuré ma fonction AWS Lambda pour traiter les messages dans une file d'attente Amazon Simple Queue Service (Amazon SQS). Certains de mes messages Amazon SQS valides sont reçus plusieurs fois jusqu'à la valeur maxReceiveCount et se retrouvent dans ma file d'attente de lettres mortes.
Brève description
Si votre fonction Lambda est limitée, renvoie une erreur ou ne répond pas lors de la lecture d'un lot de messages Amazon SQS, les messages retournent dans votre file d'attente. Une fois le délai de visibilité écoulé, votre fonction Lambda reçoit à nouveau le lot de messages. Si votre fonction ne parvient pas à traiter des messages valides à plusieurs reprises, Amazon SQS envoie les messages à votre file d’attente de lettres mortes, si vous en avez configuré une.
Pour éviter que des messages valides ne soient placés dans une file d'attente de lettres mortes, votre code de fonction doit être idempotent et capable de traiter des messages plusieurs fois. Pour en savoir plus, consultez la rubrique Comment empêcher un message Amazon SQS d'appeler ma fonction Lambda plusieurs fois ?
Résolution
Vérifiez que le code de votre fonction Lambda est idempotent
Pour connaître les meilleures pratiques en matière d'idempotence et des exemples de logique fonctionnelle, voir la rubrique Comment rendre ma fonction Lambda idempotente ?
Vérifiez que le délai de visibilité de votre file d'attente Amazon SQS est au moins six fois plus long que le paramètre de délai d'expiration de votre fonction Lambda
Définissez le délai de visibilité de votre file d’attente source pour qu’il soit au moins six fois plus long que le délai d'expiration de votre fonction. Le temps supplémentaire permet à votre fonction de réessayer de traiter un lot si la fonction est ralentie lors du traitement d'un lot précédent.
Pour en savoir plus, consultez la rubrique Définition du délai de visibilité du Guide du développeur Amazon SQS.
**Remarque :**si votre fonction ne reçoit pas de messages parce que le délai de visibilité de la file d'attente n'est pas suffisamment long, les messages ne seront pas enregistrés dans vos journaux Amazon CloudWatch.
Vérifiez que l'attribut MaxReceiveCount est défini sur au moins cinq dans la politique de redrive de votre file d'attente source
Définissez la valeur MaxReceiveCount sur la politique de redrive de la file d'attente source sur au moins cinq. Si votre fonction renvoie une erreur ou ne peut pas être invoquée pour cause de simultanéité maximale, le traitement pourrait aboutir après des tentatives supplémentaires. Un maxReceiveCount d'au moins cinq donne à vos messages plus de chances d'être traités avant qu'ils ne soient envoyés dans votre file d'attente de lettres mortes.
Pour mettre à jour la limite maximale de configuration de simultanéité, consultez la rubrique Configuration de la simultanéité maximale pour les sources d'événements Amazon SQS.
Pour en savoir plus, consultez l'article Comment fonctionnent les files d'attente contenant des lettres mortes ? et éviter le traitement incohérent des messages du Guide du développeur Amazon SQS.
Vérifiez la fonction Lambda à la recherche d’une limitation et d’une simultanéité réservée
Les fonctions Lambda sont parfois limitées pour protéger vos ressources et vos applications en aval. Même si Lambda s'adapte automatiquement au trafic entrant, votre fonction peut tout de même être limitée pour diverses raisons.
Utilisez la console Lambda pour vérifier le paramètre de simultanéité réservée. Si la simultanéité réservée n'est pas configurée, la fonction utilise la simultanéité non réservée. Lorsque les invocations avec des fonctions dépassent la simultanéité non réservée, une limitation se produit.
**Remarque :**si vous avez configuré une fonction sans accès simultané réservé, la fonction est limitée car elle ne peut traiter aucun événement. Veillez à augmenter la valeur jusqu'à un nombre supérieur à zéro.
Si d'autres fonctions de la même région AWS utilisent la limite de simultanéité, une limitation peut se produire. Les fonctions Lambda soumises à une limitation envoient les messages SQS vers la file d'attente des lettres mortes.
Évitez de retraiter tous les messages SQS d'un lot ayant échoué
Tous les messages SQS sont visibles dans la file d'attente de lettres mortes des fonctions Lambda rencontrant des erreurs lors du traitement d'un lot, y compris les messages traités avec succès par Lambda. Lambda réessaie ensuite l'ensemble du lot de messages SQS.
Pour éviter de retraiter tous les messages SQS d'un lot ayant échoué, configurez le mappage des sources d'événements avec la valeur ReportBatchItemFailures dans la liste FunctionResponseTypes. Vous permettrez ainsi à votre fonction de renvoyer un succès partiel et de réduire le nombre de nouvelles tentatives. Pour en savoir plus, consultez la rubrique Signaler les défaillances liées à un élément de lot.
Identifiez et résolvez les erreurs renvoyées par votre fonction Lambda
Suivez les instructions de la rubrique Comment dépanner les défaillances des fonctions Lambda ?Votre fonction supprime automatiquement les messages de votre file d'attente uniquement si elle ne renvoie pas d'erreur.
Informations connexes
Comment demander une augmentation de la limite de simultanéité pour ma fonction Lambda ?
Comment résoudre les problèmes de limitation des fonctions Lambda avec les erreurs « Taux dépassé » et 429 « TooManyRequestsException » ?