読者です 読者をやめる 読者になる 読者になる

メンチカツには醤油でしょ!!

ITエンジニア徒然 (AWS/Java/JavaScript/Google Spreadsheets/Jenkins/Mac/外部コミュニティ・勉強会レポ)

独自ドメインのメール送受信をAWSで。メールサーバーレスアーキテクチャーを構成

ドメイン取った際にメールサーバー立てるのしんどいです。
AWSアカウントがあったので
メールサーバーレスと言っていいのかはさておき、サーバー構成をすることなく独自ドメインのメール送受信をやってみました。

ゴール

ドメイン宛に来たメールが任意のメールアドレスに転送できること。
ドメインから任意のアドレスにメーラーやEC2内からメール送信できること。

具体例として、
hostmaster@mydomain.comへの受信メールがmy@gmail.comに転送されること。
no-reply@mydomain.comからany@mail.addressへのメール送信できること。
の2点ができるように手順を紹介します。

必要なもの

・受信のための転送先メールアドレス
 SESでSandboxテストをするためのメールアドレスと兼用 (今回はGmail)
独自ドメイン (Route 53でなくお名前.comとかでも可)

アーキテクチャ

Cloudcraftを使って描いてみました。便利。

f:id:ryoichi0102:20161228235451p:plain

dev.classmethod.jp

使用するAWSサービスと用途

・SES (Simple Email Service; メールの送受信)
・S3 (受信メールの保存)
SNS (Simple Notification Service; 受信メールの受取通知)
・Lambda (受信メールの転送)

SESは日本リージョンがないので、us-west2(オレゴン)を使用します。
SNSかLambdaはどっちかでも良いかも知れません。

手順

1. SESでドメイン認証 (DNSレコード設定)
2. メールアドレスのverify
3. SESのSandboxテストメール送信、ここでSNSもセットアップ
4. 制限解除の申請
5. メール送信の設定
6. メール受信の設定

1. SESでのドメインの認証

SES HomeからIdentity ManagementのDomainsを選択
Verify a New Domainよりドメイン名を入力する
この時、Generate DKIM Settingsもチェックしておく。

f:id:ryoichi0102:20161108213901j:plain

f:id:ryoichi0102:20161108214135j:plain

f:id:ryoichi0102:20161228182036p:plain

(DNSレコード設定)

Verify This Domainした際に表示される
・Domain Verification Record のTXTレコード
DKIM Record Set のCNAMEレコード 3つ
ドメインDNSレコードに設定します。

また、今回は受信も行うため
The following additional step applies to email receiving ONLY:
に記載のMXレコードも設定します。

f:id:ryoichi0102:20161108215254j:plain
DNSレコードの設定例の画面はお名前.comのものです

DNSレコードの設定反映を待ち、SES側でverifiedになるのを待つ。(個人差あり)
設定が完了すると自分のAWSアカウントに登録してあるメールアドレスにメール通知がきます。

タイトル: Amazon SES Domain Verification SUCCESS for mydomain.com in region US West (Oregon)
本文: Congratulations! The Amazon SES verification process for the domain mydomain.com in region US West (Oregon) is now complete. You are now able to send email through Amazon SES from any address within this domain. For more information, please refer to the Amazon SES Developer Guide.

Thank you for using Amazon SES.

このようにstatus verifiedになっているのが確認できます。 

f:id:ryoichi0102:20161108214557j:plain

なお、ドメイン自体がverifiedになってもまだSandbox(テスト)状態です。次の手順へ。

2. メールアドレスのVerify

本来ここで設定するのは、メール送信で使用する送信元となるメールアドレスなのですが、さきほどverifyしたばかりのドメインはメールアドレスの受信設定がまだなので
既に送受信できるメールアドレス(Gmailとか)をまず設定します。

Email AddressesからVerify a New Email Addressボタンを押下し
メールアドレスを入力します。

メールアドレス宛に送信されたメールのリンクより認証を行う。

f:id:ryoichi0102:20161114130403j:plain

f:id:ryoichi0102:20161114135324j:plain 

f:id:ryoichi0102:20161114163057j:plain

f:id:ryoichi0102:20161114163206j:plain

これでmy@gmail.comとの紐付けが完了しました。

3. SESのSandboxテストメール送信、ここでSNSもセットアップ

ドメイン設定とメールアドレスの検証が終わりましたが、まだまだSandbox状態です。
これからメール送信テストを行うのですが、それぞれのテストケースの結果を捕捉するために、メール送信に関しての通知設定をしておきましょう。
つまり、SESでメール送信した結果をSNSで通知します。

3-1. メール送信に関してのSNS設定

慣れてないとSNSって聞くとSocial Networking Serviceなんですが、
AWSではSimple Notification Serviceの略で、通知を行うサービスです。

Email Addresses⇒さきほど登録したmy@gmail.comの設定⇒Notifications⇒Edit Configurationと進みSNSの設定を行います。

f:id:ryoichi0102:20161228181452p:plain

f:id:ryoichi0102:20161229012910p:plain

Email Feedback Forwarding は初期状態でenabledになっておりすべての送信に対してのフィードバックが自分のメールアドレスに送られます。

通知の頻度を最小限に抑えたい場合は
Bounce Notifications SNS Topic
・Complaint Notifications SNS Topic
の両方を設定するとEmail Feedback Forwardingはdisableにできます。 

docs.aws.amazon.com

3-2. Sandboxでのテストメール送信

メール送信テストは、メールにおいての各ケースの送信テストです。
・Success (成功)
Bounce (エラーメール)
・Out Of The Office (OOTO) (宛先不在)
・Complaint (苦情応答)
・Address on Suppression List (送信不可リストに記載)
の各ケースにおいてテスト送信を行い想定通りに処理されることを確認しましょう。

ここでは先程設定した通知がちゃんと行われて、それぞれのケースが発生した場合の対応業務フローが確立されていることを確認しましょう。

docs.aws.amazon.com 

4. 制限解除の申請

このままSandboxのままではVerifyしたメールアドレス(つまり自身)にしか送信できないため、制限解除をする必要があります。

AWSへサポート問い合わせする必要があり、ちょっとした心のハードルになるのですが、手順通りに進めれば問題ありません。

dev.classmethod.jp

制限解除されるとAWSアカウントに通知が来ます。
これで任意の送信先に送ることができます。

f:id:ryoichi0102:20161229014248p:plain

5. メール送信の設定

送信用のIAMユーザーを作ってsendmailからメールを送ったり
下記のようにSMTPでメールを送ることもできます。

dev.classmethod.jp

6. メール受信の設定

SESにて受信したら、S3にその内容を保存し
AWS Lambdaを使用してS3の内容を取得し、SESを利用して目的の転送先にメール送信します。

iseebi.hatenablog.com

 

AWSに拘らない人はSendGrid使いましょう

sendgrid.kke.co.jp