Como faço para armazenar notificações do Amazon SNS para e-mails do Amazon SES no DynamoDB usando o Lambda?

8 minuto de leitura
0

Uso o Amazon Simple Notification Service (Amazon SNS) para receber notificações sobre e-mails enviados por meio do Amazon Simple Email Service (Amazon SES). Quero configurar uma função do AWS Lambda para armazenar essas notificações em uma tabela do Amazon DynamoDB.

Resolução

Observação: os exemplos de código nas etapas a seguir funcionam somente com um tempo de execução do Lambda das versões 16.x e anteriores do Node.js.

(Pré-requisito) Configure um e-mail ou domínio do Amazon SES com um tópico do Amazon SNS configurado para receber notificações do Amazon SES

Para obter mais informações, consulte Receber notificações do Amazon SES usando o Amazon SNS.

Criar uma tabela do DynamoDB

1.    Crie uma tabela no DynamoDB que tenha os seguintes atributos:
Para o Nome da tabela, insira SESNotifications.
Para a Chave de partição primária, insira sesMessageID.
Para a Chave de classificação primária, insira SNSPublishTime.

2.    Para permitir que o Lambda consulte a tabela e crie um relatório do Amazon SES, configure os seguintes índices secundários:

Nome do índiceChave de partiçãoChave de classificação
SESMessageType-IndexSESMessageType (String)SnsPublishTime (String)
SESMessageComplaintType-IndexSESComplaintFeedbackType (String)SnsPublishTime (String)

Observação: você pode adicionar mais índices secundários conforme necessário.

Para obter informações sobre como criar uma tabela no DynamoDB, consulte Criar uma tabela do DynamoDB.

Adicione permissões ao perfil do IAM da sua função do Lambda para que ela chame a tabela do DynamoDB

Crie um perfil do AWS Identity and Access Management (IAM). Configure o perfil para permitir que sua função do Lambda chame a API DynamoDB:PutItem:

Observação: é uma prática recomendada criar e usar um novo perfil do IAM para diferentes funções do Lambda. Evite reutilizar perfis em várias funções.

1.    No painel de navegação do console do IAM, escolha Perfis.

2.    Escolha Criar perfil.

3.    Em Selecionar tipo de entidade confiável, escolha Serviço da AWS.

4.    Em Escolher um caso de uso, escolha Lambda. Em seguida, escolha Próximo: Permissões.

5.    Em Anexar políticas de permissões, escolha a caixa de seleção ao lado da política gerenciada AWSLambdaBasicExecutionRole. Em seguida, escolha Próximo: Tags.

6.    (Opcional) Adicione tags do IAM ao perfil para seu caso de uso. Para obter mais informações, consulte Marcar recursos do IAM.

7.    Escolha Próximo: Revisar.

8.    Em Nome do perfil*, insira lambda_ses_execution.

9.    Escolha Criar perfil.

10.    Volte para a visualização Perfis do IAM e escolha o perfil que você criou.

11.    Na guia Permissões, escolha Adicionar política em linha.

12.    Na guia Editor visual, selecione Escolher um serviço.

13.    Escolha DynamoDB.

14.    No campo de pesquisa Ações, insira PutItem. Na lista suspensa exibida, escolha a caixa de seleção ao lado de PutItem.

15.    Em Recursos, escolha Específico.

16.    Escolha Adicionar ARN. Em seguida, na caixa de texto exibida, insira Nome do recurso da Amazon (ARN) da tabela do DynamoDB.

17.    Escolha Analisar política.

18.    Em Nome, insira um nome para a política.

19.    Escolha Criar política.

Exemplo de política de IAM em linha que concede acesso a uma tabela do DynamoDB

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

Crie uma função do Lambda para processar as notificações do Amazon SES e do Amazon SNS

Use o código de função de exemplo a seguir para criar uma função do Lambda chamada sesnotificationscode. Você pode usar o exemplo de função Lambda a seguir como modelo para gravar dados em um sistema de gerenciamento de relacionamento com o cliente (CRM) ou em outros destinos.

Importante: certifique-se de atribuir o perfil lambda_ses_execution à função.

Exemplo de código de função Lambda que verifica as notificações do Amazon SNS e coloca as notificações associadas do Amazon SES em uma tabela do 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,'')
      }
    });
  }
};

Observação: substitua o parâmetro TableName SESNotifications pelo nome da sua tabela do DynamoDB.

Inscreva sua função do Lambda em um ou mais tópicos do Amazon SNS

Usar o console do Amazon SNS

Você deve adicionar manualmente permissões à política de recursos da função para permitir que o SNS invoque a função. Para adicionar essas permissões, execute o seguinte comando da AWS CLI:

Observação: se você receber erros ao executar comandos da AWS CLI, verifique se a sua versão da AWS CLI é a mais 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

Observação: substitua os valores my-function, sns-my-topic e arn:aws:sns:us-east-1:123456789012:my-topic pelo ID da sua função, tópico e ARN completo.

Depois de adicionar as permissões necessárias, conclua as etapas a seguir para inscrever sua função em um tópico do SNS.

1.    No painel de navegação do console do Amazon SNS, escolha Tópicos.

2.    Identifique o tópico do SNS usado no Amazon SES para notificações de devolução. Por exemplo: Um tópico do SNS chamado ses_notifications_repo.

3.    Escolha o ARN do tópico do SNS. A página Detalhes do tópico é aberta.

4.    Escolha Criar assinatura.

5.    Para Protocolo, escolha o AWS Lambda.

6.    Para Endpoint, insira o ARN da sua função do Lambda.

7.    Escolha Criar assinatura.

8.    (Opcional) Repita as etapas de 1 a 7 para cada tópico de notificação adicional que você deseja inscrever em sua função.

Usar o console do Lambda

1.    Abra a página Funções no console do Lambda.

2.    Escolha a função do Lambda que você criou.

3.    No painel Visão geral da função, escolha +Adicionar gatilho.

4.    Na lista suspensa Configuração do gatilho, escolha SNS. Um painel de configuração é exibido.

5.    Na lista suspensa Tópico do SNS, escolha o tópico do SNS no qual você deseja inscrever a função.

6.    Escolha Adicionar.

7.    (Opcional) Repita as etapas de 1 a 6 para cada tópico de notificação adicional que você deseja inscrever em sua função.

Teste a configuração: Envie uma mensagem do Amazon SES para invocar sua função do Lambda

Para enviar uma mensagem de teste do Amazon SES, use um dos endereços disponíveis do simulador de caixa de correio.

Observação: quando você envia mensagens de teste, o uso de um dos endereços do simulador de caixa de correio evita um impacto negativo nas métricas de capacidade de entrega do SES.

Quando você envia a mensagem de teste, o Amazon SES publica uma notificação no tópico do SNS. Em seguida, o Amazon SNS entrega a notificação ao Lambda como um objeto de notificação de evento SES com escape JSON no objeto de evento SNS.

Para usar o console do Lambda para criar eventos de amostra para testes locais, consulte Exemplos de dados de eventos que o Amazon SES publica no Amazon SNS.

Importante: você não pode usar esses exemplos de dados de eventos, pois eles são gravados para enviar mensagens de teste no console do Lambda. Para usar os exemplos para testes no console do Lambda, você deve alterar a chave da mensagem eventType para notificationType. Se você não alterar a chave da mensagem, o teste falhará.

Faça o download de um relatório do DynamoDB para ver as notificações do Amazon SES

Para consultar, classificar e baixar o conteúdo da tabela do DynamoDB como um arquivo.csv, realize as seguintes etapas:

1.    Abra o console do DynamoDB e escolha a tabela SESNotifications.

2.    Escolha a guia Itens.

3.    Crie uma pesquisa Consulta ou Leitura. Para obter mais informações, consulte Práticas recomendadas para consultar e escanear dados.

Observação: você pode usar a exportação de tabela do DynamoDB para agendar o download do arquivo em um bucket do Amazon Simple Storage Service (Amazon S3) em intervalos regulares. Para obter mais informações, consulte Exportação de dados do DynamoDB para o Amazon S3.

Informações relacionadas

Fanout para funções do Lambda

Invocar funções do AWS Lambda por meio do Amazon SNS

Receber notificações do Amazon SES usando o Amazon SNS

AWS OFICIAL
AWS OFICIALAtualizada há um ano