Sarath 씨가 SES의 SNS 알림을
DynamoDB에 저장하는 방법을
안내합니다.

lambda-sns-ses-dynamodb-sarath

Amazon Simple Notification Service(Amazon SNS)를 사용하여 Amazon Simple Email Service(Amazon SES)를 통해 전송되는 이메일의 반송 메일, 불만 및 전송에 대한 알림을 수신합니다. 이러한 알림을 AWS Lambda를 사용하여 Amazon DynamoDB 데이터베이스에 저장하려고 합니다. 어떻게 해야 합니까?

Amazon SNS를 통해 Amazon SES 알림을 구성한 후 AWS Lambda 함수를 사용하여 이러한 알림을 DynamoDB 데이터베이스에 쓸 수 있습니다. 그런 다음 DynamoDB 데이터베이스에서 이러한 알림을 CSV 파일로 다운로드할 수 있습니다.

참고: 이 샘플에 생성된 Lambda 함수를 템플릿으로 사용하여 메일 그룹을 호스팅하는 위치에 따라 CRM 또는 기타 대상에 데이터를 쓸 수 있습니다.

Lambda 함수를 사용하여 SES의 SNS 알림 콘텐츠를 DynamoDB 데이터베이스에 저장하려면 아래의 각 단계를 완료하십시오.

  1. DynamoDB 테이블을 생성합니다.
  2. DynamoDB 테이블에 쓸 수 있도록 Lambda IAM 역할에 대한 권한을 추가합니다.
  3. SES 반송 메일 알림을 처리하는 Lambda 함수를 생성합니다.
  4. Lambda 함수에서 하나 이상의 주제를 구독합니다.
  5. SNS의 함수 호출을 허용하도록 함수 권한을 업데이트합니다.
  6. Lambda 함수를 호출하는 SES 메시지를 전송하여 설정을 테스트합니다.
  7. DynamoDB에서 보고서를 다운로드하여 SES 알림을 확인합니다.

사전 조건

  • DynamoDB 데이터베이스에 대한 읽기 및 쓰기 액세스 권한을 허용합니다.
  • SES 계정(이메일 또는 도메인)을 설정한 후 계정을 확인하고 SES 알림을 수신하도록 구성된 SNS 주제를 계정에 포함합니다. SNS를 사용한 SES 알림 수신에 대한 자세한 내용은 Amazon SNS를 통한 Amazon SES 알림을 참조하십시오.

1. DynamoDB 테이블 생성

DynamoDB에 SESNotifications라는 이름의 테이블을 기본 파티션 키 SESMessageId 및 기본 정렬 키 SnsPublishTime을 사용하여 생성합니다.

테이블을 쿼리하고 SES 보고서를 생성하려면 아래의 표에 설명된 대로 알림 유형 및 불만 유형 보조 인덱스를 설정합니다. 필요에 따라 추가 인덱스를 추가할 수 있습니다.

인덱스 이름 파티션 키 정렬 키
SESMessageType-Index SESMessageType(문자열) SnsPublishTime(문자열)
SESMessageComplaintType-Index SESComplaintFeedbackType(문자열) SnsPublishTime(문자열)

DynamoDB 테이블 생성에 대한 자세한 내용은 Amazon DynamoDB 시작하기를 참조하십시오.

2. DynamoDB 테이블에 쓸 수 있도록 Lambda IAM 역할에 대한 권한 추가

Lambda 함수에서 사용할 새로운 AWS Identity and Access Management(IAM) 역할을 생성합니다. Lambda 함수가 DynamoDB:PutItem API를 호출할 수 있도록 하는 역할을 생성해야 합니다.

참고: 모범 사례는 서로 다른 Lambda 함수에 대해 새로운 IAM 역할을 생성하고 사용하는 것입니다. 여러 함수에서 역할을 재사용하지 마십시오.

  1. IAM 콘솔의 탐색 창에서 [Roles]를 선택한 다음, [Create Role]을 선택합니다.
  2. [AWS service] 신뢰할 수 있는 엔터티 유형을 선택하고 [Lambda]를 선택한 다음 [Next: Permissions]를 선택합니다.
  3. [AWSLambdaBasicExecutionRole] 관리형 정책을 선택하고 [Next]를 선택합니다.
  4. [lambda_ses_execution] 역할에 대한 이름을 제공한 다음 역할 생성을 완료합니다.
  5. [IAM Roles] 보기로 돌아가서 생성한 역할을 선택합니다.
  6. [Add an Inline Policy]를 선택합니다.
  7. Visual Editor에서 [Service DynamoDB]를 선택하고 [Write] 범주에서 PutItem 작업을 선택합니다. [Resources]에서 [Add ARN]을 선택한 다음 이전에 생성한 DynamoDB 테이블 ARN을 제공합니다.
  8. [Review]를 선택하고 정책 이름을 제공한 다음 [Create policy]를 선택합니다.

다음 예제는 lambda_ses_execution 역할에 추가되어 1단계에서 생성한 DynamoDB 데이터베이스 us-east-1:12345678912:table/SESNotifications에 대한 액세스 권한을 부여하는 인라인 정책 문을 보여줍니다.

------------------------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. SES 반송 메일 알림을 처리하는 Lambda 함수 생성

Lambda 콘솔을 사용하여 sesnotificationscode라는 이름의 Lambda 함수를 생성합니다.

함수를 생성할 때 이전에 생성한 lambda_ses_execution 역할을 선택합니다.

다음 샘플 코드를 사용하여 새 함수를 설정합니다. 이 샘플 코드는 Amazon SES의 Amazon SNS 알림 예에 설명된 것과 같이 세 가지 유형의 SNS 알림을 확인하고 SES 알림을 DynamoDB 테이블의 항목에 삽입합니다.

참고: 다음 샘플 코드에서 TableName 파라미터 SESNotifications의 값을 생성한 테이블 이름으로 바꾸십시오.

--------------------------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. Lambda 함수에서 하나 이상의 주제 구독

하나 이상의 SNS 주제를 이미 생성했고 해당 SNS 주제를 피드백 알림에 사용하도록 SES 이메일 도메인을 구성한 것으로 가정하고 다음 단계를 수행하십시오.

  1. SNS 콘솔 탐색 창에서 [Topics]를 선택합니다. SES의 반송 메일에 사용되는 SNS 주제를 식별합니다(예: ses_notifications_repo라는 이름의 SNS 주제).
  2. SNS 주제의 ARN을 선택하여 [Topic Details] 페이지를 엽니다.
  3.     [Create subscription]을 선택합니다.
  4.     [Protocol]에서 AWS Lambda를 선택합니다.
  5. [Endpoint]에 Lambda 함수의 ARN을 입력한 다음 [Create Subscription]을 선택합니다. Lambda를 프로토콜로 사용하고 Lambda 함수 ARN을 엔드포인트로 사용하는 구독이 생성됩니다.

5. SNS의 함수 호출을 허용하도록 함수 권한을 업데이트

이전 단계에서 주제에 대한 Lambda 구독을 생성할 때 SNS 콘솔을 사용하지 않은 경우 Lambda 콘솔을 사용하여 수동으로 트리거를 생성할 수 있습니다.

  1. 함수에 대한 Lambda 콘솔의 [Designer] 트리거 목록에서 SNS 트리거를 추가합니다. [Designer] 아래에 구성 패널이 나타납니다.
  2. 구성 패널의 드롭다운 목록에서 주제를 선택합니다.

이 프로세스를 반복하여 Lambda 함수에서 구독할 서로 다른 알림 주제를 추가합니다.

6. Lambda 함수를 호출하는 SES 메시지를 전송하여 설정 테스트

이제 Lambda 함수가 SNS 주제를 구독합니다. 다음 단계는 SES 메시지를 게시하고 Lambda 콘솔에서 Lambda 함수가 호출되는지 확인하는 것입니다. SES 콘솔을 사용하여 테스트 메시지를 전송할 수 있습니다.

테스트 메시지를 전송할 때 사용 가능한 메일박스 시뮬레이터 주소 중 하나를 사용하면 SES 전송 가능성 지표에 부정적인 영향을 미치지 않고 테스트 메시지를 전송할 수 있습니다. 자세한 내용은 Amazon SES 이메일 전송 테스트를 참조하십시오.

SES 메시지가 전송된 후 SES가 SNS 주제에 알림을 게시합니다. SNS는 이 알림을 SNS 이벤트 개체의 JSON 이스케이프 SES 이벤트 알림 개체로 Lambda에 전송합니다.

Lambda 콘솔을 사용하여 로컬 테스트용의 샘플 이벤트를 생성하려면 Amazon SES 이메일 수신 샘플 이벤트를 참조하십시오.

SES 반송 메일, 불만 및 전송 알림에 대한 예는 Amazon SES의 Amazon SNS 알림 예를 참조하십시오.

7. DynamoDB에서 보고서를 다운로드하여 SES 알림 확인

DynamoDB 콘솔을 사용하여 테이블의 콘텐츠를 쿼리 및 정렬하고 CSV 파일로 다운로드할 수 있습니다.

  1. DynamoDB 콘솔에서 [SESNotifications] 테이블을 선택합니다.
  2. [Items] 탭으로 이동합니다.
  3. [Query] 또는 [Scan] 검색을 생성합니다.

자세한 내용은 Amazon DynamoDB란?을 참조하십시오. 또한 규정 준수 및 레코드 유지를 위해 AWS Data Pipeline을 사용하여 Amazon Simple Storage Service(Amazon S3) 버킷에 정기적인 간격으로 파일을 다운로드하도록 예약할 수 있습니다. 자세한 내용은 DynamoDB 테이블을 S3로 내보내기2부: DynamoDB에서 데이터 내보내기를 참조하십시오. 


페이지 내용이 도움이 되었습니까? | 아니요

AWS 지원 지식 센터로 돌아가기

도움이 필요하십니까? AWS 지원 센터를 방문하십시오.

게시된 날짜: 2018년 6월 13일

업데이트된 날짜: 2018년 7월 9일