Amazon SESのバウンスレートの監視をCloudFormationで構築する

Amazon SESのバウンスレートの監視をCloudFormationで構築してみました。

といっても、CloudWatch Alarmの作成だけです。小ネタ程度の記事です。


目的

メールサービスであるAmazon SESですが、バウンスや苦情といったメールドメインの信頼性を損ない、下手したらSESによるメール機能が停止されるような基準があります。


SESでは今ではサプレッションリストという、メールが到達しなかったりしたメールアドレスをリストにしておいて、SESでのメール送信時に宛先がリストに入っている場合は送信されないというような便利な機能があります。


そのためある程度安全ではありますが、やっぱりそれらのレートは監視して、危なくなったら通知して対処したいですよね。そんなときのためにサクッと作成できるようにしました。


前提

Amazon SESの構築自体の手順と、通知先のSNSトピックの作成の手順は省略します。

適宜SNSとメールアドレスや、slackなどに通知する場合はChatbotであったりLambdaであったりの作成をお願いします。


登場サービス

  • CloudWatch Alarm
  • 以下構築されている前提


通知の閾値

バウンスレート、苦情レートはそれぞれAWSのドキュメントにて、このような記載がされています。

Q4. アカウントのレビューや、送信の一時停止の原因になりえるバウンス率は公開されていますか?

最良の結果を得るには、バウンス率を 2% 未満に維持する必要があります。これより高いバウンス率は、E メールの配信に影響する可能性があります。
バウンス率が 5% 以上になると、アカウントはレビュー対象になります。バウンス率が 10% 以上の場合は、高いバウンス率の原因となった問題が解決するまで、以後の E メール送信を一時停止することがあります。


Q5. アカウントがレビュー対象になったり、アカウントの E メール送信機能が一時停止されたりする原因となり得る Amazon SES 苦情率は公開されていますか?

最良の結果を得るには、苦情率を 0.1% 未満に維持する必要があります。これより高い苦情率は、E メールの配信に影響する可能性があります。
苦情率が 0.1% 以上になると、アカウントはレビュー対象になります。苦情率が 0.5% 以上の場合は、高い苦情率の原因となった問題が解決するまで、以後の E メール送信を一時停止することがあります。

docs.aws.amazon.com


そのため、各レートの通知閾値は以下のようにしました。

レート種類 通知閾値
バウンス 2%
苦情 0.1%


方法

コード

CloudFormationのテンプレートyamlを記載します。

SnsTopicArnはパラメータとして渡す必要があります。


GitHubにもあります。

github.com


AWSTemplateFormatVersion: '2010-09-09'

Description: 
  Cloudwatch Alarm For SES Bounce and Complaint

Metadata: 
  "AWS::CloudFormation::Interface": 
    ParameterGroups: 
      - Label: 
          default: "SNS Topic ARN"
        Parameters: 
          - SnsTopicArn

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------# 
Parameters:
  SnsTopicArn:
    Type: String

# ------------------------------------------------------------#
#  Resources
# ------------------------------------------------------------#
Resources:
    CloudWatchAlarmForSesBounceNotice:
        Type: "AWS::CloudWatch::Alarm"
        Properties:
            AlarmName: "SesBounceNotice"
            ActionsEnabled: true
            AlarmActions: 
              - !Ref SnsTopicArn
            MetricName: "Reputation.BounceRate"
            Namespace: "AWS/SES"
            Statistic: "Maximum"
            Period: 300
            EvaluationPeriods: 1
            DatapointsToAlarm: 1
            Threshold: 0.02
            ComparisonOperator: "GreaterThanOrEqualToThreshold"
            TreatMissingData: "notBreaching"

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


最後に

アラームの作成だけでしたが、サクッと作れるので書いてみました。