72port
  • Articles
  • Projects
  • About

AWS SES를 활용한 이메일 서비스 구축하기 - 2

tech

2 years ago

 

AWS SNS(Simple Notification Service) 는 특정 주제를 구독하고 비동기적으로 통신하여 게시된 메세지를 수신할 수 있는 서비스입니다.

AWS S3(Simple Storage Service) 는 다양한 데이터를 저장하고 보호할 수 있으며 정적 웹 사이트를 호스팅할 수 있는 객체 스토리지입니다.

AWS Lambda 는 서버를 직접 운영할 필요 없이 코드를 실행하여 컴퓨팅 시간 만큼만 비용을 지불하는 서비스입니다.

aws-lambda-ses-forwarder (AWS SES의 인바운드, 아웃바운드 이메일을 포워딩할 수 있는 Node.js 스크립트)

 

목표

이제 반송 이메일에 대한 피드백과 반송률에 대한 Health 체크를 위해 AWS SNS를 설정하여
AWS SES와 연결하고 수신한 이메일을 포워딩하기 위한 AWS S3와 AWS Lambda 설정을 해야 합니다.

 

순서

반송 메일 등록하기
포워딩 설정 하기
이메일 수신 발신 설정하기

 


 

 

반송 메일 등록하기

AWS SES Reputation Dashboard에서는 Account status의 Heath 체크를 할 수 있습니다.
Complaint, Bounce rate 이 좋지 않다면 이메일 발신이 정지되기 때문에 발송한 이메일에 대한 피드백을 받기 위한 AWS SNS를 설정하고 반송률을 잘 관리 해야만 합니다.

 

1. SNS 설정하기

AWS SNS에 접속한다. Create Topic에서 Topic name을 입력하고 Next step을 합니다.

 

image

 

Details 에서 Standard Type을 선택하고 Create 버튼을 클릭해서 Topic을 생성합니다.

 

image

 

SNS 우측 메뉴에서 Subscription을 선택하고 Create Subscription을 클릭합니다.
Topic ARN에는 앞서 설정한 Topic을 설정한다. Protocol에서 Email을 선택한다.
마지막으로 Create Subscription을 클릭하여 Subscription 생성을 완료한다.

 

image

 

2. SES에 SNS 연결하기

좌측 Email Address 에서 등록한 Email을 선택한다.

(Email Address에서 개인 이메일 주소를 등록하고 인증을 완료하면 해당 주소로 이메일을 보내거나 수신할 수 있다. 그리고 Sandbox가 해제되어 있지 않다면 인증받은 도메인과 이메일 주소로만 메일을 보낼 수 있다.)

Verifying email addresses in Amazon SES

 

image

 

Notification 탭에서 Edit Configuration 탭을 클릭한다.

 

image

 

SNS Topic Configuration항목의 Bounces 탭에서 앞서 생성한 SNS Topic 을 선택한다.

 

image

 

Save Config를 클릭하여 Email 반송에 대한 SNS 연결을 완료한다.

 

Email Addresses 메뉴에서 Send a Test Email를 통해 수신 주소로 "bounce@simulator.amazonses.com" 를 입력하여
반송 테스트를 할 수 있습니다.

 

image

 

이제 반송 테스트 메일 주소로 메일을 보내면 반송건에 대한 Notification을 받아볼 수 있습니다.

 

 


 

포워딩 설정 하기

Inbound flow

a. 이메일 수신
b. SES에 설정 된 S3 Action을 통해서 S3에 Bucket에 메일을 저장 (권한 필요)
c. SES에 설정 된 Lambda Action을 통해서 Lambda Function을 호출
d. SNS에 설정한 Topic의 Endpoint(이메일 주소)로 메일이 전달

 

Outbound flow

a. SMTP 계정 정보가 등록 된 이메일 클라이언트에서 이메일을 발신
b. SES의 Rule set을 통하여 Recipient를 등록하고 해당 주소로 이메일을 수신하거나 발신

 

1. S3 설정하기

S3에 접속하고 S3 Bucket을 생성합니다. (S3 Bucket을 생성하는 방법은 생략)
우측의 Buckets 메뉴로 이동하면 생성한 Bucket 목록이 보입니다.
생성한 Bucket 이름을 클릭 하고 Permission 탭으로 이동합니다.

 

Permission 탭에서 확인할 내용은 Block public access 설정과 Bucket policy 설정입니다.
Block public access에서는 Bucket과 Object에 대한 접근 권한을 설정할 수 있는데
AWS S3 기본 설정은 모두 On으로 되어 있으며 튜토리얼을 위해서 임시로 모두 Off로 해두었습니다.

 

image

 

그리고 S3 Bucket에 이메일을 저장할 수 있도록 권한을 부여해야합니다.
아래 JSON 으로 작성 된 코드를 Bucket policy에 추가합니다.

Policies and Permissions in Amazon S3 JSON Policy

 

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "GiveSESPermissionToWriteEmail", //statement ID
      "Effect": "Allow",
      "Principal": {
        "Service": "ses.amazonaws.com"
      },
      "Action": "s3:PutObject", //Adds an object to a bucket
      "Resource": "arn:aws:s3:::BucketName/*",
      "Condition": {
        "StringEquals": {
          "aws:Referer": "Account-ID"
        }
      }
    }
  ]
}

 

Edit 버튼을 누르고 JSON으로 작성된 Policy를 넣으면 해당 Bucket에 권한 부여가 완료됩니다.

 

image

 

 

2. Lambda 설정하기

AWS SES의 Inbound, Outbound 메일을 Forwarding하기 위해서
Node.js로 작성 된 스크립트인 aws-lambda-ses-forwarder를 사용합니다.

 

1.AWS Lambda SES Email Forwarder의 Git repository로 접속하고 다운 받습니다.
2.폴더 내 Index.js의 defaultConfig에 원하는 설정을 입력합니다.

 

var defaultConfig = {
   fromEmail: "no-reply@example.com", #Forwarded emails will come from this verified address
   subjectPrefix: "",
   emailBucket: "BucketName",
   emailKeyPrefix: "emailsPrefix/",
   allowPlusSign: true,
   forwardMapping: {
   "recipient@example.com": [ // 외부에 노출되어 수신 받는 주소
      "smtp@example.com"  // 포워딩을 통해서 수신 받는 주소(Domain address에 등록한 주소)
            ]
      }
   }

3.AWS Lambda 페이지로 이동 4.Create Function(함수 생성) 을 클릭합니다.

 

image

 

5.새로 작성을 선택하고 함수 이름(예: SesForwarder)을 입력, 런타임에는 Node.js 12.x를 선택하고 함수 생성을 클릭합니다.

 

image

 

6.함수 생성 후 Code 탭으로 이동하여 아래 내용을 삭제하고 위에서 작성한 Index.js 를 붙여넣어 배포하면 완료됩니다.

 

image

 

 

3. SES Action 설정하기

다시 SES로 이동하고 Email Receiving 메뉴에서 Rule Sets을 선택합니다.

 

image

 

Create a Receipt Rule을 선택

 

image

 

Lambda에서 작성한 Default config의 forwardMapping 항목에 작성한 "recipient@example.com" (수신 시 사용할 이메일 주소)을 입력하고 Add Recipient를 클릭하여 Recipient를 추가합니다.
그리고 Next Step으로 Actions로 이동합니다.

 

image

 

Add action에서 action type을 S3와 Lambda를 추가합니다.
S3 bucket에는 사용할 S3 bucket를 선택하고,
Object key prefix에는 Lambda function에서 입력했던 Default Config의 "emailKeyPrefix" 항목의 값을 입력합니다.
마지막으로 Lambda는 앞에서 구성한 Lambda function을 선택한 뒤
Next step으로 Rule details로 이동합니다.

 

image

 

Rule name은 적당한 이름으로 입력하시면 됩니다.

 

image

 

 

마지막으로 Review에서 최종적으로 설정한 내용을 확인하고 완료한 뒤 AWS에서의 설정을 마무리합니다.

 


 

 

이메일 수신 발신 설정하기

Gmail에 접속하고 설정 페이지로 이동합니다.
"계정 및 가져오기" 탭으로 이동하여 "다른 주소에서 메일 보내기" 항목에서
"다른 이메일 주소 추가"를 선택합니다.

 

이름에는 사용할 이름을 입력하고 이메일 주소는 앞서 수신 주소로 등록한 이메일 주소를 입력합니다.

 

image

 

SES의 "SMTP Settings" 메뉴에서 SMTP Server Name을 확인할 수 있습니다.
사용자 이름과 비밀번호에 앞서 저장해놓은 SMTP 계정 정보를 입력하고 계정 추가를 완료합니다.

 

image

 

 

지금까지 SES Account Heath를 관리하기 위해서 SNS를 연결하였습니다.
그리고 SES에서 메일을 수신하고 발신하기 위해서 S3 Bucket와 Lambda Function을 생성하고 SES Action에서 이메일이 도착했을 때 S3 Bucket에 메일을 저장하고 Lambda function을 호출하여 이메일 클라이언트로 포워딩 할 수 있게 설정하였습니다.

 

AWS 공식 문서와 다른 블로그를 많이 참고해서 튜토리얼을 완료하였습니다.
이제 GMAIL과 같은 SMTP 지원 이메일 클라이언트에서 AWS SES SMTP에 연결하여 이메일을 보낼 수 있습니다.
다른 방법으로 메일을 발송하고 싶다면 AWS SES의 이메일 전송 방법을 참고하시면 됩니다.

 

 


 

Reference

 

Copyright 2022. 72port all rights reserved.