Didacticiel : utilisation d’AWS Lambda avec Amazon DynamoDB Streams
Dans ce didacticiel, vous allez créer une fonction Lambda afin d'utiliser des événements d'un flux Amazon DynamoDB.
Prérequis
Ce didacticiel suppose que vous avez quelques connaissances des opérations Lambda de base et de la console Lambda. Si ce n'est déjà fait, suivez les instructions fournies dans Créer une fonction Lambda à l'aide de la console pour créer votre première fonction Lambda.
Pour effectuer les étapes suivantes, vous avez besoin de l'AWS Command Line Interface (AWS CLI) version 2. Les commandes et la sortie attendue sont répertoriées dans des blocs distincts :
aws --version
Vous devriez voir la sortie suivante:
aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64
Pour les commandes longues, un caractère d'échappement (\
) est utilisé pour les fractionner en plusieurs lignes.
Sur Linux et macOS, utilisez votre gestionnaire de shell et de package préféré.
Note
Sous Windows, certaines commandes CLI Bash que vous utilisez couramment avec Lambda (par exemple zip
) ne sont pas prises en charge par les terminaux intégrés du système d'exploitation. Installez le sous-système Windows pour Linux
Créer le rôle d'exécution
Créez le rôle d'exécution qui donne à votre fonction l'autorisation d'accéder aux ressources AWS.
Pour créer un rôle d'exécution
-
Ouvrez la page Roles (Rôles)
dans la console IAM. -
Sélectionnez Créer un rôle.
-
Créez un rôle avec les propriétés suivantes :
-
Entité de confiance – Lambda.
-
Autorisations – AWSLambdaDynamoDBExecutionRole.
-
Nom de rôle –
lambda-dynamodb-role
.
-
Le rôle AWSLambdaDynamoDBExecutionRole possède les autorisations dont la fonction a besoin pour lire les éléments de DynamoDB et écrire des journaux dans CloudWatch Logs.
Créer la fonction
L'exemple de code suivant reçoit une entrée d'événement DynamoDB et traite les messages qu'elle contient. Par exemple, le code écrit certaines des données d'événement entrantes dans CloudWatch Logs.
Note
Pour obtenir des exemples en d'autres langages de programmation, consultez Exemple de code de fonction .
Exemple index.js
console.log('Loading function'); exports.handler = function(event, context, callback) { console.log(JSON.stringify(event, null, 2)); event.Records.forEach(function(record) { console.log(record.eventID); console.log(record.eventName); console.log('DynamoDB Record: %j', record.dynamodb); }); callback(null, "message"); };
Pour créer la fonction
-
Copiez l'exemple de code dans un fichier nommé
index.js
. -
Créez un package de déploiement.
zip function.zip index.js
-
Créez une fonction Lambda à l'aide de la commande
create-function
.aws lambda create-function --function-name ProcessDynamoDBRecords \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \ --role arn:aws:iam::
123456789012
:role/lambda-dynamodb-role
Test de la fonction Lambda
Dans cette étape, vous allez appeler la fonction Lambda manuellement à l'aide de la commande CLI invoke
AWS Lambda et l'exemple d'événement DynamoDB suivant.
Exemple input.txt
{ "Records":[ { "eventID":"1", "eventName":"INSERT", "eventVersion":"1.0", "eventSource":"aws:dynamodb", "awsRegion":"us-east-1", "dynamodb":{ "Keys":{ "Id":{ "N":"101" } }, "NewImage":{ "Message":{ "S":"New item!" }, "Id":{ "N":"101" } }, "SequenceNumber":"111", "SizeBytes":26, "StreamViewType":"NEW_AND_OLD_IMAGES" }, "eventSourceARN":"stream-ARN" }, { "eventID":"2", "eventName":"MODIFY", "eventVersion":"1.0", "eventSource":"aws:dynamodb", "awsRegion":"us-east-1", "dynamodb":{ "Keys":{ "Id":{ "N":"101" } }, "NewImage":{ "Message":{ "S":"This item has changed" }, "Id":{ "N":"101" } }, "OldImage":{ "Message":{ "S":"New item!" }, "Id":{ "N":"101" } }, "SequenceNumber":"222", "SizeBytes":59, "StreamViewType":"NEW_AND_OLD_IMAGES" }, "eventSourceARN":"stream-ARN" }, { "eventID":"3", "eventName":"REMOVE", "eventVersion":"1.0", "eventSource":"aws:dynamodb", "awsRegion":"us-east-1", "dynamodb":{ "Keys":{ "Id":{ "N":"101" } }, "OldImage":{ "Message":{ "S":"This item has changed" }, "Id":{ "N":"101" } }, "SequenceNumber":"333", "SizeBytes":38, "StreamViewType":"NEW_AND_OLD_IMAGES" }, "eventSourceARN":"stream-ARN" } ] }
Exécutez la commande suivante invoke
.
aws lambda invoke --function-name ProcessDynamoDBRecords --payload file://input.txt outputfile.txt
L'option cli-binary-format est obligatoire si vous utilisez AWS CLI version 2. Pour faire de ce paramètre le paramètre par défaut, exécutez aws configure set cli-binary-format raw-in-base64-out
. Pour plus d'informations, veuillez consulter les AWS CLI options de ligne de commande.
La fonction renvoie la chaîne message
dans le corps de la réponse.
Vérifiez la sortie dans le fichier outputfile.txt
.
Créer une table DynamoDB avec un flux activé
Créez une table Amazon DynamoDB avec un flux activé.
Pour créer une table DynamoDB
-
Ouvrez la console DynamoDB
. -
Choisissez Créer un tableau.
-
Créez une table avec les paramètres suivants.
-
Nom de la table –
lambda-dynamodb-stream
-
Clé primaire –
id
(chaîne)
-
-
Choisissez Create (Créer).
Pour activer les flux
-
Ouvrez la console DynamoDB
. -
Choisissez Tables.
-
Choisissez la table lambda-dynamodb-stream.
-
Sous la section Exports and streams (Exportations et flux), choisissez DynamoDB stream details (Détails du flux DynamoDB).
-
Sélectionnez Enable (Activer).
-
Choisissez Enable stream (Activer le flux).
Écrivez l’ARN du flux. Vous en aurez besoin à l'étape suivante pour associer le flux à votre fonction Lambda. Pour plus d'informations sur l'activation des flux, consultez Capture d'activité Table avec DynamoDB Streams.
Ajouter une source d'événement dans AWS Lambda
Créez un mappage de source d'événement dans AWS Lambda. Ce mappage de source d'événement associe le flux DynamoDB avec votre fonction Lambda. Une fois que vous créez ce mappage de source d'événement, AWS Lambda commence à interroger le flux.
Exécutez la commande AWS CLI create-event-source-mapping
suivante. Une fois la commande exécutée, notez l'UUID. Vous aurez besoin de l'UUID pour faire référence au mappage de source d'événement dans les commandes (par exemple, lors de la suppression du mappage).
aws lambda create-event-source-mapping --function-name ProcessDynamoDBRecords \ --batch-size 100 --starting-position LATEST --event-source
DynamoDB-stream-arn
Cela a pour effet de créer un mappage entre le flux DynamoDB spécifié et la fonction Lambda. Vous pouvez associer un flux diffuser à plusieurs fonctions Lambda, et associer la même fonction Lambda à plusieurs flux. Toutefois, les fonctions Lambda partagent le débit de lecture du flux qu'elles partagent.
Pour obtenir la liste des mappages de source d'événement, exécutez la commande suivante.
aws lambda list-event-source-mappings
Cette liste renvoie tous les mappages de source d'événement que vous avez créés et indique la valeur LastProcessingResult
pour chacun d'eux, entre autres. Ce champ est utilisé pour fournir un message d'information en cas de problème. Des valeurs telles que No records processed
(signale que AWS Lambda n'a pas commencé l'interrogation ou que le flux ne contient pas d'enregistrement) et OK
(signale que AWS Lambda a pu lire les enregistrements du flux et appeler votre fonction Lambda) indiquent qu'il n'y pas de problème. Dans le cas contraire, vous recevez un message d'erreur.
Si vous avez un grand nombre de mappages de source d'événement, utilisez le paramètre du nom de la fonction pour affiner les résultats.
aws lambda list-event-source-mappings --function-name ProcessDynamoDBRecords
Tester la configuration
Testez l'environnement complet. A mesure que vous mettez la table à jour, DynamoDB écrit les enregistrements d'événement dans le flux. Quand AWS Lambda interroge le flux, il y détecte les nouveaux enregistrements et appelle pour vous la fonction Lambda en transmettant les événements à la fonction.
-
Dans la console DynamoDB, vous pouvez ajouter, mettre à jour et supprimer des éléments dans la table. DynamoDB écrit des enregistrements de ces actions dans le flux.
-
AWS Lambda interroge le flux et, quand il détecte une mise à jour de celui-ci, il appelle la fonction Lambda en transmettant les données d'événement trouvées dans le flux.
-
Votre fonction s'exécute et crée des journaux dans Amazon CloudWatch. Vous pouvez vérifier les journaux signalés dans la console Amazon CloudWatch.
Nettoyage de vos ressources
Vous pouvez maintenant supprimer les ressources que vous avez créées pour ce didacticiel, sauf si vous souhaitez les conserver. En supprimant des ressources AWS que vous n'utilisez plus, vous évitez les frais superflus pour votre compte AWS.
Pour supprimer la fonction Lambda
-
Ouvrez la page Functions (Fonctions)
de la console Lambda. -
Sélectionnez la fonction que vous avez créée.
-
Sélectionnez Actions, Delete (Supprimer).
-
Saisissez
delete
dans la zone de saisie de texte et choisissez Delete (Supprimer).
Pour supprimer le rôle d'exécution
-
Ouvrez la page Roles (Rôles)
de la console IAM. -
Sélectionnez le rôle d'exécution que vous avez créé.
-
Choisissez Supprimer.
-
Saisissez le nom du rôle dans le champ de saisie de texte et choisissez Delete (Supprimer).
Pour supprimer la table DynamoDB
-
Ouvrez la page Tables (Tables)
de la console DynamoDB. -
Sélectionnez la table que vous avez créée.
-
Choisissez Supprimer.
-
Saisissez
delete
dans la zone de texte. -
Choisissez Supprimer la table.