kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

AWS

AWS SES(Simple Mail Service)

까마기 2020. 10. 26. 13:30
반응형

AWS SES의 소개와 간단한 사용법

 

SES는 Simple Email Service의 약자로 Outbound만 가능한 이메일 전송 서비스이다. SES는 마케팅이나 혹은 웹진 메일 같은 대량의 이메일을 발송하기에 적절하며 사전 확약금 없이 발송한 이메일의 수와 데이터 전송에 대해 요금이 부과되므로 저렴한 비용으로 이용할 수 있는 장점이 있다고 한다. (실제 서비스에 이용해본 경험은 없어서 확답은 못 하겠다.)

전송 작업의 상태를 쉽게 모니터링할 수 있으며 입증된 네트워크 인프라와 데이터 센터에서 운영되므로 가용성과 안정성이 높다.

사실 메일을 이용한 서비스를 구축하다 보면 메일의 발송 신뢰성을 신경 쓸 수밖에 없는데 서버나 네트워크 구성 혹은 IP 주소의 신뢰성 같은 인프라 문제 등 신경써야 할 부분이 많은 것은 사실이다. SES는 이런 부분에 대해서 많은 도움을 제공한다.

ISP는 자체적으로 필터링 기능을 사용하여 많은 스팸 메일들을 걸러내긴 하지만 완벽한 필터링은 가능하지 않아 회원 이메일 주소 확인용 이메일 같은 메일의 경우도 스팸으로 분류하기도 하므로 이러한 부분도 신경을 써야 한다. ISP에서 메일을 전송할지에 대해서는 이메일 발송처가 판단 기준으로 크게 작용하는데 SES 사전에 이 부분에 대해서 대응 조치를 취하므로 ISP는 SES 서비스를 거친 이메일 신뢰하게 되어 메일 도달 가능성을 높여준다. 이 부분에 대해서 SES는 몇 가지 기능을 제공하고 그 항목은 아래와 같다.

  • 컨텐츠 필터링 기능을 사용하여 바이러스나 멀웨어를 포함한 메시지를 감지하여 발신전에 차단한다.

  • ISP와 함께 수신 거부 피드백 루프를 유지한다. 이는 전송 전략을 추진하는 데 도움을 준다.

  • SPF(Sender Policy Framework) 및 DKIM(DomainKeys Identified Mail)과 같은 인증 메커니즘을 지원한다.

SES는 여러 이메일 전송 인터페이스를 제공하는데 SES 콘솔을 이용해서 메일을 발송할 수도 있고 SMTP 인터페이스나 SES Query API를 직접 호출할 수도 있다.

또한, 전송 시도, 거부 메시지, 반송, 수신 거부 등의 통계를 자동으로 수집하여 제공하여 모니터링 할 수 있으며 메일 전송을 테스트해볼 수 있는 Mailbox Simulator 기능을 제공한다.

SES를 사용하는 단계로는 도메인 혹은 이메일 주소를 인증받고, 프로덕션 엑세스를 요청하며 승인을 받고 나면 이메일을 보내고 피드백을 받을 수 있다.

본 포스트에서는 위의 단계로 이메일을 발송해 보고 콘솔과 PHP API를 이용하여 간단하게 메일을 보내는 절차를 수행해 보겠다.

<2> 작업 순서

1. 구성도

2. AWS SES서비스 사용

3.  보내는 도메인이 검증된 도메인인지 인증하기 (필수)

4. 발송 메일 계정 확인

5. 메일 발송 정상적으로 되었는지 통계 확인

6. 메일 발송수 증가 신청하기 (필수)

7. 전용 ip 신청법 (선택)

별첨1. DNS를 AWS Route53을 사용하기

 

1. SES 실행과 리전 선택

 

SES 실행

Application Services 내부에 SES를 누른다.

 

Region 선택

현재 SES는 전체 리전에서 사용할 수는 없고 위의 리전에서만 사용이 가능하다. 본 포스트에서는 US East (N.Virginia) 리전을 선택했다.

 

2. 이메일 주소 인증

 

Verify a New Email Address

왼쪽에 Verified Senders 아래에 Email Addresses를 클릭하고 상단에 Verify a New Email Address 버튼을 클릭한다.

 

이메일 주소 입력

주소 인증 창이 뜨면 인증할 이메일 주소를 입력한다. 입력 후 Verify This Email Address 버튼을 클릭한다.

 

인증 메일 발송 확인

인증 메일 발송 확인 창이 뜨면 Close 버튼을 클릭하여 창을 닫는다.

 

이메일 주소 목록

이메일 주소가 등록되었지만, 아직 인증이 Pending 상태이다. resend 버튼을 클릭하여 인증 메일을 재발송할 수도 있다.

등록한 이메일 주솔 인증 메일이 도착했을 것이다. https://로 시작하는 상단의 링크를 클릭한다.

 

인증완료 페이지

위와 같은 페이지를 확인했다면 아래와 같이 등록된 이메일이 Pending 상태에서 Verified 상태로 변경된 것을 확인할 수 있다.

 

Verified

 

3. 프로덕션 액세스 승인 받기

이메일 인증은 했지만, 메일을 보내기 위해서는 프로덕션 액세스 권한을 승인받아야 한다. 왼쪽에 Dashboard를 클릭한다.

 

SES Dashboard

위와 같이 Dashboard로 이동했다면 Request Production Access 버튼을 클릭한다.

 

프로덕션 액세스 권한 신청

위와 같이 요청 내용을 알맞게 채운다. *로 체크된 부분은 필수 입력 항목이며 Pre-Production Checklist는 약관에 해당되므로 모두 체크해야 한다. Use Case Description은 사용 목적을 영문으로 입력한다. 본 포스트에서는 서비스 도입을 위한 사전 테스트라고 적어 보냈다. 입력이 완료되면 하단의 Web 버튼을 클릭한다.

승인이 완료되면 아래와 같이 승인 메일을 받아볼 수 있다.

 

승인 메일

SES 소개페이지에서는 몇 분이내라고는 했지만 대략 1시간 이상은 걸리는 것 같다.

 

전송 가능량 확인

승인 메일을 받고 나면 전송 가능 메일수가 늘어나 있는 것을 확인할 수 있다. 이 수는 보내는 메일의 품질에 따라서 늘어나기도 줄기도 한다. (스팸을 계속 보낸다면 계속 줄어 카드 한도처럼 될 것이다.)

 

4. 메일을 보내기

가. 콘솔을 이용한 테스트 이메일 발송

메일은 SES 콘솔이나 CLI TOOL 혹은 SDK를 통해서 보낼 수 있는데 여기선 콘솔의 테스트 이메일 전송 기능과 SDK를 이용해 보겠다.

다시 Verified Senders 아래에 Email Addresses를 눌러 이메일 리스트로 이동한다. 인증된 이메일을 선택하고 상단의 Send a Test Email 버튼을 클릭한다.

 

테스트 메일 보내기 창

위와 같이 테스트 메일 보내기 창이 뜨면 항목을 입력한다. 역시 * 표시가 되어 있는 항목은 필수 입력 사항이다.

  • Email Format : HTML 메일을 보낼 수 있는 Formatted와 일반 텍스트를 보내는 Raw 라디오 박스

  • From : Sender 이메일 주소이며 인증된 이메일 주소이다.

  • To : 받을 이메일 주소이다.

  • Subject : 이메일 제목

  • Body : 이메일 본문

항목을 모두 채우고 나면 Send Test Email 버튼을 클릭한다.

 

도착한 이메일

 

나. SDK를 이용한 이메일 발송

PHP와 Composer가 이미 준비되어 있다고 가정을 하고 없다면 PHP는 yum으로 Composer는 이곳을 참고하여 준비한다.

 

1

2

3

4

5

{

   "require": {

      "aws/aws-sdk-php": "2.*"

   }

}

 

composer.json 파일로 저장하고 아래 명령을 이용하여 SDK를 설치한다.

# php composer.phar install

다음과 같이 PHP파일을 작성한다. 아래는 AWS의 PHP SDK의 Basic example의 형태이다.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<?php

require 'vendor/autoload.php';

 

use Aws\Ses\SesClient;

 

$client = SesClient::factory(array(

   'profile' => 'default',

   'region' => 'us-east-1'

));

 

$result = $client->sendEmail(array(

   'Source' => 'developer@wildpup.info',

   'Destination' => array(

      'ToAddresses' => array('wildpup84@gmail.com')

   ),

   'Message' => array(

      'Subject' => array('Data' => 'Hello SES!'),

      'Body' => array('Text' => array('Data' => 'Hello SES Body'))

   )

));

?>

 

위의 저장된 PHP를 실행하면 메일이 전송될 것이다.

 

Hello SES

만약 403코드를 가진 에러를 보게된다면 이곳을 참고해서 문제를 해결해 보자. 기타 다른 코드에 대해서는 이곳을 참고한다.


1. 구성도


2. AWS SES서비스 사용3곳에서만 SES서비스를 제공하고 있다.



3.  보내는 도메인이 검증된 도메인인지 인증하기 (필수)

최대 72시간 걸린다. (AWS사이트에 나와 있다.)


1) Verify a New Domain 클릭해서  보내고자 하는 도메인을 입력한다.dns-book.com 으로 테스트한다.



2) Generate DKIM Settings 클릭해서  DKIM 인증도 받아 메일 발송이 잘되도록 한다.



3) Download Record Set as CSV 파일을 다운로드 받아 DNS서버에 설정한다.



4)  DNS 네임서버에 로그인해서  설정한다.(필수)
필수로  TXT 레코도 1개와  DKIM record 3개를 설정한다.

 


설정시 마지막에  점(.)을 반드시 설정하도록 한다.점(.)이 없으면 맨 마지막에 도메인이 붙어 검증확인이 되지 않는다.



5)  도메인 설정이 완료되어 검증 되면  verify라고 변경된다.



6) 도메인을 클릭해서 메일 송신이 잘 되는지 테스트한다.

정식 서비스 전이라 (AWS 에서는 Sandbox라고 부른다)  자기 자신 도메인의 메일 계정으로만 보낼수 있다.

도메인에 해당 되는 이 메일이 없다면,  

Email Addresses 메뉴에서 네이버나 gmail을 등록해  수신 테스트하라.


웹 콘솔에서 바로 메일 보내기.

수신자를 여러명으로 해서 메일을 보내면 된다.

 

 

4.  발송 메일 계정 확인 (선택)
Email Address 클릭 >  Verify a  New Email Address  > 보내는 메일계정을 입력한다.해당 메일 계정은 메일 수신이 가능한 계정이여야 한다.

 

메일로 온 확인요청 링크를 클릭해 인증한다. 인증되면 메일 테스트가 가능하다.

 

이제,  방금 확인된 메일 계정을 발신으로하고, 수신도 방금 확인 받은 계정만 가능하다.

 

 

 

5. 메일 발송수 증가 신청하기 (필수)

 

1) Sending Statistics 에서  Request a Sending Limit Increase 클릭해 필수로 신청해야 한다.

정식 사용신청을 하는것이다.

이 부분이 완료되어야 외부로 메일을 보낼수 있다.

 

Sending Statics메뉴에 있다. 

 

2) 일반적으로 처리 되는데  24시간 걸린다.지원센터와 메일 한번 왔다 갔다라는데 24시간.

다른 요청이 있다면 메일이 왔다갔다해야해서 4일정도 걸린다.

기본적으로는  24시간에  200개만 보낼수 있다.

 

3) 처리가 다되면 메일로 온다. 

그리고  Sending Statistics  클릭하면  Request Sending Limit Increase   메뉴가 안보인다.

처리된 결과 내용이 보인다.

Quota가 500000 을 1시간에 보낼수 있네요 ^^

 

 


4) 다음은 직접 신청 링크 https://console.aws.amazon.com/support/cases#/create?issueType=service-limit-increase&limitType=service-code-ses

 

신청 화면 


작성시 참고

      발신 할당량—24시간 내에 보낼 수 있는 최대 이메일 수입니다. 전송 할당량은 롤링 기간을 반영합니다. 이메일 전송을 시도할 때마다 Amazon SES에서 지난 24시간 내에 보낸 이메일 수를 확인합니다. 보낸 이메일의 총 수가 할당량보다 낮으면 전송 요청이 수락되고 이메일이 전송됩니다. 이미 총 할당량을 보낸 경우 전송 요청이 병목 예외로 거부됩니다. 예를 들어, 발신 할당량이 50,000개이고 지난 24시간 내에 15,000개의 이메일을 보낸 경우 35,000개의 이메일을 추가로 즉시 보낼 수 있습니다. 지난 24시간 내에 이미 50,000개의 이메일을 보낸 경우, 이전에 보낸 이메일 중 일부가 24시간 범위에서 해제될 때까지 이메일을 보낼 수 없습니다.    

      최대 전송 속도—Amazon SES에서 계정에 초당 수락할 수 있는 최대 이메일 수입니다. 잠깐 동안 이 한도를 초과할 수 있지만 장기적으로는 초과할 수 없습니다.    


증가된후 결과 Sending Quota: send 50000 emails per 24 hour periodMax Send Rate: 14 emails/second
발송 메일수 증가 요청 소개https://docs.aws.amazon.com/ko_kr/ses/latest/DeveloperGuide/manage-sending-limits.html
발송 메일수 증가 요청 신청서 작성법https://docs.aws.amazon.com/ko_kr/ses/latest/DeveloperGuide/submit-extended-access-request.html
4) 처리 진행 상태는 Aws오픈쪽 위 support 에  support center에서 진행 상태가 확인 가능하다.보통 24시간 걸린다.

 


6. 메일 발송 정상적으로 되었는지 통계 확인




7. 전용 ip 신청법  (선택)

DEDICATE IP 할당의 의미는 고정 SMTP IP 가 아니다.

DEDICATE IP를 SMTP로 넣어도 메일 발송이 되지 않으니 주의 하기 바란다.!!!

 

DEDICATE IP 할당의 의미는

ISP에 해당 전용IP로 보내것을 전달해 스팸으로 처리하지 않도록 하도록 하는 역할만 하는것이다.

 

 

1)  Dedicate IP 할당 받는법.

발송 메일은  공용 ip와 전용 IP 사용이 있다.

전용IP 주소 요청 https://docs.aws.amazon.com/ko_kr/ses/latest/DeveloperGuide/dedicated-ip-case.html

 한도에서 Desired Maximum Send Rate(필요한 최대 송신률)를 선택합니다.        

 New limit value(새 한도 값)에서 초당 전송해야 할 최대 메시지 수를 입력합니다. 사용 사례를 구현하는 데 필요한 전용 IP 주소의 수를 계산하기 위해 사용자가 제공한 값을 사용합니다. 따라서 사용자가 제공하는 예상치는 가능한 정확해야 합니다.        


Case description(사례 설명)의 Use case description(사용 사례 설명)에서 전용 IP 주소를 요청하려고 함을 밝힙니다.그런 다음, Amazon SES에서 전용 IP 주소를 사용하여 이메일을 전송할 방법을 설명합니다. 공유 IP 주소를 대신해 전용 IP 주소를 사용하려는 이유를 명시합니다. 이러한 정보는 사용 사례를 더 잘 이해하는 데 도움이 됩니다.
AWS전용IP 주소https://docs.aws.amazon.com/ko_kr/ses/latest/DeveloperGuide/dedicated-ips.html
전용IP주소 워밍업 https://docs.aws.amazon.com/ko_kr/ses/latest/DeveloperGuide/dedicated-ip-warming.html

 

2) 전용IP주소(Dedicate IP) 처리가 완료 되면 Dedicated IPs 에 IP 에 표시가 된다.

보통 안정적으로 운영하려면 2개 Dedicate IP가 필요하다고 2개로 하겠느냐고 물어 본다. (24시간 후 회신)

테스트라 1개로 한다고 하거나, 서비스이면 2개로 하면 될거 같다.  

2개면 1달에 5만원(50불) 정도 입니다.

 

 


별첨 1.  DNS를 AWS Route53을  사용할때,  SES 도메인  인증하기

Route53을 사용 하는경우는 자동으로  Route53 DNS에 TXT, CNAME 레코더가 추가된다.
SES > Domain 클릭.


Create Record Sets 클릭.


Txt레코드 1개와 CNAME 3개가 생긴다.

 

 

 

gmail 또는 naver같은 기존에 있는 웹서비스가 아닌 개인 또는 기업용 이메일(domain이 일반 웹서비스와 다른)을 사용하게 되면 외부로 메일을 보낼때 검증이 되지 않아 일부 메일에서 스팸메일로 빠지는등의 예상치 못한 오류가 발생함

 

아마존 SES는 해당 오류를 DKIM 인증을 통해 진행을 해주며 매우 저렴한 금액으로 사용할 수 있습니다. 또한 서버 구축 또는 비동기 처리를 하지 않고 AWS에 request만 보내면 처리를 할 수 있음

 

Verify a New Domain을 클릭.

본인의 Domain을 넣고 Generate DKIM Settings에 체크 후 Verify This Domain을 클릭.

 

나오는 설정 값을 각자의 호스팅 업체의 도메인 설정에 들어가 설정.

일정 시간이 흐르면 자동으로 도메인 검증이 완료.

 

검증이 끝나고 나면 다음과 같은 메일을 받을 수 있음.

DKIM 인증 또한 자동으로 메일이 발송.

DKIM이란 Domain Keys Indentified Mail의 약자로써 해당 주소에서 왔다고 하는 메일이 실제로 도메인 소유자에 의해 승인이 되었는지 확인할 수 있는 Email인증 방법이며 SES에서는 SES에서 해당 인증 또한 같이 진행을 받을 수 있음.

 

이메일 검증.

  1. 좌측 대시 보드의 Email Addresses를 클릭.

  2. Verify a New Email Address를 클릭.

  3. 가지고 있는 해당 도메인에 연결된 메일을 입력하고 Verify This Email Address를클릭.

  4. 인증용 이메일이 방송 되며 Status가 Pending Verification으로 되어 있음을 확인 할 수 있으며 메일이 발송되지 않았을 경우 Resend를 눌러 재발송을 요청할 수 있음. 

해당 이메일에 들어가게 되면 아마존에서 발송한 검증용 이메일이 확인이 가능.

해당 메일의 검증용 URL에 들어가게 되면 이메일 검증 후 다음과 같은 화면을 볼 수 있음.

다시 SES화면에 들어가게 되면 메일이 검증 되었음을 확인할 수 있음.

해당 이메일 클릭후 Sending Test Email을 클릭하게 되면 다음과 같은 창이 나오며 테스트용 이메일을 발송할 수 있음.

메일 원문을 확인하면 발송자는 ses이며 DKIM서명 또한 적용이 되어 있음을 알 수 있음.

 

Django에서의 설정

굳이 따로 패키지를 설치하지 않아도 상관이 없으며 django의 기본 이메일을 사용하듯이 사용화면 되며 settings의 설정

 

 

 

# settings.py

 

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'EMAIL_HOST = 'email-smtp.us-west-2.amazonaws.com'EMAIL_PORT = 587EMAIL_HOST_USER = config_secret_common['aws']['ses']['key_id']EMAIL_HOST_PASSWORD = config_secret_common['aws']['ses']['secret_key']EMAIL_USE_TLS = TrueDEFAULT_FROM_EMAIL = 'mail@vouloir.net'SERVER_EMAIL = 'mail@vouloir.net'

반응형

'AWS' 카테고리의 다른 글

AWS ECS 컨테이너 인스턴스 연결 해제  (0) 2020.10.26
AWS ECS  (0) 2020.10.26
AWS SSL 인증서 갱신  (0) 2020.08.26
AWS 인프라 아키텍쳐 교육  (0) 2020.07.17
[AWS CLI] ecs service container의 IP가져오기  (0) 2020.07.17