Fargateで起動したコンテナからSES経由で指定したメアドへメールを送信する

## 追記
2020年07月02日

* [Amazon SESが東京リージョンで利用できるようになった](https://aws.amazon.com/jp/blogs/news/amazon-ses-tokyo/)

## 概要
* EC2上で動かしてたバッチスクリプトをコンテナへ移植するにあたり、そのバッチ処理の結果を指定したメールアドレスへメール送信する処理を、SESを使ってメール送信する処理へ変更するために試してみたことのメモ。
* Docker に aws cli を入れて、コンテナ内から [aws ses send-email](https://docs.aws.amazon.com/cli/latest/reference/ses/send-email.html) コマンドを実行してコンテナ内にあるファイルをメールボディにして指定したメールアドレス宛にメールを送信する。

## 前提
* Fargate と SES は同じAWSアカウントで、
 * Fargate は東京リージョン
 * SES は米国西部オレゴン(us-west-2) リージョン （SESは東京リージョンにはない）
* 送信先メールアドレスは既存のもので、そのメールアドレスに送信したメールをメールクライアントで正常に受信ができること
 * ここでは、説明のため ses-test@example.comというメアドにしている

## 設定
#### SES で送信先メールアドレスの検証を行う
1. SES Home ⇒ Identity Management ⇒ Email Address
![01,png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/b2d84861-3be2-c03f-2c70-35789625e681.png)

2. Verify a New Email Addres
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/d706b4ea-7874-8202-8bca-17449b29ab3e.png)

3. Email Address に送信先のメールアドレスを入力して、「Verify This Email Address」を押下
※ここでは説明のため、ses-test@example.com としている
![スクリーンショット 2019-06-29 16.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/1a06d564-5fe0-c669-4c84-f4265fae1070.png)

4. 上記で入力したメールアドレス(ses-test@example.com )にVerification Requestメールが届くので、メール内のリンクを踏む。
※件名： Amazon Web Services – Email Address Verification Request in region US West (Oregon)
↓
[検証に成功しました](https://aws.amazon.com/jp/ses/verifysuccess/)

5. 送信先メールアドレス(ses-test@example.com)が verified になったことを確認
※↓の画像では実際のメールアドレスが表示されているので伏せている
![スクリーンショット 2019-06-29 17.07.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/7253e928-cb1a-6dd5-dbba-791de32cf6a9.png)

6. 作成したメールアドレス(ses-test@example.com)の Identity ARN を確認する（IAMポリシー作成時に必要）
※↓の画像では実際のメールアドレス、ARNが表示されているので伏せている
![スクリーンショット 2019-06-29 17.09.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/f5381a75-cb0e-2596-f256-8a697e990daa.png)

※SESからのメールが迷惑ボックスに入ってしまう場合は、[DKIM設定](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/dkim.html)を行う。


#### コンテナからSESへメールを送信する権限をもったIAMロール、IAMポリシーを作成
* IAMポリシーを作成
 * ポリシー名：ses-sendmail
 * JSON

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "20190629sessendmail",
            "Effect": "Allow",
            "Action": "ses:SendEmail",
            "Resource": "arn:aws:ses:us-west-2:〜"
        }
    ]
}
```
※リージョンはオレゴンなので、us-west-2
※Resource のところに、SESのARNを入力する

* IAMロール作成
 * ロール名：ses-sendmail
 * 信頼されたエンティティの種類：Elastic Container Service の Elastic Container Service Task
 * ロールにアタッチするポリシー：ses-sendmail

![スクリーンショット 2019-06-29 17.14.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/5578b4bb-bb1d-9b04-38fa-fea1b9e2eeec.png)


#### Dockerfile
* 概要
 * 軽量のAlpine Linux に awscli をインストール
 * コンテナ内で test.txt を作成
 * aws ses sendmail コマンドで test.txt の内容をメールボディにして SES 経由で ses-test@example.com へメールを送信

* Dockerfileの内容

```Dockerfile
FROM python:3.7-alpine
RUN pip3 install awscli
RUN echo "test" > /test.txt
CMD aws --region us-west-2 ses send-email --to ses-test@examaple.com --from ses-test@example.com --subject "test" --text "`cat /test.txt`"
```

#### Dockerfile をビルドしてDockerイメージをECRへプッシュ
* 参照
 * [動作確認用コンテナのDockerイメージを作成](https://qiita.com/tonishy/items/810950dec4f1ae0d761f#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D%E7%94%A8%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AEdocker%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E6%88%90)
 * [AWS ECR 設定概要](https://qiita.com/tonishy/items/810950dec4f1ae0d761f#aws-ecr-%E8%A8%AD%E5%AE%9A%E6%A6%82%E8%A6%81)
 * [Dockerイメージを AWS ECR へ PUSH する](https://qiita.com/tonishy/items/810950dec4f1ae0d761f#docker%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92-aws-ecr-%E3%81%B8-push-%E3%81%99%E3%82%8B)

#### Fargate タスク定義 作成
* 参照
 * [AWS Fargate の設定とタスク実行](https://qiita.com/tonishy/items/810950dec4f1ae0d761f#aws-fargate-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8%E3%82%BF%E3%82%B9%E3%82%AF%E5%AE%9F%E8%A1%8C)

* タスクロールで 「ses-sendmail」 を選択する
![スクリーンショット 2019-06-29 17.25.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/67c72523-11af-02b7-f427-6fac86f5a146.png)


#### Fargete でタスクを実行テスト
* タスク定義で上記で作成したタスク定義を選択、アクションで タスクの実行 を選択
![スクリーンショット 2019-06-29 17.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/da7efd58-6544-df75-e247-4706c64f5867.png)

* 起動タイプはFargateを選択、VPCは適当なものを選択して、タスクを実行する
![スクリーンショット 2019-06-29 17.28.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/31ca603e-4933-fa2b-b96a-804647525430.png)

* タスク実行中
![スクリーンショット 2019-06-29 17.29.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/0cd88690-081e-9a29-e8e4-061d40761e9e.png)


* 実行結果は CloudWatch ログの /ecs/タスク定義 ログストリームに出力される
![スクリーンショット 2019-06-29 17.30.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/1abfde6a-e714-dee8-d6d6-c9abaaca7bc2.png)

↓
メール送信が正常に完了していれば、MessageIdが出力される
![スクリーンショット 2019-06-29 17.30.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/4fbef6be-0a1e-b4a0-2d84-26a9a79f8214.png)

* ses-test@example.com 宛にメール後届いている確認