SESのメール送信履歴をOpenSearch Serviceで表示してみた

SESのメール送信履歴をKinesis Data FirehoseからOpenSearch Serviceに転送し、OpenSearch Serivceのダッシュボードからテストメールを確認するところまでやってみました。
2022.04.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん、こんにちは。

AWS事業本部コンサルティング部の芦沢(@ashi_ssan)です。

最近、SESでは送信履歴を確認する方法がSESのサービスとしては実装されていない、ということを知りました。

送信履歴を保存し、表示させるためには以下の対応が別途必要になるそうです。

  • SESの送信履歴を保存するためには、Kinesis Data Firehoseでメールの送信ログを任意の場所に保存する必要がある
  • 保存した送信履歴をWebコンソール上に表示するためには、OpenSearch Serviceを利用する必要がある

この手順をわかりやすくまとめた資料がAWSのナレッジセンターにありましたので、実際に試してみます。

以下のような注記があるように、ナレッジセンターの手順はSESの旧コンソールに則った手順です。
> 注意: この記事のガイダンスでは、Amazon SES クラシックコンソールを使用しています。
2022年4月現在、SESコンソールはアップデートされており、そのまま実施するとうまくいかない箇所があったため、一部変更して作業を行いました。

AWS構成図

今回作成するAWS環境の構成図はこちらです。

事前準備

事前にメールを送信できるSESの環境を準備してください。

手元に検証できる環境がない場合は、以下のエントリを参考に検証環境を構築してみてください。

やってみた(環境構築編)

環境構築編では、以下の手順を進めていきます。

  • OpenSearch Serviceドメインの作成
  • S3バケットの作成
  • Kinesis Data Firehose(Delivery Stream)の作成
  • IAMロールの作成
  • SES設定セットの作成

以降AWSリソースを構築するためのパラメータを入力する箇所がありますが、本記事では検証用の環境を構築する際のパラメータを指定しています。 本番ワークロードでの構築の場合は、別途本番用のパラメータを指定するようにしてください。

OpenSearch Serviceドメインの作成

まずはOpenSearch Serviceのドメインを作成します。

OpenSearch Serviceコンソールのダッシュボード画面でCreate domainをクリックします。


以下パラメータを入力し、作成をクリックします。

アクセスポリシーはこちらを参考にしてください。

設定するポリシーの概要は以下です。

  • ここで設定するポリシーは、OpenSearch Serviceの管理コンソールにアクセスするために必要なものです。
  • パブリックアクセスが可能なOpenSearch Serviceドメインを作成するので、特定のIPアドレスからのHTTPアクセスのみを許可するように設定しています。
## < >で括っているところは、作業環境の設定値に合わせて修正してください。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:ESHttp*",
      "Resource": "arn:aws:es:ap-northeast-1:<AWSアカウント>:domain/<OpenSearch Serviceのドメイン名>/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "<アクセス元のIPv4アドレスのCIDR>"
        }
      }
    }
  ]
}


20分ほどでOpenSearch Serviceのドメインの作成が完了します。

作成完了後、OpenSearch Dashboards の URLをクリックすると、ダッシュボードが開きます。

※ここでアクセスが拒否された場合は、アクセスポリシーの内容に間違いがあると思われますので、再度確認しましょう。

S3バケットの作成

SESの送信履歴をKinesis Data Firehose経由で保存するS3バケットを作成します。

S3コンソールのバケットからバケットを作成をクリックします。


以下のようにパラメータを入力し、画面下のバケットを作成をクリックします。


S3バケットが作成できました。

Kinesis Data Firehose(Delivery Stream)の作成

KinesisコンソールのDelivery streamsからCreate delivery streamをクリックします。

以下のようにパラメータを指定し、Create delivery streamをクリックします。

Delivery Streamが作成できました。

IAMロールの作成

次の手順で作成するSES設定セットに付与するIAMロールをここで作成します。

SESの旧コンソールだと自動作成できたようですが、新コンソールでは自動作成できないようになっていました。 コンソールのアップデートがあるまでは頑張って手動で作成しましょう。

まずはロールにアタッチするIAMポリシーを作成します。

IAMポリシー作成

IAMコンソールのポリシーから、ポリシーの作成をクリックします。

以下のように各項目を入力し、ポリシーを作成します。

ポリシードキュメントの内容はこちらを参考にしてください。

## < >で括っているところは、作業環境の設定値に合わせて修正してください。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "0",
            "Effect": "Allow",
            "Action": "firehose:ListDeliveryStreams",
            "Resource": "*"
        },
        {
            "Sid": "1",
            "Effect": "Allow",
            "Action": "firehose:*",
            "Resource": "arn:aws:firehose:*:<AWSアカウントID>:deliverystream/*"
        }
    ]
}

IAMポリシーが作成できました。

IAMロール作成

続いてIAMロールを作成します。

IAMコンソールのロールから、ロールの作成をクリックします。

以下のように各項目を入力し、ロールを作成します。

信頼ポリシーのサンプルはこちらです。

2022/6/23追記 フィードバックをいただきハイライトの箇所の記述を修正しました。次の手順で作成するSES変更セットの作成が必要になるため、手順が前後しますが変更セットのリソース作成後に信頼ポリシーを記載ください。

## < >で括っているところは、作業環境の設定値に合わせて修正してください。
{
  "Version": "2012-10-17",
  "Statement": [
      {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "ses.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceAccount": "<AWSアカウントID>",
                    "AWS:SourceArn": "arn:aws:ses:ap-northeast-1:<AWSアカウントID>:configuration-set/<変更セット名>"
                }
             }
      }
    ]
}

ロールが作成できました。

SES設定セットの作成

SES設定セットのリソース作成

SESコンソールのConfiguration setsからCreate setをクリックします。

以下のように各項目を入力し、Create setをクリックします。

設定セットが作成できました。

イベント送信先設定

続いて、SESのイベント送信先の設定を行います。

SESコンソールのConfiguration sets、Event destinationsタブのAdd destinationをクリックします。

以下のように各項目を入力し、設定します。

イベント送信先設定が完了しました。

長くなりましたが、以上で環境構築が完了しました。

やってみた(テスト編)

テスト編では、以下の手順を実施します。

  • テストメール送信
  • OpenSearchダッシュボードからの確認

テストメール送信

続いて、テストメールを送信してOpenSearchのWebコンソールから送信履歴が確認できるか試してみましょう。

テストメールの送信はSESのコンソールの画面右上、Send test emailから実行できます。

以下のように各項目を入力し、Send test emailをクリックでテストメールが送信できます。

今回はScenarioとして、Successfully Delivery、Bounce、Complaintそれぞれを指定した3通のテストメールを送信しました。

OpenSearchダッシュボードからの確認

それでは、配信したテストメールがOpenSearchダッシュボード(kibana)で表示できるか確認しましょう。

再度、OpenSearchダッシュボードを開きます。

インデックスパターンの作成

画面左のタブを開き、Discoverをクリックします。

Create index patternをクリックします。

以下のように既存のインデックス名が含まれるように指定し、Next stepをクリックします。

Time fieldを指定し、Create index patternをクリックします。

インデックスパターンの作成が完了しました。

送信履歴の確認

もう一度、画面左のタブからDiscoverをクリックします。

デフォルトの状態だと、このように見づらいため少しだけ整形します。

Available fieldを指定し、表示させる情報を絞り込みます。

このようにタイムスタンプからテストメールが3通表示できていることが確認できました。

最後に

今回は、SESのメール送信履歴をOpenSearch Serviceで表示してみました。

公式ナレッジセンターにある手順をなぞるようにう検証しましたが、実際に手を動かしてみると、思ったようにいかない部分が多く、勉強になりました。

またデータ分析の知見に乏しく、OpenSearch ServiceダッシュボードもといElasticsearchの操作については手探りでやった部分が大半なので、後半のOpenSearchダッシュボードの作業箇所はかなり怪しいところが多いかと思います。その点はご容赦ください。

以上、AWS事業本部コンサルティング部の芦沢(@ashi_ssan)でした。