【AWS】SESのログをS3に出力してみた

この記事は現役ウェブディベロッパーがわかりやすさにこだわって作成しました

【AWS】AWS SESのログをKinesis Data Firehose経由でS3へ転送してみました - Qiita
はじめにAWS SES のログを Kinesis Data Firehose 経由して、S3 へ転送する手順を公開します。公式サイトでは、SESのログを Kinesis Data Firehos…
SES のログを S3 に出力してバウンスメールを確認してみる - Qiita
Noteこの記事では紹介してませんが、アップデートで追加された Virtual Deliverability Manager もオススメです。…

はじめに

AWS マネージメントコンソールで Reputation metrics を開くことで、最近のバウンス率・苦情率を確認できます。Warning 以下に抑えるように運用をしていくのがベストプラクティスと書かれていますが、送信先などの詳細はここではわかりません。

そこでAWS SES のログを Kinesis Data Firehose 経由して、S3 へ転送することにしました。
公式サイトでは、SESのログを Kinesis Data Firehose 経由で、Elasticsearch へ送信し、ログを可視化する手順が公開されています。

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

Kinesis Firehose を作成する

詳細を確認するために、SES のアクセスログを Kinesis Firehose を経由して S3 に出力します。

S3パケットを用意します。

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

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

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


パブリックアクセスをすべてブロックにチェックを入れます。

2.Kinesis Data Firehose の作成

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

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

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

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

Choose a destinationAmazon S3を選択します。

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

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

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

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

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

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

3.SESで設定

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

出力するログのタイプを選択します。成功した場合もログに出力すると余計なコストがかかりますので除外します。

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

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

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

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

4.テスト

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

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

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

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

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

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

4.参考資料

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

PHP/Javascript/WORDPRESS案件全般承ります

この記事についてのご質問またはお困りのことがございましたら、お気軽にお問い合わせください。

タイトルとURLをコピーしました