AWS SESのバウンス、苦情報告の内容をSlackに通知する

A

はじめに

AWSのアラームやHealthイベントを、メールではなくSlackに通知して運用するケースは多いと思います。

SESのバウンスや苦情報告も、同じようにフィードバック通知先を Amazon Q Developer in chat applications(旧Chatbot)に紐づくSNSトピックとすればSlackに通知できそうです。
しかし、SESのバウンスや苦情報告は、JSON形式のRawデータですので、それがそのままSlackに表示されると、見にくいです。

ここでは、SESのバウンスや苦情報告を見やすい形でSlackに通知する設定方法をまとめます。
この方法は、クラスソッドさんの以下の記事のとおりです。
(いつもありがとうございます。)

(参考)
AWS SESのバウンスを見やすい形でSlackに通知してみる – Developers.IO
https://dev.classmethod.jp/articles/aws-ses-bounce-notification-to-slack/

↑の記事ではCloudFormationを使用していますが、これを、AWSマネジメントコンソールで設定することで、理解を深めます。
また、僕が気になったポイントを補足します。

前提

以下を前提とします。

  • Amazon Q Developer in chat applicationsでSlackへの連携は設定済み。
  • SESでIDを検証済み。

これらの設定方法や、Amazon Q Developer in chat applicationsとSNSトピックの紐づけ設定方法については、ここでは記載しません。

しくみ

処理の流れは、以下のとおりです。

 SES(イベント発火)
  ↓
 EventBridge(イベント処理)
  ↓
 SNS Topic
  ↓
 Amazon Q Developer in chat applications
  ↓
 Slack

SESのバウンス、苦情報告イベントをEventBridgeでフックして、通知内容を整形してからSNSに通知し、Amazon Q Developer in chat applicationsで紐づけられたSlackチャンネルに通知します。

設定作業としては以下がポイントとなります。

  • SESの「設定セット」で、バウンス、苦情報告イベントの発火を設定。
  • EventBridgeで、バウンス、苦情報告イベントをフックし、通知内容を整形してSNSトピックに通知。

SES 設定セットの設定

SESの「設定セット」を作成し、バウンス、苦情報告イベントの発火と送信先を設定します。

SES設定セットの作成

SES設定設定を作成します。

設定セットが作成されたら、「イベント送信先」を追加します。

イベントタイプとして、「ハードバウンス(Hard bounces)」と「苦情数(Complaints)」を指定します。

送信先タイプは「Amazon EventBridge」を指定します。
送信先の「名前」って何だろう?と思いましたが、この名前はSESでの管理用のラベルです。
EventBridgeなど、他の処理で参照することはありませんので、適当な名前をつけます。

検証済みIDでデフォルト設定セットの作成

検証済みIDで、「デフォルト設定セット」として、先ほど作成した設定セットを指定します。

この設定により、APIを使用したメール送信処理で、

  "ConfigurationSetName": "<設定セット名>"

の設定が不要となります。

メール送信用IAMポリシーに追加

メール送信処理を実行するEC2, ECS等のリソースのIAMロールに紐づくIAMポリシーで、メール送信のリソースを限定している場合は、Resource に設定セット(のARN)を追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": [
                "arn:aws:ses:ap-northeast-1:<AWSアカウントID>:identity/<検証済みIDドメイン名>",
                "arn:aws:ses:ap-northeast-1:<AWSアカウントID>:configuration-set/<設定セット名>"

        }
    ]
}

検証済みIDで「デフォルト設定セット」を設定した場合、この設定セットへの権限設定がないと、メール送信時に権限不足で送信エラーとなります。

※”Resource”:”*” として、使用リソースを限定していない場合は、この設定は不要です。

EventBridgeでルールを作成

EventBridgeルールを作成して通知内容を整形し、通知先SNSトピックを指定します。
バウンス通知と苦情通知のイベントパターンのルールを別々に作成します。

※ここでは、ビジュアルルールビルダーは使用せずに作成します。

バウンス通知用ルールの作成

イベントソースは「イベントソース: AWS イベントまたは EventBridge パートナーイベント」を指定します。

イベントパターンは、パターンフォームを使用して、

  • イベントソース: AWSのサービス
  • AWS のサービス: Simple Email Service (SES)
  • イベントタイプ: Email Bounced

を選択すると、イベントパターンが自動生成されます。

ターゲット(通知先)は、Amazon Q Developer in chat applications のSlackチャンネル設定と紐づけたSNSトピックを指定します。

そして、ターゲット設定エリアの「追加設定」を展開して、
「ターゲット入力を設定」で「入力トランスフォーマー」を指定します。

「入力トランスフォーマーを設定」ボタンが表示されるのでクリックすると、入力トランスフォーマーの設定ウインドウが表示されるので、ここで「入力パス」と「テンプレート」を設定します。

入力パスで、Slackに通知したい項目を設定します。
SESのイベント通知でどのような項目が取得できるかは、以下のAWSデベロッパーガイドが参考になるでしょう。

・Amazon SES の Amazon SNS 通知コンテンツ
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/notification-contents.html

・Amazon SES の Amazon SNS 通知の例
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/notification-examples.html

上記をもとに、JSON構造で、
キーは、のちにテンプレートに挿入するためのてきとうなパラメータ名を、
値は、SESのバウンスイベント通知から取得したい値のフィールド名を、
ペアで指定します。

{
  "bounceType": "$.detail.bounce.bounceType",
  "bounceSubType": "$.detail.bounce.bounceSubType",
  "errorCode": "$.detail.bounce.bouncedRecipients[0].status",
  "errorMessage": "$.detail.bounce.bouncedRecipients[0].diagnosticCode",
  "from": "$.detail.mail.source",
  "to": "$.detail.bounce.bouncedRecipients[0].emailAddress",
  "messageId": "$.detail.mail.messageId",
  "timestamp": "$.detail.bounce.timestamp",
  "subject": "$.detail.mail.commonHeaders.subject"
}

続いてテンプレートを入力します。
ここでは、Slackに通知するフォーマットを指定します。

Amazon Q Developer in chat applications への通知内容のカスタマイズについては、以下のAWS Administrator Guideが参考になります。

・Custom notifications using Amazon Q Developer in chat applications
https://docs.aws.amazon.com/ja_jp/chatbot/latest/adminguide/custom-notifs.html#sample-custom-notifs

カスタマイズする際は、
source を custom
とすることと、
MarkDown形式とするなら、
content.textType を client-markdown
とするのがポイントです。

title で、Slack投稿時のタイトルを指定します。

<bounceType> のように、先ほど「入力パス」で指定したパラメータを <パラメータ名> で指定することで、メッセージに通知内容の値が埋め込まれます。
\n はSlackで表示する際の改行コード、* はMarkDown形式の箇条書きです。

{
  "version": "1.0",
  "source": "custom",
  "content": {
    "textType": "client-markdown",
    "title":"SES Bounce detected",
    "description":"*Bounce Information:*\nBounceType: <bounceType>\nBounceSubType: <bounceSubType>\nErrorCode: <errorCode>\nErrorMessage: <errorMessage>\n\n*MailInformation:*\nFrom: <from>\nTo: <to>\nSubject: <subject>\nMessageID: <messageId>\nTimestamp: <timestamp>"
  }
}

苦情通知用ルールの作成

イベントソースは「イベントソース: AWS イベントまたは EventBridge パートナーイベント」を指定します。

イベントパターンは、パターンフォームを使用して、

  • イベントソース: AWSのサービス
  • AWS のサービス: Simple Email Service (SES)
  • イベントタイプ: Email Complaint Received

を選択すると、イベントパターンが自動生成されます。

ターゲット(通知先)は、Amazon Q Developer in chat applications のSlackチャンネル設定と紐づけたSNSトピックを指定します。

ターゲット設定エリアの「追加設定」を展開して、
「ターゲット入力を設定」で「入力トランスフォーマー」を指定します。

「入力トランスフォーマーを設定」ボタンが表示されるのでクリックすると、入力トランスフォーマーの設定ウインドウが表示されるので、ここで「入力パス」と「テンプレート」を設定します。

入力パスで、Slackに通知したい項目を設定します。
バウンスイベントと同様に、SESのイベント通知でどのような項目が取得できるかは、以下のAWSデベロッパーガイドが参考になるでしょう。

・Amazon SES の Amazon SNS 通知コンテンツ
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/notification-contents.html

・Amazon SES の Amazon SNS 通知の例
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/notification-examples.html

上記をもとに、JSON構造で、
キーは、のちにテンプレートに挿入するためのてきとうなパラメータ名を、
値は、SESの苦情イベント通知から取得したい値のフィールド名を、
ペアで指定します。

{
  "notificationType": "$.detail.notificationType",
  "complaintFeedbackType": "$.detail.complaint.complaintFeedbackType",
  "from": "$.detail.mail.source",
  "to": "$.detail.complaint.complainedRecipients[0].emailAddress",
  "messageId": "$.detail.mail.messageId",
  "timestamp": "$.detail.complaint.timestamp",
  "subject": "$.detail.mail.commonHeaders.subject"
}

続いてテンプレートを入力します。
ここでは、バウンス通知と同様に、Slackに通知するフォーマットを指定します。

{
  "version": "1.0",
  "source": "custom",
  "content": {
    "textType": "client-markdown",
    "title":"SES Complaint detected",
    "description":"*Complaint Information:*\nNotificationType: <notificationType>\nComplaintFeedbackType: <complaintFeedbackType>\n\n*MailInformation:*\nFrom: <from>\nTo: <to>\nSubject: <subject>\nMessageID: <messageId>\nTime: <timestamp>"
  }
}

以上で、バウンス、苦情報告の内容をSlackに通知する設定は完了となります。

バウンス、苦情通知の動作確認

アプリケーションでSES APIを使用してメール送信する前に、AWSマネジメントコンソールで簡易的なメール送信テストを行って確認するとよいでしょう。

バウンス通知のテスト

SESの検証済みIDを選択して、「テストEメールの送信」ボタンをクリックします。

メッセージの詳細では、てきとうなFromアドレス、件名、本文を入力します。
デフォルト設定セットを設定していない場合は、設定セットも指定します。
シナリオで「バウンス」を指定するのがポイントです。

テストEメールを送信して、Slackのチャンネルに通知されることと、通知内容が入力トランスフォーマー設定で指定した通りとなっていることを確認します。

Slackに通知されない場合は、Amazon Q Developer in chat applications のSlackチャネルの設定で、CloudWatch Logs にエラーログを記録する設定にしておくと、調査しやすいでしょう。

Slack通知のフォーマットが気に入らない場合は、EventBridgeのルールを変更します。

苦情通知のテスト

同様に、「テストEメールの送信」で、シナリオを「苦情」と指定して送信します。

Slackに通知されることを確認します。

おわりに

Amazon SESのバウンスや苦情報告を、見やすい形でSlackに通知する、AWSマネジメントコンソールでの設定方法をまとめました。

SESのフィードバック通知先をSNSトピックに設定し、メッセージの整形処理とSlack通知処理を行うLambda関数のトリガーとして紐づければ、同じようなことができるようです。
ですが、コードを書かずに、EventBridgeの入力トランスフォーマーの設定で実現できるのはとても便利でよいですね。

SESのバウンス率や苦情率が増えると、AWSからの警告や利用停止もあり得ますので、これらの通知はしっかり把握して、バウンス率と苦情率は、CloudWatchアラームやCloudWatchダッシュボードで監視しましょう。

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