¿Cómo almaceno las notificaciones de Amazon SNS sobre correos electrónicos de Amazon SES en DynamoDB con Lambda?

9 minutos de lectura
0

Uso Amazon Simple Notification Service (Amazon SNS) para recibir notificaciones sobre correos electrónicos enviados a través de Amazon Simple Email Service (Amazon SES). Quiero configurar una función de AWS Lambda para almacenar estas notificaciones en una tabla de Amazon DynamoDB.

Resolución

Nota: Los ejemplos de código de los siguientes pasos solo funcionan con una versión ejecutable de Lambda de las versiones 16.x y anteriores de Node.js.

(Requisito previo) Configure un correo electrónico o dominio de Amazon SES con un tema de Amazon SNS configurado para recibir notificaciones de Amazon SES

Para obtener más información, consulte Recepción de notificaciones de Amazon SES con Amazon SNS.

Crear una tabla de DynamoDB

1.    Cree una tabla en DynamoDB que tenga los siguientes atributos:
En Table-name, introduzca SESNotifications.
En la clave de partición principal, introduzca SESMessageId.
En la clave de ordenación principal, introduzca SnsPublishTime.

2.    Para permitir que Lambda consulte la tabla y cree un informe de Amazon SES, configure los siguientes índices secundarios:

Nombre del índiceClave de particiónClave de ordenación
SESMessageType-IndexSESMessageType (cadena)SnsPublishTime (cadena)
SESMessageComplaintType-IndexSESComplaintFeedbackType (cadena)SnsPublishTime (cadena)

Nota: Puede añadir más índices secundarios según sea necesario.

Para obtener información sobre cómo crear una tabla en DynamoDB, consulte Creación de una tabla de DynamoDB.

Añadir permisos al rol de IAM de la función de Lambda que le permitan llamar a la tabla de DynamoDB

Cree un nuevo rol de AWS Identity and Access Management (IAM). Configure el rol para permitir que la función de Lambda llame a la API DynamoDB:PutItem:

Nota: Se recomienda crear y usar un nuevo rol de IAM para diferentes funciones de Lambda. Evite reutilizar roles en varias funciones.

1.    En el panel de navegación de la consola de IAM, elija Roles.

2.    Elija Crear rol.

3.    En Seleccionar el tipo de entidad de confianza, elija Servicio de AWS.

4.    En Elegir un caso de uso, elija Lambda. A continuación, elija Siguiente: Permisos.

5.    En Asociar políticas de permisos, marque la casilla de verificación situada junto a la política administrada AWSLambdaBasicExecutionRole. A continuación, elija Siguiente: Etiquetas.

6.    (Opcional) Añada etiquetas de IAM al rol para su caso de uso. Para obtener más información, consulte Etiquetado de recursos de IAM.

7.    Elija Siguiente: Revisar.

8.    En Role name*, introduzca lambda_ses_execution.

9.    Elija Crear rol.

10.    Vuelva a la vista Roles de IAM y, a continuación, elija el rol que creó.

11.    En la pestaña Permisos, elija Añadir política en línea.

12.    En la pestaña Editor visual, seleccione Elegir un servicio.

13.    Elija DynamoDB.

14.    En el campo de búsqueda Acciones, introduzca PutItem. En la lista desplegable que aparece, marque la casilla de verificación situada junto a PutItem.

15.    En Recursos, elija Específico.

16.    Elija Agregar ARN. A continuación, en el cuadro de texto que aparece, introduzca el nombre de recurso de Amazon (ARN) de la tabla de DynamoDB.

17.    Elija Revisar política.

18.    En Nombre, introduzca un nombre para la política.

19.    Elija Crear política.

Ejemplo de política de IAM en línea que otorga acceso a una tabla de DynamoDB

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

Crear una función de Lambda para procesar las notificaciones de Amazon SES y Amazon SNS

Utilice el siguiente código de función de ejemplo para crear una función de Lambda denominada sesnotificationscode. Puede utilizar el siguiente ejemplo de función de Lambda como plantilla para escribir datos en un sistema de administración de las relaciones con los clientes (CRM) u otros destinos.

Importante: Asegúrese de asignar el rol lambda_ses_execution a la función.

Ejemplo de código de función de Lambda que comprueba si hay notificaciones de Amazon SNS e introduce las notificaciones de Amazon SES asociadas en una tabla de 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: Sustituya el parámetro TableName SESNotifications por el nombre de la tabla de DynamoDB.

Suscribir la función de Lambda a uno o varios temas de Amazon SNS

Usar la consola de Amazon SNS

Debe añadir manualmente los permisos a la política de recursos de la función para permitir que SNS invoque la función. Para añadir estos permisos, ejecute el siguiente comando de AWS CLI:

Nota: Si recibe errores al ejecutar los comandos de AWS CLI, asegúrese de utilizar la versión más reciente de AWS CLI.

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: Sustituya los valores my-function, sns-my-topic y arn:aws:sns:us-east-1:123456789012:my-topic por el ID de su función, tema y ARN completo.

Después de añadir los permisos necesarios, siga estos pasos para suscribir la función a un tema de SNS.

1.    En el panel de navegación de la consola de Amazon SNS, elija Temas.

2.    Identifique el tema de SNS que se utiliza en Amazon SES para las notificaciones de rebote. Por ejemplo: Un tema de SNS denominado ses_notifications_repo.

3.    Elija el ARN del tema de SNS. Se abrirá la página Detalles del tema.

4.    Elija Crear suscripción.

5.    En Protocolo, elija AWS Lambda.

6.    En Punto de conexión, introduzca el ARN de la función de Lambda.

7.    Elija Crear suscripción.

8.    (Opcional) Repita los pasos 1 a 7 para cada tema de notificación adicional al que desee suscribir la función.

Usar la consola de Lambda

1.    Abra la página Funciones en la consola de Lambda.

2.    Elija la función de Lambda que haya creado.

3.    En el panel Información general de la función, elija +Agregar desencadenador.

4.    En la lista desplegable Configuración del desencadenador, elija SNS. Aparecerá un panel de configuración.

5.    En la lista desplegable Tema de SNS, elija el tema de SNS al que desee suscribir la función.

6.    Elija Añadir.

7.    (Opcional) Repita los pasos 1 a 6 para cada tema de notificación adicional al que desee suscribir la función.

Probar la configuración: enviar un mensaje de Amazon SES para invocar la función de Lambda

Para enviar un mensaje de prueba de Amazon SES, utilice una de las direcciones disponibles del simulador de bandeja de correo.

Nota: Al enviar mensajes de prueba, el uso de una de las direcciones del simulador de bandeja de correo evita un impacto negativo en las métricas de capacidad de entrega de SES.

Al enviar el mensaje de prueba, Amazon SES publica una notificación en el tema de SNS. A continuación, Amazon SNS entrega la notificación a Lambda como un objeto de notificación de eventos de SES con escape de JSON en el objeto de evento de SNS.

Para utilizar la consola de Lambda con el fin de crear eventos de muestra para realizar pruebas locales, consulte Ejemplos de datos de eventos que Amazon SES publica en Amazon SNS.

Importante: No se pueden utilizar estos ejemplos de datos de eventos tal como están escritos para enviar mensajes de prueba en la consola de Lambda. Para utilizar los ejemplos con el fin de realizar pruebas en la consola de Lambda, debe cambiar la clave de mensaje eventType a notificationType. Si no cambia la clave de mensaje, no se superará la prueba.

Descargar un informe de DynamoDB para ver las notificaciones de Amazon SES

Para consultar, ordenar y descargar el contenido de la tabla de DynamoDB como un archivo .csv, siga estos pasos:

1.    Abra la consola de DynamoDB y, a continuación, elija la tabla SESNotifications.

2.    Elija la pestaña Elementos.

3.    Cree una búsqueda de consulta o análisis. Para obtener más información, consulte Prácticas recomendadas para consultar y analizar datos.

Nota: Puede utilizar la exportación de tablas de DynamoDB para programar una descarga del archivo en un bucket de Amazon Simple Storage Service (Amazon S3) a intervalos regulares. Para obtener más información, consulte Exportación de datos de DynamoDB a Amazon S3: funcionamiento.

Información relacionada

Distribución ramificada en funciones de Lambda

Invocación de funciones de AWS Lambda a través de Amazon SNS

Recepción de notificaciones de Amazon SES con Amazon SNS

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año