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.
La gestion des erreurs pour les mappages des sources d’événements DynamoDB n’est pas la même selon si l’erreur se produit avant que la fonction ne soit invoquée ou pendant l’invocation de la fonction :
-
Avant l'appel : si un mappage de source d'événement Lambda ne parvient pas à appeler la fonction en raison d'un ralentissement ou d'autres problèmes, il réessaie jusqu'à ce que les enregistrements expirent ou dépassent l'âge maximum configuré sur le mappage de source d'événement (). MaximumRecordAgeInSeconds
-
Pendant l'appel : si la fonction est invoquée mais renvoie une erreur, Lambda réessaie jusqu'à ce que les enregistrements expirent, dépassent l'âge maximum MaximumRecordAgeInSeconds() ou atteignent le quota de tentatives configuré (). MaximumRetryAttempts Pour les erreurs de fonctionnement, vous pouvez également configurer BisectBatchOnFunctionError, ce qui divise un lot défaillant en deux lots plus petits, isolant ainsi les mauvais enregistrements et évitant les délais d'attente. Le fractionnement des lots ne consomme pas le quota de nouvelles tentatives.
Si les mesures de gestion des erreurs échouent, Lambda ignore les enregistrements et poursuit le traitement des lots du flux. Avec les paramètres par défaut, cela signifie qu’un enregistrement défectueux peut bloquer le traitement sur la partition affectée pendant jusqu’à une journée. Pour éviter cela, configurez le mappage de source d’événement de votre fonction avec un nombre raisonnable de nouvelles tentatives et un âge maximum d’enregistrement correspondant à votre cas d’utilisation.
Configuration des destinations pour les invocations ayant échoué
Pour retenir les enregistrements des invocations de mappage de sources d’événements qui ont échoué, ajoutez une destination au mappage des sources d’événements de votre fonction. Chaque enregistrement envoyé à la destination est un document JSON contenant les métadonnées sur l’invocation ayant échoué. Pour les destinations Amazon S3, Lambda envoie également l’intégralité de l’enregistrement d’invocation avec les métadonnées. Vous pouvez configurer n’importe quelle rubrique Amazon SNS, n’importe quelle file d’attente Amazon SQS ou n’importe quel compartiment S3 comme destination.
Avec les destinations Amazon S3, vous pouvez utiliser la fonctionnalité Notifications d’événements Amazon S3 pour recevoir des notifications lorsque des objets sont chargés dans votre compartiment S3 de destination. Vous pouvez également configurer les notifications d’événements S3 pour invoquer une autre fonction Lambda afin d’effectuer un traitement automatique des lots ayant échoué.
Votre rôle d’exécution doit disposer d’autorisations pour la destination :
-
Pour les destinations SQS : sqs : SendMessage
-
Pour les destinations SNS : sns:Publish
-
Pour les destinations du compartiment S3 : s3 : PutObject et s3 : ListBucket
Si vous avez activé le chiffrement avec votre propre clé KMS pour une destination S3, le rôle d'exécution de votre fonction doit également être autorisé à appeler kms : GenerateDataKey. Si la clé KMS et la destination du compartiment S3 se trouvent dans un compte différent de celui de votre fonction Lambda et de votre rôle d'exécution, configurez la clé KMS pour qu'elle approuve le rôle d'exécution à autoriser. kms: GenerateDataKey
Pour configurer une destination en cas de panne à l’aide de la console, procédez comme suit :
Ouvrez la page Functions
(Fonctions) de la console Lambda. -
Choisissez une fonction.
-
Sous Function overview (Vue d’ensemble de la fonction), choisissez Add destination (Ajouter une destination).
-
Pour Source, choisissez Invocation du mappage des sources d’événements.
-
Pour le mappage des sources d’événements, choisissez une source d’événements configurée pour cette fonction.
-
Pour Condition, sélectionnez En cas d’échec. Pour les invocations de mappage des sources d’événements, il s’agit de la seule condition acceptée.
-
Pour Type de destination, choisissez le type de destination auquel Lambda envoie les enregistrements d’invocation.
-
Pour Destination, choisissez une ressource.
-
Choisissez Save (Enregistrer).
Vous pouvez également configurer une destination en cas de panne à l'aide de AWS Command Line Interface (AWS CLI). Par exemple, la create-event-source-mappingMyFunction
aws lambda create-event-source-mapping \ --function-name "MyFunction" \ --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525 \ --destination-config '{"OnFailure": {"Destination": "arn:aws:sqs:us-east-1:123456789012:dest-queue"}}'
La update-event-source-mapping
aws lambda update-event-source-mapping \ --uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \ --maximum-retry-attempts 2 \ --maximum-record-age-in-seconds 3600 \ --destination-config '{"OnFailure": {"Destination": "arn:aws:sns:us-east-1:123456789012:dest-topic"}}'
Les paramètres mis à jour sont appliqués de façon asynchrone et ne sont pas reflétés dans la sortie tant que le processus n’est pas terminé. Utilisez la commande get-event-source-mapping
Pour supprimer une destination, entrez une chaîne vide comme argument du paramètre destination-config
:
aws lambda update-event-source-mapping \ --uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \ --destination-config '{"OnFailure": {"Destination": ""}}'
Pratiques exemplaires en matière de sécurité pour les destinations Amazon S3
La suppression d’un compartiment S3 configuré comme destination sans supprimer la destination de la configuration de votre fonction peut engendrer un risque de sécurité. Si un autre utilisateur connaît le nom de votre compartiment de destination, il peut recréer le compartiment dans son Compte AWS. Les enregistrements des invocations ayant échoué seront envoyés dans son compartiment, exposant potentiellement les données de votre fonction.
Avertissement
Pour vous assurer que les enregistrements d'invocation de votre fonction ne peuvent pas être envoyés vers un compartiment S3 d'un autre Compte AWS, ajoutez une condition au rôle d'exécution de votre fonction qui limite s3:PutObject
les autorisations aux compartiments de votre compte.
L’exemple suivant présente une politique IAM qui limite les autorisations s3:PutObject
de votre fonction aux seuls compartiments de votre compte. Cette politique donne également à Lambda l’autorisation s3:ListBucket
dont il a besoin pour utiliser un compartiment S3 comme destination.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3BucketResourceAccountWrite",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::*/*",
"Condition": {
"StringEquals": {
"s3:ResourceAccount": "111122223333"
}
}
}
]
}
Pour ajouter une politique d'autorisations au rôle d'exécution de votre fonction à l'aide du AWS Management Console or AWS CLI, reportez-vous aux instructions des procédures suivantes :
Pour ajouter une politique d’autorisations au rôle d’exécution d’une fonction (console)
Ouvrez la page Functions
(Fonctions) de la console Lambda. -
Sélectionnez la fonction Lambda dont vous voulez modifier le rôle d’exécution.
-
Sous l’onglet Configuration, sélectionnez Autorisations.
-
Sous l’onglet Rôle d’exécution, sélectionnez le Nom du rôle de votre fonction pour ouvrir la page de console IAM du rôle.
-
Ajoutez une politique d’autorisations de au rôle en procédant comme suit :
-
Dans le volet Politiques d’autorisations, choisissez Ajouter des autorisations, puis Créer une politique en ligne.
-
Dans l’Éditeur de politique, sélectionnez JSON.
-
Collez la politique que vous souhaitez ajouter dans l’éditeur (en remplacement du JSON existant), puis choisissez Suivant.
-
Sous Détails de la politique, saisissez un Nom de la politique.
-
Choisissez Create Policy (Créer une politique).
-
Exemple d’enregistrement d’invocation Amazon SNS et Amazon SQS
L’exemple suivant illustre un enregistrement d’invocation que Lambda envoie à une destination SQS ou SNS pour un flux DynamoDB.
{
"requestContext": {
"requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81",
"functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction",
"condition": "RetryAttemptsExhausted",
"approximateInvokeCount": 1
},
"responseContext": {
"statusCode": 200,
"executedVersion": "$LATEST",
"functionError": "Unhandled"
},
"version": "1.0",
"timestamp": "2019-11-14T00:13:49.717Z",
"DDBStreamBatchInfo": {
"shardId": "shardId-00000001573689847184-864758bb",
"startSequenceNumber": "800000000003126276362",
"endSequenceNumber": "800000000003126276362",
"approximateArrivalOfFirstRecord": "2019-11-14T00:13:19Z",
"approximateArrivalOfLastRecord": "2019-11-14T00:13:19Z",
"batchSize": 1,
"streamArn": "arn:aws:dynamodb:us-east-2:123456789012:table/mytable/stream/2019-11-14T00:04:06.388"
}
}
Vous pouvez utiliser ces informations pour récupérer les enregistrements concernés à partir du flux à des fins de résolution de problèmes. Les enregistrements réels n’étant pas inclus, vous devez les récupérer du flux avant qu’ils expirent et soient perdus.
Exemple d’enregistrement d’invocation Amazon S3
L’exemple suivant illustre un enregistrement d’invocation que Lambda envoie à un compartiment S3 pour un flux DynamoDB. Outre tous les champs de l’exemple précédent pour les destinations SQS et SNS, le champ payload
contient l’enregistrement d’invocation d’origine sous forme de chaîne JSON échappée.
{
"requestContext": {
"requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81",
"functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction",
"condition": "RetryAttemptsExhausted",
"approximateInvokeCount": 1
},
"responseContext": {
"statusCode": 200,
"executedVersion": "$LATEST",
"functionError": "Unhandled"
},
"version": "1.0",
"timestamp": "2019-11-14T00:13:49.717Z",
"DDBStreamBatchInfo": {
"shardId": "shardId-00000001573689847184-864758bb",
"startSequenceNumber": "800000000003126276362",
"endSequenceNumber": "800000000003126276362",
"approximateArrivalOfFirstRecord": "2019-11-14T00:13:19Z",
"approximateArrivalOfLastRecord": "2019-11-14T00:13:19Z",
"batchSize": 1,
"streamArn": "arn:aws:dynamodb:us-east-2:123456789012:table/mytable/stream/2019-11-14T00:04:06.388"
},
"payload": "<Whole Event>" // Only available in S3
}
L’objet S3 contenant l’enregistrement d’invocation utilise la convention de dénomination suivante :
aws/lambda/<ESM-UUID>/<shardID>/YYYY/MM/DD/YYYY-MM-DDTHH.MM.SS-<Random UUID>