search
LoginSignup
7
Help us understand the problem. What are the problem?

posted at

updated at

【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

1.S3バケットの作成

S3で新規バケットを作成します。
バケット名は適宜に決めてください。
111.png

下記のように、パブリックアクセスをすべてブロックにチェックを入れます。
image.png

バケットのバージョニングを有効化します。
111.png

暗号化も有効化し、バケットを作成を押下します。
111.png

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

2.Kinesis Data Firehose の作成

Kinesis Data Firehose の画面で、Create delivery streamを押下します。
111.png

Delivery stream name欄に適宜に名付けしてください。
111.png

Choose a sourceはデフォルのままで大丈夫です。
image.png

Process recordsはデフォルのままで大丈夫です。
image.png

Choose a destinationAmazon S3を選択します。
111.png

S3 destinationに、上記手順1で作成したS3バケットを選択します。
111.png

S3 prefixS3 error prefixに、適宜にご希望のプレフィックスを入力します。
111.png

今回テストで早くログを見たいため、Buffer interval60秒に設定しました。
111.png

S3 compression and encryptionError loggingはデフォルのままで大丈夫です。
image.png

Tagsはそのままで大丈夫です。(必要に応じて適宜に入れてください)
なお、Permissonsは自動でIAMロールを作成するように選択してください。
111.png

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

3.SESで設定

SES左側のメニュー一覧にConfiguration Setsを押下します。
Configuration Set Nameに適宜の名前を入れてください。
入力し終わったら、Create Configuration Setを押下します。
111.png

Select a destination type欄に、Firehoseを選択します。
111.png

Enabled にチェックを入れます。
Nameに適宜に定義してください。
Event Typesに、今回SendRejectDeliveryBounceComplantを選択しました。必要に応じて、適宜に追加してください。
Streamに上記作成した Kinesis Data Firehose を選択してください。
IAM roleに、Let SES make a new roleを選択の上、右側の欄に名前を定義してください。
上記内容を入力し終わったら、Create Roleを押下します。
111.png

You new role may take a few seconds to propagate.が表示されるので、しばらく10数秒ぐらいを待ってから、Saveを押下します。
111.png

このようになっていればOKです。
image.png

4.テスト

SES左側のメニューバーで、Domainsをクリックします。
ドメインを選択の上、Send a Test Emailを押下します。
※既にドメインは設定済みです。(設定手順は割愛させていただきます。)
111.png

ここは重要です!
More optionsを押下します。
111.png

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

111.png

しばらくすると、SESからメールが届いたことを確認できました。
111.png

合わせてS3にログが吐き出されたかどうかを確認します。
下記のように、ログはうまく出力されていることを確認しました。
111.png

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

{
  "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の選択肢がございませんからです。
いつか選択できたらいいですね。

5.参考資料

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7
Help us understand the problem. What are the problem?