【AWS】AWS SESのログをKinesis Data Firehose経由でS3へ転送してみました

# はじめに
AWS SES のログを Kinesis Data Firehose 経由して、S3 へ転送する手順を公開します。
公式サイトでは、SESのログを Kinesis Data Firehose 経由で、Elasticsearch へ送信し、ログを可視化する手順が公開されています。
今回私は転送先を Elasticsearch とせず、S3へと設定しました。

# 構成図
構成図は下記となります。
SES のログを、 Kinesis Data Firehose 経由で S3 へ転送されます。
![SES.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/dd5eb694-907a-a9f8-a834-53837e56bc29.png)

# １．S3バケットの作成
S3で新規バケットを作成します。
バケット名は適宜に決めてください。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/49fc1962-cdc2-65e3-a518-df314aaba8c9.png)

下記のように、```パブリックアクセスをすべてブロック```にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/3da8c0e6-dd03-18ad-7171-2b08bad4c97e.png)

バケットのバージョニングを有効化します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/feb42f34-94b6-178a-3d87-df1870257e6e.png)

暗号化も有効化し、```バケットを作成```を押下します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/3673d35c-aebb-8cf5-b26d-210981b162ca.png)

なお、バケットポリシーは適宜に設定しておいてください。
今回は検証のため、バケットポリシーの設定はそのままデフォルトとします。

# ２．Kinesis Data Firehose の作成
Kinesis Data Firehose の画面で、```Create delivery stream```を押下します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/38f73251-6411-ce53-582f-292acdad7944.png)

```Delivery stream name```欄に適宜に名付けしてください。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/b83c9ef8-be32-d95b-64b0-b58b37a6bd21.png)

```Choose a source```はデフォルのままで大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/bbf18bdb-70fb-c0ba-0d52-64dfe99c4d12.png)

```Process records```はデフォルのままで大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/2c02beb7-a970-30f2-4901-c4bf476aac44.png)

```Choose a destination```は```Amazon S3```を選択します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/bb2be3be-f8e4-446b-8ff6-cb32c76e8a3a.png)

```S3 destination```に、上記手順１で作成したS3バケットを選択します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/6058e43f-9062-d91f-d675-c841a8a2e55d.png)

```S3 prefix```と```S3 error prefix```に、適宜にご希望のプレフィックスを入力します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/9bafd4e9-a1cc-b3d7-9aee-4b4df4d54b1b.png)

今回テストで早くログを見たいため、```Buffer interval```を```60```秒に設定しました。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/6cede4fa-a6f3-5b7f-3870-ae39d4062cec.png)

```S3 compression and encryption```と```Error logging```はデフォルのままで大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/b93eec57-bfd6-b57c-23fa-5e1d85833de9.png)

``` Tags ```はそのままで大丈夫です。（必要に応じて適宜に入れてください）
なお、```Permissons```は自動でIAMロールを作成するように選択してください。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/9772fa0f-49cc-1e15-11b5-345d6894633c.png)

最後は上記内容をレビューし、問題がないことを確認したら作成を押下します。

# ３．SESで設定
SES左側のメニュー一覧に```Configuration Sets```を押下します。
```Configuration Set Name```に適宜の名前を入れてください。
入力し終わったら、```Create Configuration Set```を押下します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/5691c328-d8bb-2db9-ecbf-9f0466af6157.png)

```Select a destination type```欄に、```Firehose```を選択します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/3bd23239-4014-3a77-421e-64b377a29829.png)

```Enabled ```にチェックを入れます。
```Name```に適宜に定義してください。
```Event Types```に、今回```Send```、```Reject```、```Delivery```、```Bounce```、```Complant```を選択しました。必要に応じて、適宜に追加してください。
```Stream```に上記作成した Kinesis Data Firehose を選択してください。
```IAM role```に、```Let SES make a new role```を選択の上、右側の欄に名前を定義してください。
上記内容を入力し終わったら、```Create Role```を押下します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/8da06c1c-fb15-7626-04b8-ae26610dd1d3.png)

```You new role may take a few seconds to propagate.```が表示されるので、しばらく10数秒ぐらいを待ってから、```Save```を押下します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/05dcf5b1-f28b-ef3d-7736-133976134de4.png)

このようになっていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/c7ccb8e5-8d6a-08a4-9935-b5feb78f8ba9.png)

# ４．テスト
SES左側のメニューバーで、```Domains```をクリックします。
ドメインを選択の上、```Send a Test Email```を押下します。
※既にドメインは設定済みです。（設定手順は割愛させていただきます。）
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/a87b0378-6b84-5d1e-ee64-539cb0707ea6.png)

ここは重要です！
```More options```を押下します。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/81226f48-7aca-6a3e-ccc4-13fd581a7a30.png)

```From* ```欄に、SESで発信するドメイン名を決めてください。
```To* ```欄に、送信先のメールアドレスを入れてください。
```Configuration Set```欄に、先ほど作成されたConfiguration名を入れてください。（★★★★★ここ超重要★★★★★）
```Subject* ```欄に、メールのタイトルを入れてください。
```Body```欄に、メール本文内容を入れてください。
上記入力し終わったら、```Send Test Email```を押下します。

![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/29c499a0-b42b-3834-6bac-c1c0b5ff1c13.png)


しばらくすると、SESからメールが届いたことを確認できました。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/39a881ec-28c4-1222-6db5-3aa85715f4c8.png)

合わせてS3にログが吐き出されたかどうかを確認します。
下記のように、ログはうまく出力されていることを確認しました。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/f3acad3d-44b5-4070-6780-70d9ba2d17b0.png)

当ログを S3 Select でクエリをかけると、下記のようなログ内容が吐き出されます。

```json
{
  "eventType": "Send",
  "mail": {
    "timestamp": "2021-07-20T10:07:39.838Z",
    "source": "test@XXXXXXXXXXXXXXXXXXX",
    "sourceArn": "arn:aws:ses:ap-northeast-1:XXXXXXXXXXXX:identity/XXXXXXXXXXXX",
    "sendingAccountId": "XXXXXXXXXXXX",
    "messageId": "XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX",
    "destination": [
      "XXXXXX@XXXXXX"
    ],
    "headersTruncated": false,
    "headers": [
      {
        "name": "From",
        "value": "test@XXXXXXXXXXXXXXXXXXX"
      },
      {
        "name": "To",
        "value": "XXXXXX@XXXXXX"
      },
      {
        "name": "Subject",
        "value": "hello"
      },
      {
        "name": "MIME-Version",
        "value": "1.0"
      },
      {
        "name": "Content-Type",
        "value": "text/plain; charset=UTF-8"
      },
      {
        "name": "Content-Transfer-Encoding",
        "value": "base64"
      }
    ],
    "commonHeaders": {
      "from": [
        "test@XXXXXXXXXXXXXXXXXXX"
      ],
      "to": [
        "XXXXXX@XXXXXX"
      ],
      "messageId": "XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX",
      "subject": "hello"
    },
    "tags": {
      "ses:operation": [
        "SendEmail"
      ],
      "ses:configuration-set": [
        "ses-log-test"
      ],
      "ses:source-ip": [
        "XXX.XXX.XXX.XXX"
      ],
      "ses:from-domain": [
        "XXXXXXXXXXXXXXXXXX"
      ],
      "ses:caller-identity": [
        "XXXXXXXXXXXXXXXXXX"
      ]
    }
  },
  "send": {}
}
{
  "eventType": "Delivery",
  "mail": {
    "timestamp": "2021-07-20T10:07:39.838Z",
    "source": "test@XXXXXXXXXXXXXXXXXXX",
    "sourceArn": "arn:aws:ses:ap-northeast-1:XXXXXXXXXXXX:identity/XXXXXXXXXXXX",
    "sendingAccountId": "XXXXXXXXXXXX",
    "messageId": "XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX",
    "destination": [
      "XXXXXX@XXXXXX"
    ],
    "headersTruncated": false,
    "headers": [
      {
        "name": "From",
        "value": "test@XXXXXXXXXXXXXXXXXXX"
      },
      {
        "name": "To",
        "value": "XXXXXX@XXXXXX"
      },
      {
        "name": "Subject",
        "value": "hello"
      },
      {
        "name": "MIME-Version",
        "value": "1.0"
      },
      {
        "name": "Content-Type",
        "value": "text/plain; charset=UTF-8"
      },
      {
        "name": "Content-Transfer-Encoding",
        "value": "base64"
      }
    ],
    "commonHeaders": {
      "from": [
        "test@XXXXXXXXXXXXXXXXXXX"
      ],
      "to": [
        "XXXXXX@XXXXXX"
      ],
      "messageId": "XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX",
      "subject": "hello"
    },
    "tags": {
      "ses:operation": [
        "SendEmail"
      ],
      "ses:configuration-set": [
        "ses-log-test"
      ],
      "ses:source-ip": [
        "XXX.XXX.XXX.XXX"
      ],
      "ses:from-domain": [
        "XXXXXXXXXXXXXXXXXX"
      ],
      "ses:caller-identity": [
        "XXXXXXXXXXXXXXXXXX"
      ],
      "ses:outgoing-ip": [
        "XXX.XXX.XXX.XXX"
      ]
    }
  },
  "delivery": {
    "timestamp": "2021-07-20T10:07:45.460Z",
    "processingTimeMillis": XXXX,
    "recipients": [
      "XXXXXX@XXXXXX"
    ],
    "smtpResponse": "XXXXXXXXXXXX,
    "reportingMTA": "XXXXXXXXXXXX.XXXXXXXXXXXX.ap-northeast-1.amazonses.com"
  }
}
```

上記のログを見ると、SESのメール内容、つまり```body```部分がございません。
そもそも```Configuration set```場所で、```body```の選択肢がございませんからです。
いつか選択できたらいいですね。

# ５．参考資料
公式サイト上の参考資料は下記となります。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ses-email-sending-history/?nc1=h_ls

ちなみに、YouTube上にも動画が配信されていますので、動画を見ながら理解しやすいですね。

https://www.youtube.com/watch?v=c4hROwXVYwo