Comment stocker les notifications Amazon SNS pour les e-mails Amazon SES dans DynamoDB à l'aide de Lambda ?

Lecture de 8 minute(s)
0

J'utilise Amazon Simple Notification Service (Amazon SNS) pour recevoir des notifications concernant les e-mails envoyés via Amazon Simple Email Service (Amazon SES). Je souhaite configurer une fonction AWS Lambda pour stocker ces notifications dans un tableau Amazon DynamoDB.

Résolution

Remarque : Les exemples de code présentés dans les étapes suivantes fonctionnent uniquement avec un environnement d'exécution Lambda de Node.js versions 16.x et antérieures.

(Prérequis) Configurer un e-mail ou un domaine Amazon SES avec une rubrique Amazon SNS configurée pour recevoir des notifications d'Amazon SES

Pour plus d'informations, consultez la section Recevoir des notifications Amazon SES à l'aide d'Amazon SNS.

Création d'une table DynamoDB

1.    Créez une table dans DynamoDB qui possède les attributs suivants :
Pour le nom de la table, saisissez SESNotifications.
Pour la clé de partition principale, entrez SESMessageID.
Pour la clé de tri principale, entrez SnsPublishTime.

2.    Pour permettre à Lambda d'interroger la table et de créer un rapport Amazon SES, configurez les index secondaires suivants :

Nom de l'indexClé de partitionClé de tri
Index des types de messages SESSESMessageType (chaîne)SnsPublishTime (chaîne)
SESMessageComplaintType-IndexSESComplaintFeedbackType (chaîne)SnsPublishTime (chaîne)

Remarque : Vous pouvez ajouter d'autres index secondaires selon vos besoins.

Pour plus d'informations sur la création d'une table dans DynamoDB, consultez la section Création d'une table DynamoDB.

Ajoutez des autorisations au rôle IAM de votre fonction Lambda qui lui permettent d'appeler la table DynamoDB

Créez un rôle AWS Identity and Access Management (IAM). Configurez le rôle pour permettre à votre fonction Lambda d'appeler l'API DynamoDB:PutItem :

Remarque : Il est recommandé de créer et d'utiliser un nouveau rôle IAM pour différentes fonctions Lambda. Évitez de réutiliser des rôles dans plusieurs fonctions.

1.    Dans le volet de navigation de la console IAM, choisissez Rôles.

2.    Choisissez Créer un rôle.

3.    Pour Sélectionner le type d'entité de confiance, choisissez le service AWS.

4.    Pour Choisir un cas d'utilisation, choisissez Lambda. Ensuite, choisissez Suivant : Autorisations.

5.    Pour les politiques d'autorisations d'attachement, cochez la case à côté de la politique gérée AWSLambdaBasicExecutionRole. Ensuite, choisissez Suivant : Balises.

6.    (Facultatif) Ajoutez des balises IAM au rôle en fonction de votre cas d'utilisation. Pour plus d'informations, consultez la section Balisage des ressources IAM.

7.    Choisissez Suivant : Révision.

8.    Pour le nom du rôle*, entrez lambda_ses_execution.

9.    Choisissez Créer un rôle.

10.    Revenez à l’affichage Rôles IAM, puis choisissez le rôle que vous avez créé.

11.    Dans l'onglet Autorisations, choisissez Ajouter une politique intégrée.

12.    Dans l'onglet Éditeur visuel, sélectionnez Choisir un service.

13.    Choisissez DynamoDB.

14.    Dans le champ de recherche Actions, saisissez PutItem. Dans la liste déroulante qui s'affiche, cochez la case à côté de PutItem.

15.    Pour Ressources, choisissez Spécifique.

16.    Choisissez Ajouter un ARN. Ensuite, dans la zone de texte qui s'affiche, entrez le Amazon Resource Name (ARN) de votre table DynamoDB.

17.    Choisissez Politique de révision.

18.    Dans Nom, entrez le nom de la politique.

19.    Choisissez Créer une politique.

Exemple de politique IAM en ligne qui autorise l'accès à une table DynamoDB

{
    "Version": "2012-10-17",
    "Statement": \[
         {
            "Sid": "Stmt1428510662000",
            "Effect": "Allow",
            "Action": \[
                "DynamoDB:PutItem"
            \],
            "Resource": \[
                "arn:aws:DynamoDB:us-east-1:12345678912:table/SESNotifications"
            \]
        }
    \]
}

Création d'une fonction Lambda pour traiter les notifications Amazon SES et Amazon SNS

Utilisez l'exemple de code de fonction suivant pour créer une fonction Lambda nommée sesnotificationscode. Vous pouvez utiliser l'exemple de fonction Lambda suivant comme modèle pour écrire des données dans un système de gestion de la relation client (CRM) ou vers d'autres destinations.

Important : Assurez-vous d'attribuer le rôle lambda_ses_execution à la fonction.

Exemple de code de fonction Lambda qui vérifie les notifications Amazon SNS et place les notifications Amazon SES associées dans une table DynamoDB

console.log("Loading event");

var aws = require("aws-sdk");
var ddb = new aws.DynamoDB({ params: { TableName: "SESNotifications" } });

exports.handler = function (event, context, callback) {
  console.log("Received event:", JSON.stringify(event, null, 2));

  var SnsPublishTime = event.Records\[0\].Sns.Timestamp;
  var SnsTopicArn = event.Records\[0\].Sns.TopicArn;
  var SESMessage = event.Records\[0\].Sns.Message;

  SESMessage = JSON.parse(SESMessage);

  var SESMessageType = SESMessage.notificationType;
  var SESMessageId = SESMessage.mail.messageId;
  var SESDestinationAddress = SESMessage.mail.destination.toString();
  var LambdaReceiveTime = new Date().toString();

  if (SESMessageType == "Bounce") {
    var SESreportingMTA = SESMessage.bounce.reportingMTA;
    var SESbounceSummary = JSON.stringify(SESMessage.bounce.bouncedRecipients);
    var itemParams = {
      Item: {
        SESMessageId: { S: SESMessageId },
        SnsPublishTime: { S: SnsPublishTime },
        SESreportingMTA: { S: SESreportingMTA },
        SESDestinationAddress: { S: SESDestinationAddress },
        SESbounceSummary: { S: SESbounceSummary },
        SESMessageType: { S: SESMessageType },
      },
    };
    ddb.putItem(itemParams, function (err, data) {
      if (err) {
        callback(err)
      } else {
        console.log(data);
        callback(null,'')
      }
    });
  } else if (SESMessageType == "Delivery") {
    var SESsmtpResponse1 = SESMessage.delivery.smtpResponse;
    var SESreportingMTA1 = SESMessage.delivery.reportingMTA;
    var itemParamsdel = {
      Item: {
        SESMessageId: { S: SESMessageId },
        SnsPublishTime: { S: SnsPublishTime },
        SESsmtpResponse: { S: SESsmtpResponse1 },
        SESreportingMTA: { S: SESreportingMTA1 },
        SESDestinationAddress: { S: SESDestinationAddress },
        SESMessageType: { S: SESMessageType },
      },
    };
    ddb.putItem(itemParamsdel, function (err, data) {
      if (err) {
        callback(err)
      } else {
        console.log(data);
        callback(null,'')
      }
    });
  } else if (SESMessageType == "Complaint") {
    var SESComplaintFeedbackType = SESMessage.complaint.complaintFeedbackType;
    var SESFeedbackId = SESMessage.complaint.feedbackId;
    var itemParamscomp = {
      Item: {
        SESMessageId: { S: SESMessageId },
        SnsPublishTime: { S: SnsPublishTime },
        SESComplaintFeedbackType: { S: SESComplaintFeedbackType },
        SESFeedbackId: { S: SESFeedbackId },
        SESDestinationAddress: { S: SESDestinationAddress },
        SESMessageType: { S: SESMessageType },
      },
    };
    ddb.putItem(itemParamscomp, function (err, data) {
      if (err) {
        callback(err)
      } else {
        console.log(data);
        callback(null,'')
      }
    });
  }
};

Remarque : Remplacez le paramètre TableName SESNotifications par le nom de votre table DynamoDB.

Abonnez votre fonction Lambda à une ou plusieurs rubriques Amazon SNS

Utilisation de la console Amazon SNS

Vous devez ajouter manuellement des autorisations à la politique de ressources de la fonction pour permettre à SNS d'invoquer la fonction. Pour ajouter ces autorisations, exécutez la commande AWS CLI suivante :

Remarque : Si vous recevez des erreurs lors de l’exécution des commandes AWS CLI, assurez-vous que vous utilisez la version la plus récente d’AWS CLI.

aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns-my-topic \\  
\--principal sns.amazonaws.com --source-arn arn:aws:sns:us-east-1:123456789012:my-topic

Remarque : Remplacez les valeurs my-function, sns-my-topic, et arn:aws:sns:us-east-1:123456789012:my-topic par l'ID de votre fonction, de votre rubrique et de l'ARN complet.

Après avoir ajouté les autorisations nécessaires, procédez comme suit pour abonner votre fonction à une rubrique SNS.

1.    Dans le volet de navigation de la console Amazon SNS, choisissez Rubriques.

2.    Identifiez la rubrique SNS utilisée dans Amazon SES pour les notifications de rebond. Par exemple : Une rubrique SNS nommée ses_notifications_repo.

3.    Choisissez l'ARN de la rubrique SNS. La page Détails de la rubrique s'ouvre.

4.    Choisissez Créer un abonnement.

5.    Pour le protocole, choisissez AWS Lambda.

6.    Pour le point de terminaison, entrez l'ARN de votre fonction Lambda.

7.    Choisissez Créer un abonnement.

8.    (Facultatif) Répétez les étapes 1 à 7 pour chaque rubrique de notification supplémentaire à laquelle vous souhaitez vous abonner à votre fonction.

Utilisation de la console Lambda

1.    Ouvrez la page Fonctions dans la console Lambda.

2.    Choisissez la fonction Lambda que vous avez créée.

3.    Dans le volet d'aperçu des fonctions, choisissez +Ajouter un déclencheur.

4.    Dans la liste déroulante de configuration du déclencheur, choisissez SNS. Un panneau de configuration s'affiche.

5.    Dans la liste déroulante des rubriques SNS, choisissez la rubrique SNS à laquelle vous souhaitez abonner la fonction.

6.    Choisissez Ajouter.

7.    (Facultatif) Répétez les étapes 1 à 6 pour chaque rubrique de notification supplémentaire à laquelle vous souhaitez vous abonner à votre fonction.

Testez la configuration : Envoyer un message Amazon SES pour appeler votre fonction Lambda

Pour envoyer un message Amazon SES test, utilisez l'une des adresses du simulateur de boîte aux lettres disponibles.

Remarque : Lorsque vous envoyez des messages de test, l'utilisation de l'une des adresses du simulateur de boîte aux lettres évite tout impact négatif sur vos indicateurs de délivrabilité SES.

Lorsque vous envoyez le message de test, Amazon SES publie une notification dans la rubrique SNS. Amazon SNS envoie ensuite la notification à Lambda sous la forme d'un objet de notification d'événement SES échappé au JSON dans l'objet d'événement SNS.

Pour utiliser la console Lambda afin de créer des exemples d'événements pour des tests locaux, consultez la section Exemples de données d'événements qu'Amazon SES publie sur Amazon SNS.

Important : Vous ne pouvez pas utiliser ces exemples de données d'événements car ils sont écrits pour envoyer des messages de test dans la console Lambda. Pour utiliser les exemples à des fins de test dans la console Lambda, vous devez remplacer la clé de message eventType par notificationType. Si vous ne modifiez pas la clé du message, le test échoue.

Téléchargez un rapport depuis DynamoDB pour consulter les notifications Amazon SES

Pour interroger, trier et télécharger le contenu de la table DynamoDB sous forme de fichier .csv, procédez comme suit :

1.    Ouvrez la console DynamoDB, puis choisissez la table SESNotifications.

2.    Choisissez l'onglet Articles.

3.    Créez une requête ou une recherche par scan. Pour plus d'informations, consultez la section Meilleures pratiques pour l'interrogation et l'analyse des données.

Remarque : Vous pouvez utiliser l'exportation de tables DynamoDB pour planifier le téléchargement du fichier vers un compartiment Amazon Simple Storage Service (Amazon S3) à intervalles réguliers. Pour plus d'informations, consultez la section Exportation de données DynamoDB vers Amazon S3 : comment ça fonctionne.

Informations connexes

Diffusion en éventail vers les fonctions Lambda

Invocation des fonctions AWS Lambda via Amazon SNS

Réception des notifications Amazon SES à l'aide d'Amazon SNS

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an