Utilisation de Lambda avec Amazon SQS - 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.

Utilisation de Lambda avec Amazon SQS

Note

Si vous souhaitez envoyer des données à une cible autre qu'une fonction Lambda ou enrichir les données avant de les envoyer, consultez Amazon EventBridge Pipes.

Vous pouvez utiliser une fonction Lambda pour traiter les messages dans une file d'attente Amazon Simple Queue Service SQS (Amazon). Lambda prend en charge à la fois les files d'attente standard et les files d'attentepremier entré, premier sorti (FIFO) pour les mappages de sources d'événements. La fonction Lambda et la SQS file d'attente Amazon doivent être identiques Région AWS, bien qu'elles puissent être différentes. Comptes AWS

Comprendre le comportement d'interrogation et de traitement par lots pour les mappages de sources SQS d'événements Amazon

Avec les mappages de sources d'SQSévénements Amazon, Lambda interroge la file d'attente et appelle votre fonction de manière synchrone avec un événement. Chaque événement peut contenir un lot de plusieurs messages provenant de la file d'attente. Lambda reçoit ces événements un lot à la fois et appelle votre fonction une fois pour chaque lot. Après que la fonction a traité un lot avec succès, Lambda supprime ses messages de la file d’attente.

Lorsque Lambda reçoit un lot, les messages restent dans la file d'attente mais sont masqués pendant la durée du délai de visibilité de la file d'attente. Si votre fonction traite correctement tous les messages du lot, Lambda les supprime de la file d'attente. Par défaut, si votre fonction rencontre une erreur lors du traitement d'un lot, tous les messages de ce lot redeviennent visibles dans la file d'attente une fois le délai de visibilité expiré. Pour cette raison, le code de votre fonction peut traiter le même message plusieurs fois sans effets secondaires involontaires.

Avertissement

Les mappages de sources d'événements Lambda traitent chaque événement au moins une fois, et le traitement des enregistrements peut être dupliqué. Pour éviter les problèmes potentiels liés à des événements dupliqués, nous vous recommandons vivement de rendre votre code de fonction idempotent. Pour en savoir plus, consultez Comment rendre ma fonction Lambda idempotente dans le Knowledge Center. AWS

Pour empêcher Lambda de traiter un message plusieurs fois, vous pouvez soit configurer le mappage de votre source d'événements pour inclure les défaillances d'éléments de lot dans la réponse de votre fonction, soit utiliser le DeleteMessageAPIpour supprimer les messages de la file d'attente lorsque votre fonction Lambda les traite correctement.

Pour plus d'informations sur les paramètres de configuration pris en charge par Lambda pour les mappages de sources d'SQSévénements, consultez. Création d'un mappage des sources d'SQSévénements

Exemple d’événement de message de file d’attente standard

Exemple Événement de SQS message Amazon (file d'attente standard)
{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" }, { "messageId": "2e1424d4-f796-459a-8184-9c92662be6da", "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082650636", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082650649" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" } ] }

Par défaut, Lambda interroge jusqu’à 10 messages à la fois dans votre file d’attente, et envoie ce lot à votre fonction. Pour éviter d'invoquer la fonction avec un petit nombre d'enregistrements, vous pouvez configurer la source d'événements pour qu'elle mette en mémoire tampon les enregistrements pendant 5 minutes maximum en configurant une fenêtre de traitement par lots. Avant d'appeler la fonction, Lambda continue d'interroger les messages de la file d'attente standard jusqu'à ce que la fenêtre de traitement par lots expire, que le quota de charge utile d'appel soit atteint ou que la taille de lot maximale configurée soit atteinte.

Si vous utilisez une fenêtre de traitement par lots et que votre SQS file d'attente contient un trafic très faible, Lambda peut attendre jusqu'à 20 secondes avant d'appeler votre fonction. C’est le cas même si vous définissez une fenêtre de lot inférieure à 20 secondes.

Note

En Java, vous pouvez rencontrer des erreurs de pointeur nul lors de la désérialisationJSON. Cela peut être dû à la façon dont les cases « Records » et « eventSource ARN » sont converties par le mappeur JSON d'objets.

Exemple FIFO d'événement de message de file d'attente

Pour les FIFO files d'attente, les enregistrements contiennent des attributs supplémentaires liés à la déduplication et au séquençage.

Exemple Événement de SQS message Amazon (FIFOfile d'attente)
{ "Records": [ { "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5", "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1573251510774", "SequenceNumber": "18849496460467696128", "MessageGroupId": "1", "SenderId": "AIDAIO23YVJENQZJOL4VO", "MessageDeduplicationId": "1", "ApproximateFirstReceiveTimestamp": "1573251510774" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo", "awsRegion": "us-east-2" } ] }