Amazon Web Services 한국 블로그

Amazon SES 기반 대량 메일 반송 처리 자동화

서양 격언 중 ‘Don’t reinvent the wheel.’이라는 말이 있습니다. ‘바퀴를 다시 발명하지 마라.’라는 이 말은 이미 만들어져서 잘 되고 있는 것을 처음부터 다시 만들 필요는 없다는 의미입니다. 즉, 불필요하게 처음부터 다시 시작하지 말라는 것을 강조하는 말입니다.

AWS는 여러분이 꼭 사용해야 하지만, 새로 만들 필요 없는 다양한 애플리케이션 서비스를 제공합니다. 그 중에 대용량 메일을 보낼 때, 유용하게 사용할 수 있는 Amazon Simple Email Service가 있습니다.  Amazon SES는 대용량 메일 전송에 따른 확장성이 우수하고, 비용 효율적인 이메일 서비스입니다. 아마존이 가지는 공신력에 기반하기 때문에, 사설로 메일로 보내는 것보다 상대적으로 블록 당할 우려가 적으면서 동시에 대량 메일을 발송 처리 할 수 있습니다.

AWS 고객 중 사용자에게 제공할 각종 뉴스 제공 뿐 아니라, 로그인 계정을 생성하거나 인증을 할 때 메일을 통해서 진행하는 경우가 많고, Amazon SES는 가장 좋은 선택 사항입니다.

Amazon SES를 통해 대량 메일을 전송하는 경우, 한가지 주의점은 바로 반송(Bounce)되는 메일 주소에 대한 관리입니다. 너무 높은 반송률이 일정 기간 지속되면, 미리 사전 안내를 하고 그래도 지속되면 해당 계정을 차단하게 됩니다.

특히, 글로벌 대상 게임 서비스를 하는 경우, 메일 전송 대상이 블록 되기 쉬운 중국 지역이거나 기타 관리되지 않는 메일 계정으로 대량 발송되는 경우 반송이 많이 발생할 수 있는데, 해당 메일 계정으로 다시 발송 되지 않도록 하는 것이 중요합니다. 이를 위해서는 발송 메일 리스트를 적절하게 DB화해서 관리하는 것과 더불어 반송 메일의 리스트를 추출해서 발송 메일 리스트 DB에 반영하는 자동화된 관리가 필요합니다.

이번 글에서는 반송 메일의 구조와 그것을 자동화하기 위한 접근 방안을 살펴보겠습니다.

반송 메일 시뮬레이션
Amazon SES에서는 반송 메일을 시뮬레이션 할 수 있는 기능이 존재합니다. 간단한 설정을 거쳐 도메인명을 등록할 수도 있고, 개별 이메일 주소를 등록해서 사용할 수도 있습니다. 여기서는 반송 메일을 확인해 보기 위해서 간단히 메일 주소를 등록하도록 합니다. 본인이 테스트를 할 수 있는 메일 계정을 그림 1과 같이 등록을 합니다.


[그림 1] 이메일 주소 등록

메일을 등록하고 나면, 해당 메일 주소로 확인을 위한 링크 메일이 옵니다. 링크를 클릭하고 나면 메일 계정은 “확인됨 (verified)”으로 바뀝니다.


[그림2] 확인됨으로 변경된 이메일 주소

반송 시뮬레이션은 간단합니다.

메일 주소를 클릭하면 상세 정보 화면이 나오는데, 알림(Notification) 항목에서 원하는 반송 메일에 대한 SNS 알림을 구성할 수 있습니다. 여기에는 피드백, 불만 메일 등이 포함됩니다. 여기서는 단순히 반송(Bounce) 메일에 대한 SNS 토픽을 구성하도록 합니다.


[그림3] 다양한 알림의 구성

Edit버튼을 눌러 반송에 대한 SNS 토픽을 지정하면 되는데, 그를 위해서 미리 SNS 토픽을 생성하면 됩니다. 생성한 토픽을 설정에서 등록하면 되는데, 그림 4 처럼 설정하면 됩니다.


[그림 4] 반송에 대한 SNS 토픽 지정

토픽을 지정하고 난 다음, 반송 메일 테스트를 진행할 수 있습니다. AWS는 테스트를 위한 메일 주소를 제공하는데, 다음 링크를 보면 몇 가지 시뮬레이션을 위한 테스트 메일 계정이 제공됩니다.

▶ SES 이메일 전송 테스트: http://docs.aws.amazon.com/ko_kr/ses/latest/DeveloperGuide/mailbox-simulator.html

5개의 이메일 주소가 제공되는데, 반송 메일을 위한 주소는 bounce@simulator.amazonses.com 입니다. “Send a Test Email” 버튼을 눌러서 그림 5와 같이 반송 테스트 메일로 주소를 보내면 SNS 토픽에 지정된 구독자로 메시지가 전달됩니다.


[그림 5] 반송 시뮬레이션

반송 메시지를 보면 아래 내용과 같습니다.

{
    "notificationType":"Bounce",
    "bounce":{
        "bounceSubType":"General",
        "bounceType":"Permanent",
        "reportingMTA":"dsn; a8-52.smtp-out.amazonses.com",
        "bouncedRecipients":[
            {
                "action":"failed",
                "emailAddress":"bounce@simulator.amazonses.com",
                "status":"5.1.1",
                "diagnosticCode":"smtp; 550 5.1.1 user unknown"
            }
        ],
        "timestamp":"2016-04-14T03:32:10.835Z",
        "feedbackId":"0100015412d37d6e-0db83713-bf1f-4d7d-8042-8f0c970ea69e-000000"
    },
    "mail":{
        "timestamp":"2016-04-14T03:32:10.000Z",
        "source":"seanparkxxxx@gmail.com",
        "sourceArn":"arn:aws:ses:us-east-1:55062xxxxxxx1:identity/seanparkxxxx@gmail.com",
        "messageId":"0100015412d37b9d-05f93ae2-7bff-44c0-a17e-873fa090b77e-000000",
        "destination":[
            "bounce@simulator.amazonses.com"
        ],
        "sendingAccountId":"550622xxxxx1"
    }
}

여기까지는 반송 시뮬레이션을 위한 간단한 튜토리얼에 해당합니다. 이제 자동 처리를 위해서는 이러한 메시지를 구분해서 특정 저장소에 저장하는 것이 바람직합니다. 우리는 이 메시지를 Amazon DynamoDB에 저장해서 사용하도록 합니다.

반송 메일 자동 저장 하기
여기서는 자동화를 위해서 SNS 토픽을 생성하고, 이 토픽이 AWS Lambda 함수를 호출해서 DynamoDB에 메시지를 저장하도록 할 예정입니다.

이러한 각 서비스의 생성을 위해서 CloudFormation을 통해 생성을 합니다. 다음 링크의 CloudFormation 템플릿을 다운 받아 사용하십시오.

CloudFormation 템플릿의 내용을 전체 소스를 설명하기 보다는 필요한 내용만 살펴보도록 합시다. 먼저 람다 함수를 위해서는 실제 람다의 구현 소스와 LamdaExecutionRole 그리고 LambdaInvokePermission이 필요하다.

아래 소스 코드 구조는 이러한 내용을 담고 있습니다.

"PushSNSTopicToDDBFucntion": {
      "Type": "AWS::Lambda::Function",
…
    },
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      …
        }]
      }
    },    
    "LambdaInvokePermission": {
      "Type": "AWS::Lambda::Permission",
      "Properties": {
        …
      }
    },

그 다음에는 DynamoDB 테이블을 지정하고 있습니다. DynamoDB의 경우, 키 스키마에 쓰일 속성을 정해 주어야 합니다. 또한, 키 스키마의 경우 HASH, RANGE는 순서대로 기술해야 하며 그 순서가 뒤바뀌면 에러를 내보냅니다.

이 템플릿을 실행해서 서비스를 생성하고, 생성된 토픽만 SES에서 연결해 봅시다. 그림 6은 템플릿을 생성할 때의 파라미터입니다. DynamoDB의 읽기/쓰기 용량을 지정할 수 있는데, 기본 값은 5입니다.


[그림 6] 템플릿의 파라미터 설정

그런 이후 시뮬레이터를 실행하면 DynamoDB에 그림 7과 같이 메시지들이 들어가 있는 것을 확인할 수 있습니다.


[그림 7] 반송 메시지의 DynamoDB 입력 모습

자동화를 위해 CloudFormation으로 SES 토픽, 람다 함수 그리고 DynamoDB 테이블을 생성하여 반송 메일 메시지를 저장하도록 하였습니다. 이제 여러분이 조금만 수정을 하면 반송 메일을 효율적으로 수집하고 처리할 수 있는 자동화 구성이 가능하게 됩니다.

예를 들어, SQS를 이용해서 반송 메일 주소를 처리하게 하는 방법을 사용하거나, 람다 함수를 수정해서 RDB에 업데이트를 하는 방법도 가능할 것입니다.

본 글은 아마존웹서비스 코리아의 솔루션즈 아키텍트가 국내 고객을 위해 전해 드리는 AWS 활용 기술 팁을 보내드리는 코너로서, 이번 글은 박선용 솔루션즈 아키텍트께서 작성해주셨습니다.