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ダッシュボードで監視しましょう。















