【AWS】SES構築について

### 目次
1. [はじめに](#1はじめに)
2. [事前準備](#2事前準備)
3. [SES制限緩和申請](#3ses制限緩和申請)
4. [SES作成](#4ses作成)
5. [EC2ロールにSESポリシーをアタッチ](#5ec2ロールにsesポリシーをアタッチ)
6. [バウンス、苦情対策](#6バウンスと苦情対策)
7. [DMARC設定](#7dmarc設定)
8. [DNS登録](#8dns登録)
9. [ログ出力設定](#9ログ出力設定)
10. [参考情報](#10参考情報)

### 1.はじめに

皆さんこんにちは、奥平です。
今回はSES環境を構築したいと思います。

SES環境構築を書いた理由につきましては、2022年になってSESのWEB画面（UI）が大きく変更があり、英語だらけになってしまい、構築しづらいと思ったのでナレッジ残しとして記事にしました。
※今回はSES構築を中心としますので、IAMロール作成やSNS作成、その他リソース作成につきましては省略致します。
※本当はCLI等で構築出来るようになった方が良いのですが、それはまたの機会に致します。



### 2.事前準備
テスト用DNSサービスをRoute53に登録しておいてください。
今回は下記テスト用ドメインを用意しました。
SESテスト用ドメイン：okuhira-test-ses-domain.ga


### 3.SES制限緩和申請
SESを使用する際、最初はサンドボックスとして利用出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/bf2c0933-7864-3642-2e78-f3750ebdcb6c.png)

練習でSESを使うのでしたらサンドボックス内で問題ありませんが、本番運用としてSESを使用する場合、サンドボックス外へ移動する必要があります。
今までのSESでは、AWSお問い合せを行い、SES制限緩和申請（サンドボックス解除）を行っておりました。
ですが、UIが変わってからは下記の様に申請が変わっておりました。

[1] ユーザーが要求した送信クォータの増加
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/manage-sending-quotas-request-increase.html#user-requested-increased-sending-quotas 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/65adabfc-6ab6-ef18-acec-37c4e9846678.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/7c909766-e989-bcea-033b-1b3b01132e74.png)

[2] Amazon SES サンドボックス外への移動
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/request-production-access.html 
上記[2]のサンドボックス外への移動ですが、上記[1]のユーザーが要求した送信クォータの増加を行うと自動的にサンドボックス外へ移動になりましたので、特に操作していません。

### 4.SES作成
Verified identities　をクリックし、Create identity　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/7876cb13-389a-c8d8-ef01-d9ebbe35e922.png)

登録したドメイン名を記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/0e43f56d-efc1-d723-71b9-22f4863ca90a.png)
カスタムMAIL FROMは後で作成するのでチェックを外しておきます。

Easy DKIM　を選択し、RSA_2048_BITを選択して作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/f2f1aaa5-a1f0-cc62-45f1-a0ccd1625481.png)

SESが作成され、自動的にDKIMのレコードがRoute53に登録されます。
※Route53を使用していない場合、CNAMEレコードは手動で登録する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/aa1b4f84-08a9-ba9f-b068-e3f517c3b5ab.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/11415e26-8482-97f1-6af5-ea420c6af86f.png)

しばらくすると（5分程）、Verified（確認済み）、Successful（成功）の文字が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/34d7f706-dd43-6758-6731-b1baa6d38369.png)



### 5.EC2ロールにSESポリシーをアタッチ
省略しますが、EC2用のロールを作成し、SESポリシーを設定し、使用するEC2にアタッチしておきます。
下記記事をご参照ください。
- [AWS EC2インスタンスにIAMロールを割り当てる](https://qiita.com/togo_mentor/items/e26e55a096742b88f6de)

### 6.バウンスと苦情対策
SESでは、バウンスや苦情の対応が必要になります、放置しておくとSES利用停止になってしまいます。
事前準備：SESイベント通知用のSNSを作成しておきます。

１．Verified identities　をクリックし、Notificationsタブをクリックします。
２．Feedback notifications　のEdit　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/9e50e05a-3320-83ba-8b5a-016896213ed6.png)


３．Bounce feedback　と、Complaint feedback　に作成したSNSを選択します。
※Include original email headers　にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/c9d3d559-c4ff-fcb5-6ce1-1578896318aa.png)


４．SESバウンス動作確認
SESバウンスがSNSで通知されるか、テストメール送信を送信します。
Send test email　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/364f53e5-5a4c-3301-a0ed-75e63f999d86.png)


From-address：test@okuhira-test-ses-domain.ga
Scenar：Bounce
Subjent：バウンステスト件名
Body：バウンステスト本文
テストメール送信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/f93a7d3c-2308-ac2c-8c5e-e742f95edf4c.png)

下記のようにメールが届いたらOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/9952be28-851f-e74e-b239-f6bf6a3e404d.png)


５．SES苦情確認
同様に、苦情もテストメールします。
From-address：@okuhira-test-ses-domain.ga
Scenario：Complaint
Subjent：苦情テスト件名
Body：苦情テスト本文
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/586de78f-71b6-fae2-c7ec-544d9aa84959.png)

メールが届くのを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/266d50c5-ec37-fc02-38ed-39e2412719f0.png)



### 7.DMARC設定
１．最初はSPF情報を作成します。
Verified identities　をクリックし、Authenticationタブをクリックし、Custom MAIL FROM domain　のEditをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/ca367785-3bf3-9642-5f26-fc8bfe2e47e7.png)


MAIL FROM domain　は任意で分かりやすい文字列を記載します、今回は「return-mail」としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/475cdea3-4d2f-56a1-04bb-e71d9972fd00.png)

Publish DNS records to Route53　をクリックして、簡単にRoute53に登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/3da1e3ac-598c-9586-7487-7fbd3e0324e9.png)

Route53に登録されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/1416a1f7-dcf9-078d-cb42-41cab24bcf76.png)

２．次に、DMARC情報を手動でRoute53に登録します。
レコード名：_dmarc.okuhira-test-ses-domain.ga
タイプ：TXT
値："v=DMARC1; p=none; rua=mailto:＜メールアドレス＞"
※p=none　につきましては、仕様によってタイプを検討ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/b2eb7873-d5f3-3673-2d39-4fe949503300.png)


### 8.DNS登録
DNS登録の確認です、下記内容がRoute53に登録されているか確認します。
　【「SES作成」で出力されたTXTレコード】
　①CNAMEレコード（DKIM)
　②CNAMEレコード（DKIM)　
　③CNAMEレコード（DKIM)　　
　
　【「DMARC設定」で出力されたTXTレコード】
　④TXTレコード（SPF）　
　⑤MXレコード（SPF）
　⑥TXTレコード（DMARC）※手動設定

下記のように任意のメールアドレス宛にテストメールを送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/1e212f5f-4275-b0c7-451f-11e339d50611.png)

SPF、DKIM、DMARCが全てPASSしているのを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/ceae5b85-ef35-2adf-c70e-e28d5a73b80a.png)


### 9.ログ出力設定
SES送信ログをより詳細にS3に保管する方法です。
※ここではAmazon ES（ElasticSearch）を使用せず、S3にログを置くパターンを記載致します。

①Kinesis 配信ストリームを作成する
※変更箇所のみ記載します、後はデフォルト設定です。
※Kinesisも、よくUIが変わりますのでご注意ください。。。


１．Kinesis コンソール　→　「Kinesis Data Firehose」を開きます。
２．[Create Delivery Stream] をクリックします。
３．[Delivery stream name] に、ストリームの名前を入力します。
４．[Source] で[Direct PUT] 、[Destination]で[Amazon S3]を選択します。
５．[Delivery stream name]は任意の名前を記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/e3bea35f-fc60-8b58-6a14-f7bbbd124508.png)

６．任意のS3バケットを選択します。　（※恐らくですが対象S3バケットは空である必要があります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/b36ceec8-9a3d-1222-5d7b-9c6495c3ecb8.png)

７．[Compression for data records]は[GZIP]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/a086611b-4c7f-d5a9-4507-0d74d8940cb3.png)

あとはデフォルト設定で作成へ進みます。

②SESのConfiguration sets作成
ここで気をつけないといけない事があります。
SES用のロールを作成する必要がありますが、何故か現時点（2022年3月）ではSES用ロールの作成が出来ません。。。
現時点では下記の手順を踏む必要があります。
Ⅰ.　一度、EC2用ロールを作成する
Ⅱ.　作成したEC2用ロールをSES用ロールに修正する

EC2用ロールに対し、下記2件の修正を致します。
※「xxxxxxxxxxxxx」の箇所は自身のAWSアカウントIDです。
・SES用ロールに付与するポリシー（ロール名：test-ses-role）
```json:（例）SES用ロールに付与するポリシー/test-ses-role
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "firehose:PutRecordBatch"
            ],
            "Resource": [
                "arn:aws:firehose:ap-northeast-1:xxxxxxxxxxxxx:deliverystream/okuhira-kinesis-ses-log"
            ]
        }
    ]
}
```


・信頼されたエンティティを下記のように修正します。
```json:（例）信頼されたエンティティ/test-ses-role
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:ses:ap-northeast-1:xxxxxxxxxxxxx:configuration-set/okuhira-ses-configuration-kinesis-log",
                    "AWS:SourceAccount": "xxxxxxxxxxxxx"
                }
            }
        }
    ]
}
```

上記ロールを作成後、SESのConfiguration setsを作成致します。

１．SES画面のConfiguration sets　をクリックして、Create set　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/22492505-ab05-23b1-c057-0d5180e00e85.png)

２．任意の名前を記載し、あとはデフォルト設定で作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/0c14229f-c3ef-ed5e-953f-b96113a30fe2.png)

３．次に、Event destinations　タブをクリックし、Add destination　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/57cd1539-e3b1-ff8f-2ded-60d1caa6152d.png)

４．イベントタイプを任意で選択します。　※ここでは全て選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/73bd9e80-bb74-40c8-7f84-a609b1fc86b9.png)

５．[Destination type]は[Amazon Kinesis Data Firehose]を選択します。
任意の名前を記載します。

６．[Delivery stream]は先程作ったKinesisを選択します。

７．[Identity and Access Management (IAM) Role]は先程作ったSES用ロール（元EC2用ロール）を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/3fffa1d1-c51c-3b20-f406-bedb4433fbac.png)

８．「Default configuration set」のアタッチ設定を行う
作成したconfiguration setを対象ドメインにアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/ca3d23a2-758b-769e-8dac-ea0cc6037602.png)



③設定をテストする
１．Amazon SES コンソールを使用してテスト E メールを送信します。
２．Verified identities　→　対象SESを選択し、[Send test email]をクリックします。

＜送信メール履歴確認＞
Email Formart：Formatted
From：info@ドメイン名

X-SES-CONFIGURATION-SET: ＜Configuration Sets名＞
subject: 迷惑メールテスト
これは迷惑メールテスト送信です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/f5f20e00-6bae-2899-af1c-d7b934611780.png)



＜バウンスメール確認＞
Email Formart：Formatted
From：info@ドメイン名

subject: バウンスメールテスト
X-SES-CONFIGURATION-SET: ＜Configuration Sets名＞
これはバウンスメールテスト送信です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/4caa3cc1-3661-66be-bb55-b8aa26dafc27.png)


メールが届くことを確認します。
対象S3にログが格納されることを確認致します。（※数時間かかる場合もあります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682071/5981c33d-9aa2-6a8d-f9ee-fe8b636861ac.png)



あとは、実際にSES送信する際、メールのヘッダーに下記文言を設定致します。
X-SES-CONFIGURATION-SET: ＜Configuration Sets名＞

※AWS公式ドキュメント（SES、ステップ 3: E メールを送信するときに設定セットを指定する）
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/event-publishing-send-email.html


以上でSES構築は終了となります、お疲れ様でした。
次回またUIが変わる前までには、CLIを取り入れてSES構築したいと思います。

### 10.参考情報
SPF、DKIM、DMARCの簡単な説明を下記記事から抜粋しております、詳細は下記記事をご参考ください。
https://mailmarketinglab.jp/about-dmarc/


・SPF
電子メールの送信元ドメインが詐称されていないかを検査して、なりすましメールではないと確認してくれます。
　→SES設定時にAWSマネージドサービスにて対応済みとなります

・DKIM
送信ドメイン認証システムの1つで、受信した文章が途中で改ざんされていないかをチェックして迷惑メール扱いになるのを防ぎます。
　→SES設定時にAWSマネージドサービスにて対応済みとなります

・DMARC
上記のSPF、DKIMそれぞれの働きを補強するための技術です。 DMARCの役割は主に以下の３つとなります。
１．メール送信者が認証失敗したメールの取り扱いを指定できる
２．メール送信者が認証結果をメール受信者から受け取れる
３．第三者署名（代理署名）を許容しない

DMARCのレコード設定で、「値："v=DMARC1; p=none; rua=mailto:＜メールアドレス＞"」とありますが、SPFでもDKIMでもカバーしきれない対応が、＜メールアドレス＞に送信されます。
＜メールアドレス＞は、運用チームのメールアドレスを設定します。