7월 29, 2021

AWS SES - 도메인 계정 만들기

AWS SES - 도메인 계정 만들기

이전 포스트

  1. Ghost 메일 보내기 - AWS SES 설정
  2. AWS SES - SNS 알림 연결

에서 이어지는 글입니다.


왠일로 요 며칠 스토어 주문이 들어왔네요. 오예! 덕분에 계획보다 이번 포스트 작성이 조금 늦어졌습니다.

오늘은 도메인으로 된 메일 계정(myfriend@myongi.net)을 만들고 gmail 로 해당 계정 메일을 받아보겠습니다.

오늘 해야할 일은

1) AWS S3 스토리지 만들기

2) AWS Lambda Function 만들기

3) AWS SES Email 수신 설정

+ 알파(권한 설정, gmail 연동 설정) 입니다.

a

도메인 이메일 계정으로 메일을 보내서 gmail 로 전달 받기까지 과정은 이렇습니다.

메일 발송 to myfriend@myongi.net -> Lightsail DNS 에서 MX 레코드 확인 -> AWS SES 로 전달 -> S3 스토리지에 메일 저장 -> Lambda Function 에서 S3 스토리지 읽어서 설정된 이메일(gmail)로 메일 전달

지난 포스트에서 MX 레코드 설정까지 해놓았으니 남은 단계들을 진행하겠습니다.

1. S3 스토리지 생성

Amazon S3 Simple Storage Service 요금 - Amazon Web Services
프리 티어, 스토리지 요금, 요청 및 데이터 검색 요금, 데이터 전송 및 전송 가속화 요금 그리고 모든 S3 스토리지 클래스의 데이터 관리 기능 요금 옵션에 대한 자세한 정보를 확인하세요.
S3 사용 요금표

빈곤한 저에게는 가격이 중요하니까요 ㅠㅠ 먼저 요금표를 살펴 보았습니다. 사용한 만큼 가격이 부과되며, 1GB당 월0.023 USD 입니다. 저도 마음 놓고 사용할 수 있는 가격이네요. 다행입니다.

그럼 AWS 서비스 네비게이션에서 S3 메뉴로 이동하여 [버킷 만들기] 버튼을 눌러주세요.

[그림1] S3 버킷 만들기

버킷 이름을 적고, AWS 리전은 SES 설정과 동일하게 버지니아로 지정했습니다. 그리고 나머지 옵션은 default 설정으로 두고 버킷을 생성했습니다.

[그림2] 생성된 버킷

이제 이 버킷에 권한 및 관리 설정을 추가해야 합니다. S3 화면에서 생성된 버킷명을 클릭하여 상세 설정 화면으로 이동하세요.

[그림3] 생성한 버킷의 상세 설정 화면

상단 탭들 중 [권한] 탭으로 이동합니다.

[그림4] 권한 탭 화면

저는 처음에는 테스트 한다고 퍼블릭 액세스 차단에서 '모든 퍼블릭 액세스 차단'을 해제했다가 설정 완료 후 다시 모든 퍼블릭 액세스 차단 활성화를 해주었습니다.

그리고 오른쪽 [편집] 버튼을 눌러 버킷 정책에 아래 그림과 같이 정책(권한 설정)을 넣어주었습니다.

[그림5] 버킷 정책 설정

위 정책의 원본 json 데이터는 아래에 따로 적어 놓았습니다. SES 에서 S3 스토리지에 데이터를 넣을 수 있도록 권한을 주는 설정입니다.

Resource 에는 생성한 버킷명을, aws:Referer 에는 AWS 화면 오른쪽 상단에 보이는 본인의 이름을 클릭하셔서 보이는 내 계정 번호를 입력하세요.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "111122223333"
                }
            }
        }
    ]
}

json 정책 데이터 출처: https://aws.amazon.com/ko/premiumsupport/knowledge-center/ses-receive-inbound-emails/

Amazon SES를 사용하여 Amazon S3에서 이메일 수신 및 저장
출처

권한 설정을 했습니다. 이제 관리 탭으로 이동합니다.

[그림6] 관리 탭 화면

관리 탭에서는 '수명 주기 규칙'을 생성하여, 스토리지에 쌓인 데이터가 일정 기간이 지나면 삭제되도록 할 것입니다. [수명 주기 규칙 생성] 버튼을 클릭합니다.

규칙 이름을 적고, '필터를 사용하여 이 규칙의 범위 제한'을 선택했습니다. 추후 버킷 내에 emailsPrefix 라는 이름의 폴더가 생성되고 그 안에 이메일 데이터가 쌓일 것이므로, 접두사 입력란에 /emailsPrefix 를 입력하여 삭제 범위를 제한해줍니다.  

[그림7] 적당한 이름과 규칙을 만들어주세요. 

저는 데이터가 생긴지 30일이 지나면 만료 처리를 하고, 만료 후 7일이 지나면 삭제하도록 설정했습니다.

[그림8] 만료 기간, 만료 후 삭제 기간을 지정해주세요.
[그림9] 설정 요약 정보

[규칙 생성] 버튼을 클릭하여 수명 주기 규칙을 만들어주었습니다. S3 생성 및 설정이 끝났습니다.

[그림10] 이메일 데이터의 수명 주기 규칙을 만들었습니다.

2. AWS Lambda 생성

이제 AWS 람다 함수를 만들기 위해 Lambda 메뉴로 이동합니다. 이곳에서 S3 스토리지에 있는 이메일 데이터를 복사하여 제 개인 메일(gmail) 로 보내는 함수를 세팅해 줄 것입니다.

[그림11] AWS Lambda 메뉴 화면

Lambda > 함수 화면에서 [함수 생성] 버튼을 클릭하세요.

함수 새로 작성을 선택하고 함수 이름을 입력합니다. 그리고 런타임 언어를 선택합니다. 저는 Node.js 14버전을 선택하였습니다.

[그림12] 함수 생성

[함수 생성] 버튼을 눌러 함수를 만들면, 아래와 같이 함수의 코드를 볼 수 있습니다. 코드 탭에서 index.js 파일을 더블 클릭하세요.

[그림13] 생성된 함수의 default 코드

위의 코드는 default 코드로 우리가 사용할 코드가 아닙니다. 깃허브를 찾아보면 여러개의 이메일 전송 코드가 있는데 저는 아래 소스를 다운받아 사용하였습니다.

GitHub - arithmetric/aws-lambda-ses-forwarder: Serverless email forwarding using AWS Lambda and SES
Serverless email forwarding using AWS Lambda and SES - GitHub - arithmetric/aws-lambda-ses-forwarder: Serverless email forwarding using AWS Lambda and SES
[깃허브] aws-lambda-ses-forwarder

위 깃허브에서 소스를 다운로드 받아서 index.js 파일을 수정합니다.

defaultConfig 객체를 찾아 fromEmail, emailBucket, forwardMapping 값을 수정해주세요.

var defaultConfig = {
  fromEmail: "이메일 중간 발송처",
  subjectPrefix: "",
  emailBucket: "내 S3 버킷명",
  emailKeyPrefix: "emailsPrefix/",
  allowPlusSign: true,
  forwardMapping: {
    "도메인 메일 계정@myongi.net": [
      "전송 받을 이메일@gmail.com"
    ]
  }
};
[그림14] index.js 파일 내 defaultConfig 수정 예

수정된 index.js 코드 내용을 복사하여 AWS Lambda 함수 내 index.js 파일에 붙여넣기 해주세요. Lambda 함수 내에 원래 있던 코드는 삭제합니다. 그리고 [Deploy] 버튼을 눌러 변경 내용을 적용해주세요. 옆에 초록색으로 Changes deployed 라고 떠야 적용이 완료된 것입니다.

[그림15] index.js 코드 변경

3. SES Email Receiving Rule 생성

서비스 네비게이션에서 Amazon Simple Email Service (SES) 메뉴로 이동합니다. 이곳에서는 수신된 이메일에 대한 룰을 만들고, 그 룰에 위에서 생성한 S3, Lambda 함수를 연결하겠습니다.

SES 왼쪽 메뉴 중 하단에 있는 Rule Sets 로 이동 > [Create Rule] 버튼을 클릭하여 새 Rule을 생성합니다. Recipients 입력란에 사용하고자 하는 도메인 이메일 계정을 입력하세요.

[그림16] 수신할 도메인 이메일 계정 입력

다음 화면에서는 등록한 이메일 계정으로 메일이 들어오면 어떤 액션을 할 것인지 설정합니다. 아까 만들어 놓은 S3 버킷과 Lambda 를 선택하여 Action 2개를 만들어줍니다.

[그림17] Action 생성
[그림18] S3 버킷이 연결된 Action 과 Lambda 함수가 연결된 Action

Action 지정 후 [Next Step] 을 눌러 Step3 으로 이동합니다. 이곳에서는 Rule 이름을입력합니다.

[그림19] Rule 이름 지정

마지막으로 설정한 내용을 검토한 후 [Create Rule] 버튼을 눌러 생성을 완료합니다.

[그림20] 설정 내용 검토

[Create Rule] 버튼을 누르면 'Lambda 함수에 권한 설정이 안되어 있다. 추가하겠냐?' 고 묻는 팝업이 나옵니다. 추가를 선택하시고 마무리해줍니다.


4. IAM 사용자 권한 추가

이제 AWS 에서의 설정은 거의 다 끝났습니다. 단지 SES 에서 사용하는 IAM (AWS Identity and Access Management) User와 Lambda Role 이 이메일을 읽고 쓸 수 있도록 권한만 추가해주면 됩니다.

AWS 서비스 중 IAM 메뉴로 이동합니다. IAM 화면의 왼쪽 메뉴들 중 사용자를 클릭하면, 우리가 예전 포스트에서 DNS 설정했을때 SES > SMTP Settings 에서 만들어 놓은 IAM User가 있습니다.

Ghost 메일 보내기 - AWS SES 설정
AWS Lightsail 에 고스트 블로그를 올렸습니다. 관리자 페이지에서 테마도 업로드하고, 글도 쓰고.. 이제 얼추 블로그 느낌이 납니다. 하지만 회원가입을 하고 싶어도 메일 전송이 안되서 회원 가입을 할 수 없는 상황입니다. 처음에는 고스트에서 안내하는대로 Mailgun 을 사용하려고 했습니다만 (추후 뉴스레터 발송도 고려하고 있습니다), 도메인으로 이메일 계정 하나 만드려고 했더니 월 35달러
지난 포스트 참고: SMTP Setting

IAM > 사용자 화면에서 지난번에 SES 에서 만들어 놓은 사용자명을 클릭합니다.

[그림21] SES 사용자 이름 클릭

상세 화면에 있는 권한 탭에서 AmazonSesSendingAccess 정책을 클릭합니다. 지난번에 메일 발송을 위해 디폴트로 설정된 정책입니다.

[그림22] 권한 탭

저는 변경 후에 캡쳐해서 정책이 다르게 보이지만, 원래는 default 로 아래와 같은 권한이 주어졌었습니다. 여기에 S3 스토리지 데이터에 접근할 수 있도록 권한을 추가하려고 합니다.

"Statement": [{
  "Effect":"Allow",
  "Action":"ses:SendRawEmail",
  "Resource":"*"
}]

[정책 편집] 버튼을 눌러 편집 화면으로 들어가세요. 저는 [인라인 정책 추가 버튼]을 눌러 정책을 검색하여 추가하였는데 생각보다 정책 찾기가 어렵더라구요. 편집창에서 직접 편집하는 것이 더 편할 것 같습니다.

[그림23] 정책 편집 창 > JSON 탭 선택

위의 JSON 편집 창에 아래와 같은 정책을 입력합니다. 기존 SES 정책에 S3 정책이 추가된 형태입니다. 아무곳에서나 접근 할 수 없도록 Resource 값도 좀 더 구체적으로 명시해 주었습니다.

  • 내 계정 번호는 AWS 화면 오른쪽 상단 접속 계정명을 클릭하시면 확인 가능합니다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "ses:SendRawEmail"
            ],
            "Resource": [
                "arn:aws:s3:::내 S3 버킷명/*",
                "arn:aws:ses:내 SES 지역:내 계정 번호:identity/*"
            ]
        }
    ]
}

하단의 [정책 검토] 버튼을 눌러 적용해줍니다.

a

이제 Lambda 함수 롤에도 권한을 추가해주러 가겠습니다. 아까 SES Email Receiving Rule 을 만들때 Lambda 함수에 권한을 생성해 주겠냐? 뭐.. 이런 질문이 나왔었는데요, 그 때 생성된 role이 이곳에 있습니다.

IAM > 왼쪽 메뉴 중 역할 선택 > 역할 리스트 중 아까 생성한 Lambda 함수명이 붙은 role을 찾아주세요. 해당 role 을 클릭하면 IAM 사용자 화면과 동일하게 권한 탭에 정책이 보입니다.

[그림24] lambda 함수 role 상세화면 > 권한 탭

저는 정책 추가 후 캡쳐를 해서 정책이 2개 입니다만, 원래는 1번째 정책만 생성되어 있었습니다. 디폴트 정책을 클릭해서 살펴보면 로그를 만들기 위한 권한 설정임을 확인 할 수 있습니다.

여기서는 로그 정책과 분리하여 추가하기 위하여, 오른쪽의 [인라인 정책 추가] 를 클릭했습니다.

[그림25] 정책 생성 화면 > JSON 탭 선택

정책 생성 화면이 나오면 JSON 탭을 선택하고, SES IAM 사용자 정책과 동일하게 아래 JSON 내용을 입력합니다.

  • 내 계정 번호는 AWS 화면 오른쪽 상단 접속 계정명을 클릭하시면 확인 가능합니다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "ses:SendRawEmail"
            ],
            "Resource": [
                "arn:aws:s3:::내 S3 버킷명/*",
                "arn:aws:ses:내 SES 지역:내 계정 번호:identity/*"
            ]
        }
    ]
}

하단의 [정책 검토] 버튼을 클릭하여 적용합니다.

얏호! AWS 에서의 메일 설정이 끝났습니다.


5. GMAIL 연동 설정

도메인 이메일 계정으로 발송된 메일을 gmail 에서 받아보기 위하여 gmail 의 설정 화면으로 이동합니다. 메일 오른쪽 상단 톱니바퀴 아이콘을 클릭 > [See all settings] 버튼을 클릭하세요.

gmail 세팅 화면을 어떻게 한글로 바꾸는지 몰라서 그냥 영문 화면으로 캡쳐했습니다. ㅠㅠ Accounts and Import 탭으로 들어가세요.

[그림26] gmail 설정 화면 > Accounts and Import 탭

Accounts and Import 탭의 중간에 Send mail as 항목이 있습니다. 여기에 있는 Add another email address 를 클릭하세요.

팝업이 뜨면 사용할 도메인 이메일 주소를 입력하세요.

[그림27] 이메일 추가 팝업

[Next Step] 으로 이동하면 SMTP 서버, user, password 입력 화면이 나옵니다.

AWS > SES > SMTP Settings 화면에 있는 Server Name 을 복사하여 SMTP Server 입력란에 넣어줍니다.

Username 및 Password 에는 지난 포스트(https://myongi.net/ghost-post/)에서 SES > SMTP Credentials 를 생성하여 다운로드 받아놓은 Username 과 Password 를 복사하여 입력합니다.

[그림28] AWS SMTP 설정 값 입력

입력 후 [Add Account]를 하면, 추가한 이메일 주소로 검증용 이메일이 발송됩니다. 잠시 기다려 gmail 로 메일이 오면 검증 링크를 클릭하여 완료해주세요.

오늘 우리는 도메인 이메일 계정을 획득하였습니다.

별 것 아닌 작업인 줄 알았는데 막상 해보니 시간 꽤나 드는 일이었습니다. 살아보니 모든 일들이 이렇습니다. 해보지 않았을 땐 우습게 보였던 일들이 막상 해보면 전혀 만만하지 않습니다. 서비스를 제공해주시는 모든 분들게 감사한 마음을 지녀야겠다는 뜬금없는 오늘의 교훈을 얻으며, 도메인 이메일 계정을 갖게 된 나 자신을 축하해주러 가야겠습니다. 응?!


Featured Photo by Brett Jordan on Unsplash