Sarath vous guide dans
l’entreposage des notifications SNS pour SES
dans DynamoDB

lambda-sns-ses-dynamodb-sarath

J’utilise le service Amazon Simple Notification Service (Amazon SNS) pour recevoir des notifications sur les retours, les plaintes et la livraison des messages 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 ?

Une fois que vous avez configuré Notifications Amazon SES via Amazon SNS, vous pouvez utiliser une fonction AWS Lambda pour inscrire ces notifications dans une base de données DynamoDB. Vous pouvez ensuite télécharger ces notifications de la base de données DynamoDB dans un fichier CSV.

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

Exécutez chacune des suites d’opérations ci-dessous pour utiliser une fonction Lambda en vue de stocker le contenu de notification SNS pour SES dans une base de données DynamoDB :

  1. Créez une table DynamoDB.
  2. Ajoutez des autorisations pour que le rôle IAM Lambda écrive dans la table DynamoDB.
  3. Créez une fonction Lambda pour traiter les notifications de retour SES.
  4. Inscrivez la fonction Lambda dans une ou plusieurs rubriques.
  5. Mettez à jour les autorisations de fonction pour permettre à SNS d’appeler la fonction.
  6. Testez la configuration en envoyant un message SES pour invoquer la fonction Lambda.
  7. Téléchargez un rapport depuis DynamoDB pour afficher des notifications SES.

Pré requis

  • Autorisez l’accès en lecture et en écriture à une base de données DynamoDB.
  • Configurez un compte SES (e-mail ou domaine) vérifié et doté d’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 Amazon SES via Amazon SNS.

1. Créez une table DynamoDB

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

Pour interroger la table et générer un rapport SES, configurez des index secondaires de type de notification et de type de plainte, comme indiqué dans le tableau ci-dessous. Des index supplémentaires peuvent être ajoutés si nécessaire.

Nom d'index Clé de partition Clé de tri
SESMessageType-index SESMessageType (Chaîne) SnsPublishTime (Chaîne)
SESMessageComplaintType-Index SESComplaintFeedbackType (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.

2. Ajoutez des autorisations pour que le rôle IAM Lambda puisse écrire dans la table DynamoDB

Créez un nouveau rôle AWS Identity and Access Management (IAM) à utiliser avec la fonction Lambda. Le rôle doit permettre à la fonction Lambda d’appeler l’API DynamoDB:PutItem.

Remarque : La création et l’utilisation d’un nouveau rôle IAM pour différentes fonctions Lambda font partie des meilleures pratiques. Évitez de réutiliser un même rôle dans plusieurs fonctions.

  1. Dans la console IAM, dans le volet de navigation, choisissez Rôles, puis sélectionnez Créer un rôle.
  2. Choisissez le type d’entité de confiance AWS service, sélectionnez Lambda, puis choisissez Next: Permissions.
  3. Sélectionnez la stratégie gérée AWSLambdaBasicExecutionRole, puis Suivant.
  4. Attribuez un nom au rôle de lambda_ses_execution, puis terminez la création du rôle.
  5. Revenez dans l’affichage des rôles IAM, puis choisissez le rôle que vous avez créé.
  6. Choisissez Add inline policy (Ajouter une stratégie en ligne).
  7. Dans l’éditeur Visual, sélectionnez le service DynamoDB et l’action PutItem dans la catégorie Écrire. Sous ressources, choisissez Ajouter ARN, puis renseignez l’ARN de la table DynamoDB créée auparavant.
  8. Sélectionnez Vérification, fournissez un nom de stratégie, puis choisissez Créer une stratégie.

L’exemple suivant contient la déclaration de stratégie en ligne 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:PutItem"
            ],
            "Resource": [
                "arn:aws:DynamoDB:us-east-1:12345678912:table/SESNotifications"
            ]
        }
    ]
}
------------------------IAM Policy Ends-----------------------------

3. Création d’une fonction Lambda pour les notifications de retour à l’expéditeur SES

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

Lors de la création de la fonction, choisissez le rôle lambda_ses_execution créé au préalable.

Configurez une nouvelle fonction à l’aide du code d’exemple suivant. L’exemple de code contrôle les trois types de notification SNS comme décrit dans Exemples de notification Amazon SNS pour Amazon SES, puis place la notification SES dans une entrée de la table DynamoDB.

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.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) { context.fail(err)}
  else {
          console.log(data);
          context.succeed();
>      }
  });
}
};
------------------------Lambda Code Ends----------------------------

4. Abonnez-vous à la fonction Lambda pour une ou plusieurs rubriques

Si vous avez déjà créé au moins une rubrique SNS et configuré un domaine de messagerie électronique SES pour utiliser les notifications de retour pour la rubrique SNS, exécutez les opérations suivantes :

  1. Dans le volet de navigation de la console SNS, choisissez Rubriques. Identifiez la rubrique SNS utilisée dans SES pour les retours, notamment 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 (Créer l’abonnement). Cela crée un abonnement avec Lambda comme protocole et l'ARN de la fonction Lambda comme point de terminaison.

5. Mettez à jour les autorisations de fonction pour permettre à SNS d’appeler la fonction

Si vous n’avez pas utilisé la console SNS lors de la première opération pour créer l’abonnement Lambda à la rubrique, vous pouvez lancer la déclenchement en utilisant la console Lambda.

  1. Dans la console Lambda de la fonction, ajoutez un déclencheur SNS choisi dans la liste de déclencheurs dans Designer. Un panneau de configuration apparaît sous Designer.
  2. Choisissez la rubrique dans la liste déroulante du panneau de configuration.

Répétez l’opération pour ajouter les différentes rubriques de notification pour lesquelles vous voulez souscrire cette fonction Lambda.

6. Effectuez un test en envoyant un message SES pour invoquer la fonction Lambda

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 SES pour envoyer un message test.

Pour envoyer un message test, vous pouvez utiliser une des adresses de simulateur de boîte aux lettres disponibles pour éviter un impact négatif sur vos métriques de délivrabilité SES. Pour plus d’informations, voir Testing Amazon SES Email Sending (Test de l’envoi de messages Amazon SES).

Une fois le message envoyé, SES publie une notification dans la rubrique SNS. SNS délivre sa notification à Lambda sous forme d’objet de notification d’événement SES JSON-escaped dans l’objet d’événement SNS.

Pour créer des événements exemples pour vérification locale à l’aide de la Console Lambda, consultez Amazon SES Email Receiving Sample Event (Événements exemples de réception de message Amazon SES).

Pour les retours, les plaintes et les exemples de notification de délivrance SES, voir Amazon SNS Notification Examples for Amazon SES (Exemple de notification SNS Amazon pour Amazon SES).

7. Téléchargez un rapport depuis DynamoDB pour afficher des notifications SES

Vous pouvez interroger, trier et télécharger le contenu du tableau dans un fichier .CSV en utilisant la console DynamoDB.

  1. Dans la console DynamoDB, sélectionnez la table SESNotifications.
  2. Accédez à l’onglet Items (Articles).
  3. Créez une Demande ou recherchez une Analyse.

Pour plus d’informations, consultez la section Qu’est-ce qu’Amazon DynamoDB ? Vous pouvez également utiliser AWS Data Pipeline pour planifier un téléchargement du fichier dans un compartiment Amazon Simple Storage Service (Amazon 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


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 : 13/06/2018

Date de mise à jour : 09/07/2018