Come posso archiviare le notifiche Amazon SNS per le e-mail Amazon SES in DynamoDB utilizzando Lambda?

8 minuti di lettura
0

Utilizzo Amazon Simple Notification Service (Amazon SNS) per ricevere notifiche sulle e-mail inviate tramite Amazon Simple Email Service (Amazon SES). Voglio configurare una funzione AWS Lambda per archiviare queste notifiche in una tabella Amazon DynamoDB.

Risoluzione

**Nota:**Gli esempi di codice nei passaggi seguenti funzionano solo con un runtime Lambda di Node.js versioni 16.x e precedenti.

(Prerequisito) Configura un'e-mail o un dominio Amazon SES con un argomento Amazon SNS configurato per ricevere notifiche da Amazon SES

Per ulteriori informazioni, consulta Ricezione di notifiche Amazon SES utilizzando Amazon SNS.

Creazione di una tabella DynamoDB

1.    Crea una tabella in DynamoDB con i seguenti attributi:
Come Nome tabella, inserisci SESNotifications.
Come Chiave di partizione primaria, inserisci SESMessageId.
Come Chiave di ordinamento primaria, inserisci SNSPublishTime.

2.    Per consentire a Lambda di interrogare la tabella e creare un report Amazon SES, configura i seguenti indici secondari:

Nome indiceChiave di partizioneChiave di ordinamento
SESMessageType-IndexSESMessageType (stringa)SnsPublishTime (stringa)
SESMessageComplaintType-IndexSESComplaintFeedbackType (stringa)SnsPublishTime (stringa)

**Nota:**Se necessario, puoi aggiungere altri indici secondari.

Per informazioni su come creare una tabella in DynamoDB, consulta Creazione di una tabella DynamoDB.

Aggiungere autorizzazioni al ruolo IAM della tua funzione Lambda che le consentano di interrogare la tabella DynamoDB

Crea un nuovo ruolo AWS IAM (Identity and Access Management). Configura il ruolo per consentire alla tua funzione Lambda di chiamare l'API DynamoDB:PutItem:

**Nota:**È consigliabile creare e utilizzare nuovi ruoli IAM per funzioni Lambda diverse. È preferibile evitare di riutilizzare gli stessi ruoli per più funzioni.

1.    Nel pannello di navigazione della console IAM, scegli Ruoli.

2.    Scegli Crea ruolo.

3.    Per Seleziona il tipo di entità attendibile, scegli Servizio AWS.

4.    Per Scegli un caso d’uso, scegli Lambda. Quindi scegli Avanti: Autorizzazioni.

5.    Per Collega policy di autorizzazione, seleziona la casella di controllo accanto alla policy gestita AWSLambdaBasicExecutionRole. Quindi scegli Avanti: Tag.

6.    (Facoltativo) Aggiungi i tag IAM al ruolo per il tuo caso d’uso. Per ulteriori informazioni, consulta Tagging delle risorse IAM.

7.    Scegli Avanti: Revisione.

8.    Per Nome ruolo*, inserisci lambda_ses_execution.

9.    Scegli Crea ruolo.

10.    Torna alla visualizzazioneRuoli IAM, quindi scegli il ruolo che hai creato.

11.    Nella scheda Autorizzazioni, scegli Aggiungi policy inline.

12.    Nella scheda Editor visivo, seleziona Scegli un servizio.

13.    Scegli DynamoDB.

14.    Nel campo di ricerca Azioni, inserisci PutItem. Nell'elenco a discesa visualizzato, scegli la casella di controllo accanto a PutItem.

15.    Per Risorse, scegli Specifica.

16.    Scegli Aggiungi ARN. Quindi, nella casella di testo visualizzata, inserisci il Nome della risorsa Amazon (ARN) della tabella DynamoDB.

17.    Scegli Policy di revisione.

18.    In Nome, inserisci il nome della policy.

19.    Scegli Crea policy.

Esempio di policy inline IAM che consente l'accesso a una tabella DynamoDB

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

Creazione di una funzione Lambda per elaborare le notifiche Amazon SES e Amazon SNS

Utilizza il seguente codice di funzione di esempio per creare una funzione Lambda chiamata sesnotificationscode. È possibile utilizzare il seguente esempio di funzione Lambda come modello per scrivere dati su un sistema di gestione delle relazioni con i clienti (CRM) o altre destinazioni.

**Importante:**Assicurati di assegnare il ruolo lambda_ses_execution alla funzione.

Esempio di codice di funzione Lambda che verifica la presenza di notifiche Amazon SNS e inserisce le notifiche Amazon SES associate in una tabella 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,'')
      }
    });
  }
};

Nota: Sostituisci il parametro TableName SESNotifications con il nome della tua tabella DynamoDB.

Iscrizione di una funzione Lambda a uno o più argomenti di Amazon SNS

Utilizzo della console Amazon SNS

È necessario aggiungere manualmente le autorizzazioni allapolicy delle risorse della funzione per consentire a SNS di richiamare la funzione. Per aggiungere queste autorizzazioni, esegui il seguente comando AWS CLI:

Nota: Se ricevi errori durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS, verifica che ne stai utilizzando la versione più recente.

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

**Nota:**Sostituisci i valori my-function, sns-my-topic e arn:aws:sns:us-east-1:123456789012:my-topic con l'ID della tua funzione,del tuo argomento e del tuo ARN completo.

Dopo aver aggiunto le autorizzazioni necessarie, completa i seguenti passaggi per la tua funzione a un argomento SNS.

1.    Nel pannello di navigazione della console Amazon SNS, scegli ** Argomenti**.

2.    Identifica l'argomento SNS utilizzato in Amazon SES per le notifiche di mancato recapito. Ad esempio: Un argomento SNS denominato ses_notifications_repo.

3.    Scegli l'ARN dell'argomento SNS. Viene visualizzata la pagina Dettagli dell’argomento.

4.    Scegli Crea abbonamento.

5.    Come Protocollo, scegli AWS Lambda.

6.    In Endpoint, inserisci l'ARN della tua funzione Lambda.

7.    Scegli Crea abbonamento.

8.    (Facoltativo) Ripeti i passaggi da 1 a 7 per ogni argomento di notifica aggiuntivo a cui desideri iscrivere la funzione.

Utilizzo della console Lambda

1.    Apri la pagina Funzioni nella console Lambda.

2.    Scegli la funzione Lambda che hai creato.

3.    Nel pannello Panoramica sulle funzioni, scegli +Aggiungi trigger.

4.    Nell’elenco a discesa Configurazione trigger,scegli SNS. Viene visualizzato un pannello di configurazione.

5.    Nell’elenco a discesa Argomento SNS, scegli l’argomento SNS a cui vuoi iscrivere la tua funzione.

6.    Scegli Aggiungi.

7.    (Facoltativo) Ripeti i passaggi da 1 a 6 per ogni argomento di notifica aggiuntivo a cui desideri iscrivere la funzione.

Test della configurazione: invia un messaggio Amazon SES per richiamare una funzione Lambda

Per inviare un messaggio Amazon SES di prova, utilizza uno degli indirizzi del simulatore di caselle di posta disponibili.

**Nota:**Quando invii messaggi di prova, l'utilizzo di uno degli indirizzi del simulatore di caselle di posta previene un impatto negativo sulle metriche di deliverability di SES.

Quando invii il messaggio di prova, Amazon SES pubblica una notifica sull'argomento SNS. In seguito Amazon SNS invia la notifica a Lambda come oggetto di notifica di evento SES con escape JSON nell'oggetto evento SNS.

Per utilizzare la console Lambda per creare eventi di esempio per i test locali, consulta Esempi di dati degli eventi pubblicati da Amazon SES su Amazon SNS.

**Importante:**Non puoi usare i dati di questi esempi di evento, perché sono scritti solo per inviare messaggi di test nella console Lambda. Per utilizzare gli esempi per i test nella console Lambda, è necessario modificare la chiave del messaggio eventType in notificationType . Se non modifichi la chiave del messaggio, il test fallisce.

Scarica un report da DynamoDB per visualizzare le notifiche di Amazon SES

Per interrogare, ordinare e scaricare il contenuto della tabella DynamoDB come file.csv, completa i seguenti passaggi:

1.    Apri la console DynamoDB, quindi scegli la tabella SESNotifications.

2.    Scegli la scheda Elementi.

3.    Crea una ricerca Query o Scansione. Per ulteriori informazioni, consulta Best practice per eseguire query e scansioni dei dati.

**Nota:**Puoi utilizzare l'esportazione delle tabelle DynamoDB per pianificare il download del file in un bucket Amazon Simple Storage Service (Amazon S3) a intervalli regolari. Per ulteriori informazioni, consulta Esportazione dei dati DynamoDB in Amazon S3: come funziona.

Informazioni correlate

Funzioni da Fanout a Lambda

Richiamare funzioni AWS Lambda tramite Amazon SNS

Ricezione di notifiche Amazon SES di Amazon utilizzando Amazon SNS

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa