AWS SES란 AWS Simple Email Service로, 자사 도메인 메일 서버를 설정할 수 있도록 AWS에서 제공하느 서비스이다. 테스트 환경인 샌드박스 상태에서는 하루에 200건의 메일을 전송할 수 있으나 프로덕션 엑세스로 전환하면 하루에 50,000건까지 무료로 전송이 가능하다.
SES를 설정할 때 주의해아 할 점은 region을 잘 확인해야 한다는 것이다. AWS SES의 경우 이메일 발송은 어느 region에서도 가능하지만 이메일 수신은 한정된 region에서만 가능하다(내가 메일서버를 구축했을 때가 1년 전이라 지금은 어떻게 됐는지 확인해봐야 한다). 나는 SES 설정 시 region을 미국 동부 (버지니아 북부)로 설정하였다.
1. 도메인 인증하기
나는 우선 가비아에서 도메인을 구입하고 이를 AWS Route53에 등록해주었다. 우선, AWS Route53 > 호스팅 영역 생성에서 가비아에서 구입한 도메인을 입력한다.

이후 생성된 호스팅 영역의 NS 타입의 값을 복사하여 가비아 > My 가비아 > 도메인 통합 관리 툴 > 도메인 관리 > 도메인 상세 페이지 > 네임서버 설정에 등록한다. 그리고 AWS Certificate Manager에서 인증서를 요청한다.


'요청'을 누르면 도메인 검증이 시작된다. 처음에는 '검증 보류' 상태였다가 '검증 완료' 상태로 넘어가게 된다.
여기까지 완료 되었다면 AWS SES로 넘어와 구성(Configuration) > 확인된 자격 증명(Verified identities) > 자격증명 생성 (Create Identity)에서 다음과 같이 설정해준다.

요렇게 인증해주면 아래와 같이 도메인이 인증된 것을 확인할 수 있다. (ourplant.kr은 내가 작년에 SES 설정 시에 사용했던 도메인이다)


2. S3 Bucket 생성하기
AWS S3 서비스로 가서 버킷을 생성한다. 해당 버킷은 인바운드 메일을 저장하는 용도로 사용된다. 버킷을 생성했으면 버킷 루트에 폴더를 하나 생성하고 권한 > 버킷 정책에서 JSON 형식으로 다음 값을 넣는다.
{
"Version": "2023-01-06",
"Statement": [
{
"Sid": "GiveSESPermissionToWriteEmail",
"Effect": "Allow",
"Principal": {
"Service": "ses.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::생성한 버킷 이름/*",
"Condition": {
"StringEquals": {
"aws:Referer": "AWS 계정 ID"
}
}
}
]
}
이때 계정 ID는 AWS > 계정 > 계정 설정에서 확인할 수 있다.
3. Lambda 함수 생성하기
이제 S3 버킷으로 들어온 인바운드 메일을 Gmail에서 확인할 수 있도록 인바운드 메일을 나의 Gmail 주소로 재전송해주는 Lambda 함수가 필요하다. S3 버킷에 저장된 메일을 다른 메일로 재전송하지 않고 버킷에서 바로 확인할 경우 인코딩이 깨져 메일 내용을 알아볼 수 없는 상황이 발생한다. 때문에 S3 버킷 내부의 인바운드 메일이 외부 메일 서비스에서 관리될 수 있도록 설정해주는 작업이 꼭 필요하다.
AWS Lambda 서비스로 이동하여 새로운 함수를 작성한다. 이때 런타임은 Node.js 12.x로 설정하고 다음 코드를 복사하여 붙여넣는다.
var LambdaForwarder = require("aws-lambda-ses-forwarder");
exports.handler = function(event, context, callback) {
// See aws-lambda-ses-forwarder/index.js for all options.
var overrides = {
config: {
fromEmail: "noreply@example.com", //내 gmail로 전달할 때 활용할 송신자 이메일 주소
emailBucket: "s3-bucket-name", //이메일을 저장할 S3 버킷 이름(생성한 버킷 이름)
emailKeyPrefix: "emailsPrefix/", //S3 버킷에서 저장될 위치의 폴더(아까 버킷 루트에 생성한 폴더)
forwardMapping: { //어느 이메일로 메일이 오면 어디로 보낼지에 대한 매핑
"noreply@example.com": [ //생성할 자사 메일 주소
"example@gmail.com" //연동하려는 Gmail 주소
]
}
}
};
LambdaForwarder.handler(event, context, callback, overrides);
};
해당 코드는 https://github.com/arithmetric/aws-lambda-ses-forwarder/blob/master/example/index.js 에서 확인 가능하다.
함수를 생성했으면 해당 함수의 정책을 설정해준다. 정책은 다음 코드를 활용하면 된다.
{
"Version": "2023-01-06",
"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:::생성한 버킷 이름/*"
}
]
}
4. SES Email Receiving Rule 생성하기
AWS SES > 이메일 수신에서 규칙세트를 생성하고 Recipient에 내가 포워딩하고 싶은 메일 주소를 적는다. 예를 들어 위의 Lambda 함수를 예로 들면 noreply@example.com로 메일이 올 때 Lambda 코드에 적어둔 주소로 발송되는 것이다.
다음으로 액션 설정 페이지에서 S3 -> Lambda순으로 액션을 만들고, 이전에 만들고 설정한 버킷과 버킷 루트에 만든 폴더 이름, Lambda 함수 이름을 설정한다. 이후 만약 SES에서 lambda:InvokeFunction 권한 추가를 요청하면, 허용한다. 만약 “Could not write to bucket”이 나오면, IAM 사용자가 S3 버킷에 읽기, 쓰기 권한이 없다는 뜻이다. 그럼 람다 정책 또는 버킷 정책을 다시 확인해야 한다. 설정이 끝나면 다음과 같이 규칙이 생성된 것을 확인할 수 있다.



5. Gmail에서 자사 도메인을 발송자로 하여 메일 보내기
AWS SES의 Verify a New Email Address에서 발신에 사용할 내 도메인 이메일 주소를 추가하고 인증한다.
그 후, AWS SES > SMTP 설정 > SMTP 보안 인증 생성을 눌러 SMTP 인증용 계정을 생성한다. Credentials.csv 파일을 다운로드한 다음 저장한다. Gmail 설정 > 계정 및 가져오기 > 다른 주소에서 메일 보내기에서 다른 이메일 주소 추가를 누른다. 그럼 아래와 같은 화면이 나온다.

다음으로 SMTP 서버와 사용자 이름, 비밀번호를 입력하는 창이 나온다. 이때 SMTP 서버는 SES 리전이 버지니아 북부일 경우 email-smtp.us-east-1.amazonaws.com일 것이고, 리전이 다르다면 AWS SES > SMTP 설정에서 SMTP 엔드포인트를 확인하면 된다. 그리고 사용자 이름과 비밀번호는 앞서 저장한 Credentials.csv 파일에 있는 아이디와 비밀번호를 적는다. 그럼 다음과 같이 자사 메일을 gmail로 보내고 받으며 자유롭게 활용할 수 있다 :)

'AWS' 카테고리의 다른 글
| AWS EC2에 프로젝트 배포하기 (1) | 2023.02.04 |
|---|---|
| AWS EC2, RDS 인스턴스 생성하기 (1) | 2023.02.04 |
| AWS RDS MySQL 생성하기~ (0) | 2023.02.04 |