AmazonSESのログをS3へ出力する

# やりたいこと
SESを使ってメールを送信していますが、メール送信に失敗することが多々ありました。
その原因調査をするために、送信失敗したSESのログをS3で集計できるようにしたいと思います。

# 手順
今回は`Kinesis`と`S3`を使ってSESのログ収集できるようにします。

1. S3バケットを作成
1. Kinesisの配信ストリームを作成
1. SESConfigurationSetsを作成
1. SESConfigurationSetのロールを作成
1. SESConfigurationSetのイベントと送信先を設定
1. ログがS3に保存されるかテスト
1. ログ収集したいドメインとConfigurationSetを紐づけ

## S3にバケットを作成する
SESのログを保存するためのS3バケットを作成する。

1. AWSコンソールからS3へ遷移して、「バケットを作成」を押す
![S3-Management-Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/5b653375-7519-867e-5975-6a17d4636119.png)

2. 適当なバケット名を入力する（今回はSES-logs）
その他は環境に合わせて項目を選択し「バケットを作成する」で新たなバケットが作成できる
![S3-bucket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/e995f0fe-9ec8-3223-5c9f-8130f17ab8ae.png)

## Kinesisで配信ストリームを作成する
SESからS3にログデータを送信する繋ぎの部分をKinesisに作成する。

1. Amazon Kinesis > 配信ストリーム（もしくはDelivery streams） に移動して、「Create delivery stream」からストリームを作成する
![Amazon-Kinesis-Firehose.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/5b13f7fc-5b0e-d3ac-1580-8cea84d8703c.png)

2. 環境に合わせた項目を選択する
![Amazon-Kinesis-Firehose-input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/f1a9a1fa-38e6-503c-b143-45080ccfa19f.png)

* Source: `Direct PUT`

* Destination: `Amazon S3`

* Delivery stream name: `SESToS3`
適当な名前を入力

* S3 bucket: `SES-logs`
先ほど作成したバケットを選択

* S3 bucket prefix: `bounce/!{timestamp:yyyy}-!{timestamp:MM}-!{timestamp:dd}/`
S3バケット内でどのようにファイル分けするか設定できる（入力しなくてもOK）
今回は日付で分けられて出力されるように設定（例えば、bounce/2022-03-24/）
カスタムプレフィックスについては[こちら](https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/s3-prefixes.html)を参照

* S3 bucket error output prefix: `errors/`
出力エラーがあった際に、バケット内のどこに出力するかを設定する（入力しなくてもOK）

* Buffer interval: `60`
データを収集する間隔を設定する
デフォルト300のままでもOK

最後に「Create delivery stream」を押してストリームを作成する

## SESの設定を作成する
SESの送信ログをKinesisに送るように設定する。

1. Amazon SES > Configuration setsの「Create set」で設定を作成する
![AWS-Simple-Email-Service-Configuration-sets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/b200adca-91fd-1740-7056-0eb5c46089c2.png)

2. 適当な設定名を入力する
![AWS-Simple-Email-Service-Create-set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/ece95cde-a08a-61de-8e56-bb7d905f5ad3.png)

## SESからKinesisにログを送るためのロールを作成する

1. IAM > ロール で「ロールを作成する」
![IAM-Management-Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/01346afc-ee3f-a1c8-2b60-3402eb55d855.png)

2. 信頼されたエンティティを設定する
![IAM-Management-Console-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/4b8216a8-c00a-b49f-17ab-10390c186fe4.png)

* 信頼されたエンティティタイプ: `カスタム信頼ポリシー`

* カスタム信頼ポリシー:

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceAccount": "xxxxxxxxxxx",
                    "AWS:SourceArn": "arn:aws:ses:ap-northeast-1:xxxxxxxxxxx:configuration-set/SendMailLog"
                }
            }
        }
    ]
}
```
※`ap-northeast-1`はSESのリージョンに合わせて変更する
※`xxxxxxxxxxx`はAWSのアカウントIDに変更する
※`SendMailLog`は先ほど作成したSESConfigurationSet名を指定する

3. ステップ２の許可追加は何もしないで進める

4. ロール名を入力して「ロールを作成」する
![IAM-Management-Console-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/55924250-1f69-369f-ad61-9c42ba7b8610.png)

5. 先ほど作成したロールにポリシーを追加する
![IAM-Management-Console-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/da3fb277-90a8-f373-7afd-39488c89ff2a.png)

6. インラインポリシーを設定する
![IAM-Management-Console-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/6ded63c3-fd63-8d1a-14d8-1e6502d38746.png)

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "firehose:PutRecordBatch"
            ],
            "Resource": [
                "arn:aws:firehose:ap-northeast-1:xxxxxxxxxxxx:deliverystream/SESToS3"
            ]
        }
    ]
}
```
※`xxxxxxxxxxxx`ははAWSのアカウントIDに変更する
※`SESToS3`はKinesisで作成したDeliveryStream名を指定する


## SESConfigurationSetのイベントと送信先を設定する

1. イベントと送信先を設定する
AmazonSES > Configuration sets > SendMailLog（先ほど作成した設定） >　Event destinations で「Add destination」を押す
![AWS-Simple-Email-Service-Details-page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/85c0accf-ba6b-6c39-ea55-1be5849035f1.png)

2. どのイベント時にログを送信するか設定する
今回はメール送信が失敗した場合のみログを送信する
![AWS-Simple-Email-Service-Add-event-destination.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/d09dbc08-f8bf-5be3-ca44-08c2f679f48b.png)

3. 送信先をKinesisに設定する
![AWS-Simple-Email-Service-Add-event-destination-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/29afd7b3-acc4-5419-10e3-bb9d1a10bf8b.png)

* Destination type: `Amazon Kinesis Data Firehose`

* Name: `BounceEvent_ToKinesis`
適当な名前を入力する

* Delivery stream: `SESToS3`
Kinesisで作成したDeliveryStreamを選択する

* Identity and Access Management (IAM) Role: `ses-to-kinesis-policy`
先ほど作成したIAMロールを選択する

「Next」でプレビューで設定を確認して設定を完了させる

## ログがS3に保存されるかテストする

1. AmazonSES > Verified identities > ログ収取したいドメインを選択し「Send test email」を押す
![AWS-Simple-Email-Service-Details-page-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/1a34f99a-df79-6e06-43cd-3de544f24986.png)

2. テストメールを設定して送信する
![AWS-Simple-Email-Service-Send-test-email.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/e1e990da-441e-8adc-1371-58effdea0f81.png)

* Email format: `Formatted`

* From-address: `info`

* Scenario: `Bounce`
Configuration setsのイベントを失敗したとき限定にしたため、Bounceを選択

* Subject: `test`
適当なメール件名を入力する

* Body: `bounce test`
適当なメール本文を入力する

* Configuration set: `SendMailLog`
作成したConfigurationSetを選択する

最後に「Send test email」を押してテストメールを送信する
S3のバケット（今回はSES-logs）にログファイルが出力されていれば成功！

## ログ収集したいドメインにConfigurationSetを紐づける

1. AmazonSES > Verified identities > ログ収取したいドメイン > Configuration set の「Edit」を押す
![AWS-Simple-Email-Service-Details-page-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/1eda18b1-0ba7-d998-be4c-53b3350c23a2.png)

2.　作成したconfiguration setを選択して保存する
![AWS-Simple-Email-Service-Edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120480/5255cb77-8fb1-afed-c5c3-c675e4f3408e.png)


***

これでSESのログがS3へ保存されるようになります。
結構設定手順が多いので面倒でしたね。。