J'utilise le service Amazon Simple Notification Service (Amazon SNS) pour recevoir des notifications sur les retours, les plaintes et les messages délivrés pour des e-mails envoyés via le service Amazon Simple Email Service (Amazon SES). J'aimerais stocker ces notifications dans une base de données Amazon DynamoDB en utilisant AWS Lambda. Quelle est la marche à suivre ?

J'ai configuré Notifications SES Amazon via Amazon SNS et j'aimerais utiliser une fonction AWS Lambda pour écrire ces notifications dans une base de données DynamoDB. J'aimerais pouvoir télécharger ces notifications depuis la base de données DynamoDB vers un fichier CSV.

Remarque
La fonction Lambda créée dans cet exemple peut être utilisée comme template pour l'écriture de données sur un CRM ou autres destinations en fonction de l'emplacement où vous hébergez votre liste de diffusion.

Réalisez chacune des étapes résumées ci-dessous pour utiliser une fonction AWS Lambda afin de stocker du contenu de notification SNS pour SES dans une base de données DynamoDB :

Prérequis

  • Un compte SES (e-mail ou domaine) qui est vérifié et a une rubrique SNS configurée pour recevoir des notifications SES. Pour plus d'informations sur l'utilisation de SNS pour la réception de notifications SES, consultez Notifications SES Amazon via Amazon SNS.
  • Lisez et écrivez l'accès à une base de données DynamoDB.

Procédez comme suit

  1. Créez une table DynamoDB
  2. Personnalisez le template Lambda pour les notifications de bounce SES
  3. Ajoutez des autorisations pour que le rôle IAM Lambda écrive dans la table DynamoDB
  4. Préparez la fonction Lambda pour invocation par SNS
  5. Ajoutez une ou plusieurs rubriques SNS en tant que source d'événement pour la fonction Lambda
  6. Testez en envoyant un message SES pour invoquer la fonction Lambda
  7. Téléchargez un rapport depuis DynamoDB pour afficher des notifications SES

Commencez par créer une table dans DynamoDB appelée SESNotifications avec une clé primaire de hachage nommée SESMessageId et une clé primaire de plage nommée SnsPublishTime.

Pour interroger la table et générer un rapport SES, vous avez besoin que le type et le sous-type de notification soient répertoriés dans la table suivante. Des champs supplémentaires peuvent être ajoutés si nécessaire.

  Nom d'index

  Clé de hachage

  Clé de plage

SESMessageType-index

SESMessageId (Chaîne)

SnsPublishTime (Chaîne)

SESMessageSubType-index

SESMessageId (Chaîne)

SnsPublishTime (Chaîne)

Pour plus d'informations sur la création d'une table dans DynamoDB, consultez Mise en route d'Amazon DynamoDB.

Utilisez la console AWS Lambda pour créer une fonction Lambda nommée sesnotificationscode.

L'exemple de code suivant doit être saisi comme nouvelle fonction qui est basée sur le modèle sns-message afin de contribuer à garantir que vous choisissez un type de source d'événement SNS et la rubrique SNS que vous avez déjà créée conformément aux prérequis. Cet exemple de code vérifie les 3 types de notifications SNS décrits dans Exemples de notifications SNS Amazon pour Amazon SES.

Remarque
Dans l'exemple de code suivant, remplacez la valeur du paramètre TableName (SESNotifications) par le nom de votre table.

--------------------------Lambda Code Begins------------------------

console.log('Loading event');

var aws = require('aws-sdk');

var ddb = new aws.DynamoDB({params: {TableName: 'SESNotifications'}});

exports.handler = function(event, context)

{

  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) { context.fail(err)}

  else {

           console.log(data);

           context.succeed();

      }

  });

}

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) { context.fail(err)}

  else {

          console.log(data);

          context.succeed();

      }

  });

}

else if (SESMessageType == 'Complaint')

{

var SESComplaintFeedbackType = SESMessage.complaintFeedbackType;

var SESFeedbackId = SESMessage.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) { context.fail(err)}

  else {

          console.log(data);

          context.succeed();

      }

  });

}

};

------------------------Lambda Code Ends----------------------------

Le rôle utilisé pour la fonction Lambda dans cet exemple est « role/lambda_ses_execution » plutôt que le rôle par défaut, lambda_exec_role.

Remarque
Les bonnes pratiques IAM consistent à créer et à utiliser un rôle pour chaque fonction Lambda au lieu de partager la valeur par défaut « lambda_exec_role ». Pour plus d'informations, consultez Utilisez des rôles plutôt que le partage d'informations d'identification pour déléguer..

La stratégie d'exemple suivante est ajoutée au rôle lambda_ses_execution pour accorder l'accès à la base de données DynamoDB us-east-1:12345678912:table/SESNotifications créée à l'étape 1 :

------------------------IAM Policy Begins---------------------------

{

    "Version":"2012-10-17",

    "Statement": [

         {

            "Sid": "Stmt1428510662000",

            "Effect":"Allow",

            "Action": [

                "DynamoDB:*"

            ],

            "Resource": [

                "arn:aws:DynamoDB:us-east-1:12345678912:table/SESNotifications"

            ]

        }

    ]

}

------------------------IAM Policy Ends-----------------------------

Après que la fonction Lambda est créée, affectez un document de stratégie à ladite fonction pour lui permettre d'être appelée par SNS. Cela est effectué avec l'API AddPermission qui prend un document de stratégie comme argument. Voici un exemple de document de stratégie pour la fonction Lambda sesnotificationscode et une rubrique SNS nommée ses_notifications_repo :

Remarque
Si vous utilisez la console AWS Lambda, une stratégie vous est affectée automatiquement et vous n'avez pas besoin de réaliser cette étape.

Remarque
Pour plus d'informations sur l'utilisation de l'API AddPermission pour ajouter des autorisations à une stratégie de ressource d'une fonction Lambda, consultez Accord d'autorisations à l'aide d'une stratégie de ressources.

------------------------Lambda Policy Begins------------------------

{

  "Statement":[

    {"Condition":

      {"ArnLike":{"AWS:SourceArn":"arn:aws:sns:us-east-1:123456789012:ses_notifications_repo"}},

      "Resource":"arn:aws:lambda:us-east-1:123456789023:function:sesnotificationscode",

      "Action":"lambda:invokeFunction",

      "Principal":{"Service":"sns.amazonaws.com"},

      "Sid":"sns invoke","Effect":"Allow"

     }],

  "Id":"default",

  "Version":"2012-10-17"

}

------------------------Lambda Policy Ends--------------------------

Cet article suppose que vous avez déjà créé au moins une rubrique SNS et que vous avez configuré un domaine de messagerie SES pour utiliser cette rubrique SNS pour les notifications de commentaires.

  1. Dans le volet de navigation de la console SNS, choisissez Topics. Identifiez la rubrique SNS qui est utilisée dans SES pour les retours à l'expéditeur. Dans cet exemple, nous utilisons une rubrique SNS nommée ses_notifications_repo.
  2. Choisissez l'ARN de la rubrique SNS pour ouvrir la page Topic Details.
  3. Choisissez Create Subscription.
  4. Pour Protocol, choisissez AWS Lambda.
  5. Pour Endpoint, saisissez l'ARN de la fonction Lambda, puis choisissez Create Subscription.

Cela crée un abonnement avec Lambda comme protocole et l'ARN de la fonction Lambda comme point de terminaison.

Maintenant que la fonction Lambda est abonnée à une rubrique SNS, l'étape suivante consiste à publier un message SES et à observer l'invocation de la fonction Lambda dans la console Lambda. Vous pouvez utiliser la console Amazon SES pour envoyer un message test. Vous pouvez également utiliser la commande send-email AWS CLI à cette fin.

Après la publication du message dans la rubrique SNS, cette dernière essaie de remettre le message à la fonction Lambda correspondant à l'abonnement. Cela invoque la fonction et passe le message comme un paramètre d'entrée SNSEvent au format JSON. Pour les exemples de paramètres d'entrée SNSEvent au format JSON qui décrivent les notifications sur les livraisons, les plaintes et les retours à l'expéditeur SNS, voir Exemples de notifications SNS Amazon.

Il est facile d'interroger, de trier et de télécharger le contenu du tableau dans un fichier .CSV en utilisant la console DynamoDB. Pour plus d'informations, reportez-vous aux liens à cet emplacement : What Is Amazon DynamoDB? Vous pouvez également utiliser AWS Data Pipeline pour planifier un téléchargement du fichier dans un compartiment S3 à intervalles réguliers pour conformité ou conservation des enregistrements. Pour plus d'informations, consultez Exporter une table DynamoDB vers S3 et Deuxième partie : Exporter des données depuis DynamoDB.

Fonction Lambda, SNS, SES, notifications, retour à l'expéditeur, plainte, livraison, rubrique, s'abonner, DynamoDB


Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support

Date de publication : 11/03/2016