AWS SES(Simple Email Service) 세팅 및 Gmail 리다이렉션

charming__kyu·6일 전
11
post-thumbnail

Intro

현재 회사에서 사용하고 있는 메일서비스는 후이즈메일을 사용하고 있다. 가격은 월 29,500원 굉장히 사악했다. 사이트 회원가입시 인증 이메일 발송을 개발하기 위해 후이즈메일을 사용하지 말고 nodemailer를 이용해서 gmail로 보낼까? 생각을 했던 와중 자사 도메인 메일을 꼭 사용하고 싶었다. 그럼 직접 SMTP서버를 구축을 해보자! ~~(꼭 인증 메일은 noreply@meum.me로 발송할거야!)~~ 라는 부푼 마음을 가지고 EC2에 구축되어 있는 Ubuntu(18.04)에 postfix를 설치하기 시작했다. 테스트 도중 자꾸 오류가 뜨길래 확인 결과 "AWS는 기본적으로 모든 EC2 인스턴스에서 포트 25(SMTP) 에서 아웃바운드 트래픽을 차단합니다. 포트 25에서 아웃바운드 트래픽을 전송하려는 경우 이 제한을 제거하도록 요청할 수 있습니다." 라는 글을 AWS에서 확인을 했다. ~~먼저 확인 좀 하지..~~ 따로 AWS에 요청을 해야한다는 생각에 덜컥 겁이 났다. 그리고 SMTP서버를 직접 구축을 할 경우 스팸으로 분류되지 않기 위해 DKIM, SSL/TLS 설정을 직접 해야한다는 무시무시한 일들이 나를 기다리고 있었다. 나는 바로 눈을 돌려 AWS SES(Amazon Simple Email Service) 를 찾게되었다. 오늘은 나의 AWS SES 구축 및 Gmail 연동 ~~삽질~~ 과정을 소개하고자 한다.


요구 사항

  1. XXX@meum.me 계정으로 이메일이 수신될 경우, 미리 정해놓은 gmail 계정으로 송신한다.
  2. gmail 계정에서 XXX@meum.me 계정으로 이메일 발송이 가능해야 한다.
  3. *@meum.me 계정에 수신되는 모든 이메일은 전달과 별개로 AWS S3 Bucket에 안전하게 저장되어야 한다.

준비물

1. 도메인


목차

1. SES Domain 인증
2. SES Email 인증
3. S3 Bucket 생성
4. Lambda 함수 생성
5. Email Receiving Rule 생성
6. 테스트


SES Domain 인증

먼저 인증을 하기 전 알아야 할 것이 있다. AWS에서 제공하는 SES(Amazon Simple Email Service)는 이메일 발송은 어느 Region에서든 지원하지만 이메일 수신은 한정된 Region에서만 가능하다. 해당 지역은 Amazon SES 및 리전을 확인하기 바란다. 필자의 EC2서버는 서울에 있지만 SES는 이메일 수신이 가능한 미국 동부(버지니아 북부)-US East (N. Virginia) Region을 선택했다.

AWS Service에서 에서 Domains탭에서 Verify a New Domain을 한 뒤 도메인을 적어준다. 인증시 꼭 Generate DKIM Settings를 체크해준다. (DKIM을 설정해야 스팸메일로 분류되지 않을 확률이 높음) 그 뒤 알려주는 값들을 도메인 관리 사이트에서 추가해준다.

해당 사진은 예제를 위해 test.com의 도메인 인증을 시도했다. Domain Verification Recoed 1개, DKIM Record Set 3개, Email Receiving Record 1개, 총 6개의 값을 추가해 줘야 한다. 여기서 내가 겪은 오류는 Email Receiving Record 의 value="10 inbound-smtp.us-east-1.amazonaws.com" 값을 그대로 대입을 해서는 안된다. Email Receiving Record 의 값을 설정할때에는 값(value)과 함께 순위(priorty) 값도 함께 넣게 되는데 꼭 value="inbound-smtp.us-east-1.amazonaws.com" priorty=10 으로 변경해 줘야 한다. 도메인 관리 사이트에서 설정이 끝나게 된다면 아래와 같이 나온다.

바로 적용이 되지 않았다면 3분정도 기다리면 verified로 변경된다.

SES Email 인증

다음은 Email Addresses 탭으로 이동 후 Verify a New Email Address 한다. 이메일 주소를 적고 해당 이메일 인증을 하는 작업이다. 인증이 완료된다면 위 사진과 같이 상태가 변경된다.

잠깐
왜 이메일 인증을 할까?
이유는 AWS SES Sandbox 를 읽어보기 바란다.

S3 Bucket 생성

AWS S3 서비스로 이동 후 버킷을 생성한다. Region은 SES와 같은 미국 동부(버지니아 북부)-US East (N. Virginia) Region을 선택했다. 새로 만드는 버킷의 이름은 mailbox 라고 지정하겠다.

생성한 버킷 루트에 box 폴더를 하나 만든다.

그 뒤 권한 > 버킷 정책 을 편집한다. JSON형식으로 되어있는 정책을 아래의 값을 넣는다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GiveSESPermissionToWriteEmail",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::새로만든버킷이름/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "내계정ID"
                }
            }
        }
    ]
}

"새로만든버킷이름"과 "내계정ID"는 직접 수정해서 붙여 넣어야 한다. 참고로 내 계정아이디는 아래 사진의 값이다.

Lambda 함수 생성

  1. aws-lambda-ses-forwarder의 코드를 내려받거나 클론한다.
  2. index.js에 있는 defaultConfig값을 본인에게 알맞게 수정한다.
    fromEmail: 내 gmail로 전달할 때 활용할 송신자 이메일 주소 ex) "bot@test.com"
    emailBucket: 이메일을 저장할 S3 버킷 이름 ex) "mailbox"
    emailKeyPrefix: 상단에 적은 emailBucket라는 이름의 S3 버킷에서 저장될 위치의 폴더 ex) "box/"
    forwardMapping: 어느 이메일로 메일이 오면 어디로 보낼지에 대한 매핑.
    필자는 아래와 같이 설정했다.
var defaultConfig = {
  fromEmail: "noreply@test.com",
  subjectPrefix: "",
  emailBucket: "mailbox", 
  emailKeyPrefix: "box/", 
  forwardMapping: {
    "ceo@test.com": [
      "myRealId@gmail.com"
    ]
  }
};
  1. AWS 람다에서 새로운 함수를 생성한다. 새로 작성을 선택하고, 이름은 “SesForwarder”와 같이 본인이 알아볼 수 있게 적당히 지어준다. 런타임은 Node.js 12.x을 선택한다. 역할은 사용자 지정 새 역할을 선택하여 새로운 역할을 만든다. 마찬가지로 이름은 LambdaSesForwarder와 같이 본인이 적당히 알아볼 수 있게 적어준다. 정책은 다음의 코드를 복사하여 사용한다. 당연하지만 "새로만든버킷이름" 은 본인의 버킷 이름을 적어주면 된다.
{
"Version": "2012-10-17",
"Statement": [
   {
      "Effect": "Allow",
      "Action": [
         "logs:CreateLogGroup",
         "logs:CreateLogStream",
         "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
   },
   {
      "Effect": "Allow",
      "Action": "ses:SendRawEmail",
      "Resource": "*"
   },
   {
      "Effect": "Allow",
      "Action": [
         "s3:GetObject",
         "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::새로만든버킷이름/*"
   }
]
}
  1. Lambda의 함수 코드에 있는 index.js의 내용을 모두 지우고 이전에 내려받은 defaultConfig를 수정한 index.js를 복사하여 붙여 넣는다. 핸들러가 index.handler로 설정되어있는지 확인한다. 메모리는 128 MB 그대로 두고, 제한 시간은 10초로 넉넉하게 잡는다. 보통 작업은 30 MB 메모리와 몇 초 걸리지 않는다.

Email Receiving Rule 생성

이제 AWS SES에서 Email Receiving - Rule Sets로 이동한다. 그리고 Create Rule을 눌러 새 룰을 만든다.

Recipients에서는 내가 포워딩시키고 싶은 이메일 주소를 적는다. ex) noreply@test.com 여기에 적은 이메일 주소로 메일이 오면 Lambda 코드에 적어둔 주소로 보낸다.

액션 설정 페이지에서,S3 -> Lambda순으로 액션을 만들고, 이전에 만들고 설정한 Bucket, S3 버킷 루트에 만든 폴더 이름, Lambda Function 이름을 설정한다.
Rule 이름을 지어주고, Enable spam and virus scanning은 꼭 체크한다. 만약 SES에서 lambda:InvokeFunction 권한 추가를 요청하면, 허용한다. 만약 “Could not write to bucket”이 나오면, IAM 사용자가 S3 버킷에 읽기, 쓰기 권한이 없다는 뜻이다. 그럼 람다 정책 또는 버킷 정책을 다시 확인하기 바란다.

테스트

모든 설정이 끝난 다음, 다른 이메일에서 위에서 설정한 내 도메인을 사용하는 이메일 주소로 테스트 메일을 전송하면 중계가 정상적으로 이루어지는 것을 확인할 수 있다.
2탄에서는 Gmail을 이용해 회사 도메인 이메일로 발송하는 세팅을 다뤄 볼 예정이다.
다음편 보기

profile
러닝커브를 낮추는데 노력하는 개발자입니다.

6개의 댓글

comment-user-thumbnail
5일 전

좋은 정보 감사합니다

1개의 답글
comment-user-thumbnail
5일 전

정성스럽게 쓰셨네요
잘보고 갑니다^^

1개의 답글
comment-user-thumbnail
3일 전

이해가 잘되네요!

1개의 답글