特定ドメイン宛のメールをS3に受信 by SES+Route53 (AWS Certificate Managerで必要になった)

あるドメイン宛のメールをS3に保存するための手順をメモ。
SESで送られたメールをS3に流すためのRule Setを作成するが、これをActiveにするのを忘れないように注意。

ACMはAWS上のサービスで無料でSSL証明書を使用でき、更新も自動で行ってくれるため失効して使えなくなることもないので積極的に活用すると良い。
ACMでSSL証明書発行の際に、既存のドメインを利用して発行すると、以下のアドレスに証明書承認のためのリンクが含まれたメールが送られる。

```
postmaster@*********
administrator@*********
admin@*********
webmaster@*********
hostmaster@*********
nic-staff@*********
```

しかし、諸事情でそのメールを受け取れないことがあり得る。そのため、対象ドメイン宛のメールはS3に保存されるようにする。

#ドメインの取得
AWS上でドメインの取得を行う。
既に受信するメールアドレスのドメインを持っている場合はこの章を飛ばして良い。

##Route53の登録
Domain Regisration
[Get started now]

[Register Domain]
1: Domain Search
Choose a domain name
************ .com - $12.00 [Check]
[Add to Cart]
[Continue]

住所や電話番号などの詳細情報を入力。

[Continue]

Terms and Conditions
I have read and agree to the AWS Domain Name Registration Agreement
にチェックを入れて、[Complete Purchase]

[Go To Domains]



Pending requestsのところに申請したドメインがDomain registration in progressの状態としてリストに載る。

30分程経ったら、Registered domainsに移動する。
Hosted zonesにも作成したドメインが存在することが確認できる。

#SESの設定
マネジメントコンソールからSESを選択
現地点では、以下の3つのリージョンしかサポートされていないのでこの中から一つ選択。

```
EU (アイルランド)
米国東部 (バージニア北部)
米国西部 (オレゴン)
```

ここではオレゴンを選択。

##Domain認証
Domainsを選択
[Verify a New Domain]を選択
ダイアログボックスに以下のように入力
Domain: ************.com
[Verify This Domain]を選択

すると、DNSのレコードにTXTレコードとMXレコードを登録する旨が表示される。

Route53でドメイン登録した場合、Hosted zoneに登録したドメインが存在しており、この時、ダイアログボックス右下が[Use Route 53]というボタンになっているのでこれを選択。

Use Route53のダイアログボックスが現れる。以下の3つのものにチェックを入れる。

```
Domain Verification Record
Email Receiving Record
*********.com. - HostedZone created by Route53 Registrar
```

※Email Receiving Recordにチェックを入れることを忘れないようにすること。

Domainsでドメインがpendingの状態から1分ほどでverifiedになる。


##Emailの受信設定
Email ReceivingのRule Setsを選択
[Create a Rule Set]を選択
現れるダイアログボックスに以下のように入力する。
Rule set name: ses-s3-ruleset

[Create a Rule Set]を選択


Rule Setsの画面に戻るので、先ほど作成したRule Setを選択。
[Create Rule]を選択
###Step 1:Recipients
Recipientに**********.comを入力して[Add Recipient]を選択
[Next Step]

###Step 2:Actions
Add action ＜Select an action type＞を押して、[S3]を選択

S3 bucket: Create S3 bucketを選択
現れるダイアログボックスに以下のように入力
Bucket Name: my-email-box
[Create Bucket]

Add action ＜Select an action type＞を押して、[Stop Rule Set]を選択

※S3のバケットの名前はS3全体で一意なので、そうなるように名前を変更すること。

###Step 3: Rule details
Rule name: ses-s3-rule

[Next step]

###Step 4: Review
内容を確認したら、[Create Rule]を選択

作成したRuleがEnabledになることが確認できる。

※次に重要で忘れないようにしたいが、Rule setsを選択して、先ほど作成したses-s3-rulesetを選択して、[Set as Active Rule Set]を選択

以上で~@************.comのメールはS3に保存されるようになる。

例えば、test-user@**********.com当てに
タイトル: hoge
本文: fuga
のように内容を送ると以下のようなテキスト文がS3の指定したバケットに保存される。

```
Return-Path: <送信元メールアドレス>
Received: from **************** (************************ [***.***.***.***])
 by ******************** with SMTP id **********

:
:
:

To: sample-user@**********.com
From: name<***************@gmail.com>
Subject: hoge
Message-ID: <*******************************************************@gmail.com>
Date: Thu, 18 Aug 2016 00:47:11 +0900
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0)
 Gecko/20100101 Thunderbird/45.2.0
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp; format=flowed; delsp=yes
Content-Transfer-Encoding: 7bit

fuga

```

#ACMの設定
##SSL証明書の発行
マネジメントコンソールから、Certificate Managerを選択し、遷移した先のページで[証明書のリクエスト]を選択。

##ステップ 1: ドメイン名の追加
*********.com
*.***********.com(ワイルドカード)
[確認とリクエスト]

##ステップ 2: 確認とリクエスト
内容を確認したら、[確定とリクエスト]を選択

##ステップ 3: 検証
内容を確認して、[続行]を選択

すると、以下の宛先にSSL証明書発行確認のためのメールが送られる。

```
admin@*************
owner@*************.whoisprivacyservice.org
tech@*************.whoisprivacyservice.org
webmaster@*************
postmaster@*************
hostmaster@*************
admin@*************.whoisprivacyservice.org
administrator@*************
```

Route53でドメインを登録した場合は.whoisprivacyservice.org宛のメールはAWSアカウントを登録しているドメインを登録した際に登録したメールアドレス宛に、それ以外はS3に保存される。


既存のドメインを使用して、SSL証明書発行をした場合は以下の宛先にメールが送られる。

```
postmaster@*********
administrator@*********
admin@*********
webmaster@*********
hostmaster@*********
nic-staff@*********
```

これらの宛先のメールが全てS3に保存される。その中のどれでも良いので、メール本文中のリンクをブラウザで開き、[I Approve]を選択し、SSL証明書発行の承認をする。

以上で発行していたSSL証明書が有効になる。

#参考
http://dev.classmethod.jp/cloud/aws/acm-verifydomain-ses/