SESのバウンス率・苦情率を監視するためのCloudWatch Alarmを作成してみた

SESの監視をしっかり行いましょう。
2023.08.18

SESのバウンス率・苦情率を監視したい

こんにちは!AWS事業本部のおつまみです。

SESをお使いのみなさん、バウンス率・苦情率を監視していますか?私はもちろんやっています。

SESでは評価ダッシュボードを開いて、バウンス率・苦情率を確認できます。

ただし、特定のしきい値に達した場合、ダッシュボードからは通知をおこなってくれません。

SES バウンス率・苦情率が高いまま、SESを使用し続けるとアカウントの E メール送信機能が一時停止されてしまいます。

Amazon SES 送信レビュープロセスに関するよくある質問 - Amazon Simple Email Service

そのため今回は公式ドキュメントから案内されているとおり、特定のしきい値に達した場合にメール通知する方法をご紹介します。

やってみた

構成図

今回の構成図です。

SESの評判メトリクスをCloudWatchで監視します。バウンス率・苦情率が特定のしきい値に達した場合、CloudWatch Alarmが通知されるよう設定します。
そしてCloudWatch Alarmに紐づく SNS トピックが、サブスクライブしたエンドポイント (E メールアドレスなど) に通知を送信します。

前提条件

今回はSESの設定は省略します。以下の設定がされている状態からの手順となります。

  • ドメインと検証用メールアドレスが設定されている。
  • 送信制限(サンドボックス)が解除されている。

手順

  1. Amazon SES コンソールを開きます。

  2. 左側のナビゲーションペインで、「標準メトリクス」をクリックし、「アカウントレベル」タブの「バウンス率」で「CloudWatch で表示する」を選択します。  

  3. CloudWatch コンソールが開きます。「アクション」列 のアラームベルアイコンをクリックします。

  4. 「メトリクスと条件の指定」のページが開きます。以下のパラメータを指定し、[次へ]をクリックします。

  • ・・よりも: 0.05
  • 欠落データの処理: 欠落データを無視として処理する (アラーム状態を維持する)

なおCloudWatch アラームのしきい値を設定するときは、以下の推奨事項があります。

Amazon SES では、バウンス率を 5% 未満に維持することをお勧めします。バウンス率が 10% を超えると、Amazon SES はアカウントの E メール送信機能を一時停止することがあります。しきい値は 0.05 (5%) に設定することをお勧めします。
Amazon SES では、苦情率を 0.1% 未満に維持することをお勧めします。苦情率が 0.5% を超えると、Amazon SES はアカウントの E メール送信機能を一時停止することがあります。しきい値は 0.001 (0.1%) に設定することをお勧めします。

5. 「アクションの設定」のページが開きます。以下のパラメータを指定し、[トピックの作成]をクリックします。

  • アラーム状態トリガー: アラーム状態
  • 次のSNSトピック通知に送信: 新しいトピックの作成
  • トピック名: CloudWatch_Alarm_Topic_for_SES(任意の名前)
  • 通知を受け取るEメールエンドポイント: 通知先のEメールアドレス

6. SNSトピックのEメールアドレスが表示されるので、「次へ」をクリックします。

7. 「名前と説明を追加」のページが開きます。以下のパラメータを指定し、[次へ]をクリックします。

  • アラーム名: CloudWatch_Alarm_SES_BounceRate(任意の名前)

8. 「プレビューと作成」のページが開きます。設定値を確認し、「アラームの作成」をクリックします。

9. 作成されたアラームが表示されます。

10. SNSトピック作成時に指定したメールアドレス宛にサブスクリプション通知のメールが件名「AWS Notification - Subscription Confirmation」で届いています。メール内の「Confirm subscription」を押下し、サブスクリプションを承認します。

11. 同様の手順で「苦情率」についても設定します。パラメータについては以下の通りです。

  • 「メトリクスと条件の指定」

    • ・・よりも: 0.001
    • 欠落データの処理: 欠落データを無視として処理する (アラーム状態を維持する)
  • 「アクションの設定」

    • アラーム状態トリガー: アラーム状態
    • 次のSNSトピック通知に送信: 既存トピックの指定
    • トピック名: CloudWatch_Alarm_Topic_for_SES
  • 「名前と説明を追加」

    • アラーム名: CloudWatch_Alarm_SES_ComplaintRate
  • 作成されたアラームが表示されます。

設定は以上です。

検証

アラームが問題なく設定されたことを確認するために対象のSESを使用し、あえて存在しないアドレス宛にメールを送信します。

メール送信はThunderbirdから行いました。
送信方法はこちらの公式ドキュメント「ソフトウェアパッケージを使用し、Amazon SES を介して E メールを送信します」をご確認ください。

メールを送信すると、しばらくすると通知先メールアドレスに件名「ALARM: "CloudWatch_Alarm_SES_BounceRate" in Asia Pacific (Tokyo)」が送信されることを確認できます。(※アラーム確認のために一時的にしきい値を下げています。)

問題なく設定できたようでよかったです!

CloudFormationでサクッと作ってみた

以下は、SNSトピックとCloudWatch Alarmを作成するCloudFormationテンプレートです。
手動で作成するのが面倒な方はこちらをご参考ください。

AWSTemplateFormatVersion: '2010-09-09'
Description: 
  Cloudwatch Alarm For SES Bounce and Complaint
# ------------------------------------------------------------#
#  Resources
# ------------------------------------------------------------#
Resources:

  SNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: CloudWatch_Alarm_Topic_for_SES
      Subscription:
        - Endpoint: xxxxxxxx@test.jp
          Protocol: email

  CloudWatchAlarmForSesBounceNotice:
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "CloudWatch_Alarm_SES_BounceRate"
      ActionsEnabled: true
      AlarmActions: 
        - !Ref SNSTopic   
      MetricName: "Reputation.BounceRate"
      Namespace: "AWS/SES"
      Statistic: "Maximum"
      Period: 300
      EvaluationPeriods: 1
      DatapointsToAlarm: 1
      Threshold: 0.05
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "ignore"

  CloudWatchAlarmForSesComplaintNotice:
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "CloudWatch_Alarm_SES_ComplaintRate"
      ActionsEnabled: true
      AlarmActions: 
        - !Ref SNSTopic   
      MetricName: "Reputation.ComplaintRate"
      Namespace: "AWS/SES"
      Statistic: "Maximum"
      Period: 300
      EvaluationPeriods: 1
      DatapointsToAlarm: 1
      Threshold: 0.001
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      TreatMissingData: "ignore"

おまけ:送信ログも保存しよう

Amazon SESでは自動でメールの送信ログ取得を行ってくれません。
そのため、ログの保存が必要な場合は別途追加で実装する必要があります。

ログはバウンス率・苦情率が上がってきた場合やトラブルシューティングに役立つため、可能であれば取得することをおすすめします!

実装方法は下記ブログをご参考ください。

最後に

今回はSESのバウンス率・苦情率を監視するためのCloudWatchAlarmを作成する方法をご紹介しました。

監視することでSESをいつまでも安全にお使いいただければと思います!

最後までお読みいただきありがとうございました!
どなたかのお役に立てれば幸いです。

以上、おつまみ(@AWS11077)でした!

参考

CloudWatch を使用して評価モニタリングアラームを作成する - Amazon Simple Email Service

Amazon SES で返送率または苦情率のしきい値に関する通知を設定する | AWS re:Post

SESでバウンスメールを確認する方法をいくつか試してみた

Amazon SES でメール送信するときのベストプラクティスまとめ(2020年10月) | DevelopersIO