Wie speichere ich Amazon SNS-Benachrichtigungen für Amazon SES-E-Mails in DynamoDB mit Lambda?

Lesedauer: 8 Minute
0

Ich verwende Amazon Simple Notification Service (Amazon SNS), um Benachrichtigungen über E-Mails zu erhalten, die über den Amazon Simple Email Service (Amazon SES) gesendet wurden. Ich möchte eine AWS Lambda-Funktion einrichten, um diese Benachrichtigungen in einer Amazon DynamoDB-Tabelle zu speichern.

Lösung

Hinweis: Die Codebeispiele in den folgenden Schritten funktionieren nur mit einer Lambda-Laufzeit von Node.js der Versionen 16.x und früher.

(Voraussetzung) Richten Sie eine Amazon SES-E-Mail oder -Domain mit einem Amazon SNS-Thema ein, das für den Empfang von Benachrichtigungen von Amazon SES konfiguriert ist

Weitere Informationen finden Sie unter Amazon SES-Benachrichtigungen mit Amazon SNS empfangen.

Eine DynamoDB-Tabelle erstellen

1.Erstellen Sie in DynamoDB eine Tabelle mit den folgenden Attributen:
Geben Sie für Table-name SESNotifications ein.
Geben Sie als primären Partitionsschlüssel SESMessageId ein.
Geben Sie als primären Sortierschlüssel SnsPublishTime ein.

2.Damit Lambda die Tabelle abfragen und einen Amazon SES-Bericht erstellen kann, richten Sie die folgenden sekundären Indizes ein:

Name des IndexesPartitionsschlüsselSortierschlüssel
SESMessageType-IndexSESMessageType (Zeichenfolge)SnsPublishTime (Zeichenfolge)
SESMessageComplaintType-IndexSESComplaintFeedbackType (Zeichenfolge)SnsPublishTime (Zeichenfolge)

Hinweis: Sie können bei Bedarf weitere sekundäre Indizes hinzufügen.

Informationen zum Erstellen einer Tabelle in DynamoDB finden Sie unter Erstellen einer DynamoDB-Tabelle.

Der IAM-Rolle Ihrer Lambda-Funktion Berechtigungen hinzufügen, die es ihr ermöglichen, die DynamoDB-Tabelle aufzurufen

Erstellen Sie eine neue AWS Identity and Access Management (IAM)-Rolle. Konfigurieren Sie die Rolle so, dass Ihre Lambda-Funktion die DynamoDB:PutItem-API aufrufen kann:

Hinweis: Es hat sich bewährt, eine neue IAM-Rolle für verschiedene Lambda-Funktionen zu erstellen und zu verwenden. Vermeiden Sie die Wiederverwendung von Rollen für mehrere Funktionen.

1.Wählen Sie im Navigationsbereich der IAM-Konsole die Option Rollen aus.

2.Wählen Sie Rolle erstellen aus.

3.Wählen Sie für Art der vertrauenswürdigen Entität auswählen die Option AWS-Service aus.

4.Wählen Sie unter Anwendungsfall auswählen die Option Lambda aus. Wählen Sie dann Weiter: Genehmigungen aus.

5.Wählen Sie für Berechtigungsrichtlinien anhängen das Kontrollkästchen neben der verwalteten Richtlinie AWSLambdaBasicExecutionRole aus. Wählen Sie dann Weiter: Tags aus.

6.(Optional) Fügen Sie der Rolle IAM-Tags für Ihren Anwendungsfall hinzu. Weitere Informationen finden Sie unter Tagging von IAM-Ressourcen.

7.Wählen Sie Weiter: Überprüfung aus.

8.Geben Sie für Role name* lambda_ses_execution ein.

9.Wählen Sie Rolle erstellen aus.

10.Kehren Sie zur Ansicht IAM-Rollen zurück, und wählen Sie anschließend die Rolle aus, die Sie erstellt haben.

11. Wählen Sie auf der Registerkarte Berechtigungen die Option Inline-Richtlinie hinzufügen aus.

12.Wählen Sie auf der Registerkarte Visueller Editor die Option Dienst auswählen aus.

13.Wählen Sie DynamoDB aus.

14.Geben Sie im Suchfeld Aktionen PutItem ein. Aktivieren Sie in der angezeigten Dropdown-Liste das Kontrollkästchen neben PutItem.

15.Wählen Sie für Ressourcen die Option Spezifisch aus.

16.Wählen Sie ARN hinzufügen aus. Geben Sie dann in das angezeigte Textfeld den Amazon-Ressourcennamen (ARN) Ihrer DynamoDB-Tabelle ein.

17.Wählen Sie Richtlinie überprüfen aus.

18.Geben Sie unter Name einen Namen für die Richtlinie ein.

19.Wählen Sie Richtlinie erstellen aus.

Beispiel für eine Inline-IAM-Richtlinie, die Zugriff auf eine DynamoDB-Tabelle gewährt

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

Eine Lambda-Funktion zur Verarbeitung von Amazon SES- und Amazon SNS-Benachrichtigungen erstellen

Verwenden Sie den folgenden Beispielfunktionscode, um eine Lambda-Funktion mit dem Namen sesnotificationscode zu erstellen. Sie können die folgende Lambda-Beispielfunktion als Vorlage für das Schreiben von Daten in ein Customer Relationship Management (CRM)-System oder andere Ziele verwenden.

Wichtig: Stellen Sie sicher, dass Sie der Funktion die Rolle lambda_ses_execution zuweisen.

Beispiel für einen Lambda-Funktionscode, der nach Amazon SNS-Benachrichtigungen sucht und die zugehörigen Amazon SES-Benachrichtigungen in eine DynamoDB-Tabelle einfügt

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,'')
      }
    });
  }
};

Hinweis: Ersetzen Sie den TableName-Parameter SESNotifications durch den Namen Ihrer DynamoDB-Tabelle.

Ihre Lambda-Funktion für eines oder mehrere Amazon SNS-Themen abonnieren

Verwendung der Amazon SNS-Konsole

Sie müssen der Funktionsressourcenrichtlinie manuell Berechtigungen hinzufügen, damit SNS die Funktion aufrufen kann. Führen Sie den folgenden AWS-CLI-Befehl aus, um diese Berechtigungen hinzuzufügen:

Hinweis: Wenn Sie beim Ausführen von AWS-CLI-Befehlen Fehler erhalten, vergewissern Sie sich, dass Sie die neueste Version der AWS-CLI verwenden.

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

Hinweis: Ersetzen Sie die Werte my-function, sns-my-topic und arn:aws:sns:us-east-1:123456789012:my-topic durch die ID Ihrer Funktion, Ihres Themas und des vollständigen ARN.

Nachdem Sie die erforderlichen Berechtigungen hinzugefügt haben, führen Sie die folgenden Schritte aus, um Ihre Funktion für ein SNS-Thema zu abonnieren.

1.Wählen Sie im Navigationsbereich der Amazon SNS-Konsole Themen aus.

2.Suchen Sie nach dem SNS-Thema, das in Amazon SES für Bounce-Benachrichtigungen verwendet wird. Zum Beispiel: Ein SNS-Thema mit dem Namen ses_notifications_repo.

3.Wählen Sie den ARN des SNS-Themas aus. Die Seite Themendetails wird geöffnet.

4.Wählen Sie Abonnement erstellen aus.

5.Wählen Sie als Protokoll AWS Lambda aus.

6.Geben Sie für Endpunkt den ARN Ihrer Lambda-Funktion ein.

7.Wählen Sie Abonnement erstellen aus.

8.(Optional) Wiederholen Sie die Schritte 1–7 für jedes weitere Benachrichtigungsthema, das Sie für Ihre Funktion abonnieren möchten.

Verwendung der Lambda-Konsole

1.Öffnen Sie die Seite Funktionen in der Lambda-Konsole.

2.Wählen Sie Ihre Lambda-Funktion aus, die Sie erstellt haben.

3.Wählen Sie im Bereich Funktionsübersicht die Option +Trigger hinzufügen aus.

4.Wählen Sie in der Dropdown-Liste Trigger-Konfiguration die Option SNS aus. Ein Konfigurationsfenster wird angezeigt.

5.Wählen Sie in der Dropdownliste SNS-Thema das SNS-Thema aus, für das Sie die Funktion abonnieren möchten.

6.Wählen Sie Hinzufügen aus.

7.(Optional) Wiederholen Sie die Schritte 1–6 für jedes weitere Benachrichtigungsthema, das Sie für Ihre Funktion abonnieren möchten.

Testen Sie die Einrichtung: Senden Sie eine Amazon SES-Nachricht, um Ihre Lambda-Funktion aufzurufen

Verwenden Sie eine der verfügbaren Mailbox-Simulator-Adressen, um eine Amazon SES-Testnachricht zu senden.

Hinweis: Wenn Sie Testnachrichten senden, vermeidet die Verwendung einer der Mailbox-Simulator-Adressen negative Auswirkungen auf Ihre SES-Zustellbarkeits-Metriken.

Wenn Sie die Testnachricht senden, veröffentlicht Amazon SES eine Benachrichtigung zum SNS-Thema. Anschließend übermittelt Amazon SNS die Benachrichtigung als JSON-Escaped-SES-Ereignisbenachrichtigungsobjekt im SNS-Ereignisobjekt an Lambda.

Informationen zur Verwendung der Lambda-Konsole zur Erstellung von Beispielereignissen für lokale Tests finden Sie unter Beispiele für Ereignisdaten, die Amazon SES in Amazon SNS veröffentlicht.

Wichtig: Sie können diese Beispiele für Ereignisdaten nicht verwenden, da sie zum Senden von Testnachrichten in der Lambda-Konsole geschrieben wurden. Um die Beispiele zum Test in der Lambda-Konsole zu verwenden, müssen Sie den Nachrichtenschlüssel eventType in notificationType ändern. Wenn Sie den Nachrichtenschlüssel nicht ändern, schlägt der Test fehl.

Einen Bericht von DynamoDB herunterladen, um Amazon SES-Benachrichtigungen einzusehen

Gehen Sie wie folgt vor, um den Inhalt der DynamoDB-Tabelle als CSV-Datei abzufragen, zu sortieren und herunterzuladen:

1.Öffnen Sie die DynamoDB-Konsole und wählen Sie dann die Tabelle SESNotifications aus.

2.Wählen Sie die Registerkarte Elemente aus.

3.Erstellen Sie eine Abfrage oder eine Scansuche. Weitere Informationen finden Sie unter Bewährte Methoden für das Abfragen und Scannen von Daten.

Hinweis: Sie können den DynamoDB-Tabellenexport verwenden, um in regelmäßigen Abständen einen Download der Datei in einen Amazon Simple Storage Service (Amazon S3)-Bucket zu planen. Weitere Informationen finden Sie unter So funktioniert der DynamoDB-Datenexport nach Amazon S3.

Ähnliche Informationen

Funktionen für den Fanout zu Lambda

Aufrufen von AWS Lambda-Funktionen über Amazon SNS

Empfangen von Amazon SES-Benachrichtigungen mithilfe von Amazon SNS

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr