Step Functionsのサービス統合を利用してAmazon SESをゆっくり暖気してみた

Gmailのガイドラインに沿った Amazon SESの暖気ためのテストメール送信を、Step Functionsと EventBridgeを利用してサーバレスに実施してみました。
2024.02.14

今回、Amazon SESの利用実績が少ない環境で、 AWS Step Functions の AWS SDK サービス統合と EventBridgeを利用した 暖気を試みる機会がありましたので、 紹介させていただきます。

StepFunctions

Amazon SESを設定済みのリージョンに、「Express」タイプのステートマシンを作成しました

デザイン

SFデザイン

Map

送信先メールアドレスを1件ずつ、2秒の待機時間を待って処理する定義を行いました。

SF-マップ設定

SendEmail

AWS SDK サービス統合を利用し、sesv2 の sendEmailを実行しました。

SF-SendEmail設定

送信元メールアドレス(FROM)と、表題(Subject)には、ステートマシン実行時の引数を利用する設定にしました。

Contextオブジェクトより実行時間と実行環境のARN(Id)を取得して、メール本文に反映する指定としました。

Code定義

{
  "Comment": "Amazon SES warmup",
  "StartAt": "Map",
  "States": {
    "Map": {
      "Type": "Map",
      "ItemProcessor": {
        "ProcessorConfig": {
          "Mode": "INLINE"
        },
        "StartAt": "SendEmail",
        "States": {
          "SendEmail": {
            "Type": "Task",
            "Next": "Wait",
            "Parameters": {
              "FromEmailAddress.$": "$$.Execution.Input.FromAddress",
              "Destination": {
                "ToAddresses.$": "States.Array($)"
              },
              "Content": {
                "Simple": {
                  "Subject": {
                    "Data.$": "$$.Execution.Input.Subject"
                  },
                  "Body": {
                    "Text": {
                      "Data.$": "States.Format('StartTime: {}, \n Id: {}', $$.Execution.StartTime, $$.Execution.Id)"
                    }
                  }
                }
              }
            },
            "Resource": "arn:aws:states:::aws-sdk:sesv2:sendEmail"
          },
          "Wait": {
            "Type": "Wait",
            "Seconds": 3,
            "End": true
          }
        }
      },
      "End": true,
      "ItemsPath": "$.Addresses",
      "MaxConcurrency": 1
    }
  }
}

実行ロール

ステートマシンにSESのSendmail操作を許可するため、 作成時に自動作成されたロールに対しインラインポリシーを追加しました。

SF-IAMロール設定

  • インラインポリシー (ses:SendEmail)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ses:SendEmail",
            "Resource": "arn:aws:ses:<リージョン>:<アカウントID>:*"
        }
    ]
}

テスト実行

3通のテストメールの送信を試みました。

テスト実行

  • 入力(JSON)
{
  "FromAddress": "warmup@example.jp",
  "Subject": "warmup mail",
  "Addresses": [
    "id1@example.com",
    "id2@example.com",
    "id3@example.com"
  ]
}

テスト実行結果

実行結果

テーブルビューに切り替え、約3秒毎にメール送信された事が確認できました。

SFテーブルビュー

SESで送信したメール、Gmailで確認できました。

テストメールサンプル

EventBridge

Amazon EventBridgeのスケジュールを追加しました。

Cron式を利用した定期実行設定を行いました。

EventBridgeスケジュール

ターゲットは作成したStep Functionsのステートマシンを指定しました。

EventBridgeターゲット

まとめ

Step Functions と、EventBridgeのスケジュールを利用した、SES ウォーミングアップについて紹介させて頂きました。

Amazon SESの送信クォータ、1日に送信可能なメール数は 過去のメール送信実績を元に自動拡張されます。

SESアカウントダッシュボード

サービスクォーターやサポートケースを起票する事で、SESの送信クォーターは引き上げ可能ですが、 過去のメール実績が乏しいドメインでは、メール着信側で受け取り拒否される場合もあります。

新規ドメインでAmazon SESを利用する場合、初期段階の1日あたりのメール送信数は100通程度に留め、 SESダッシュボードのバウンス情報や、Gmailのポストマスターツールを利用して 配信エラー、レピュテーションの低下が生じていないことを確認しつつ、1日あたりの送信数を 150、250、400程度にとどまるように、 送付先アドレスと実行間隔を調整。

最終的に必要となる送信数に達するまで、十分余裕の持ったスケジュールを確保して準備されることをおすすめします。

大量のメールを送信する場合は、次のことをおすすめします。

一定のレートでメールを送信します。一度に大量のメールを送信することは避けてください。

承諾しているユーザーへのメールは少ない送信量から始めて、時間をかけて量を増やしていきます。 送信量の増加にあわせて、サーバーのレスポンス、迷惑メール率、送信元ドメインの評価を定期的に監視します。 定期的に監視を行うと、送信レートが制限された場合、迷惑メール率が上昇した場合、送信元ドメインの評価が低下した場合に迅速に対応できます。

過去に大量に送信したことがない場合は、送信量を急に増やすことは避けてください。たとえば、以前の送信量から急に 2 倍に増えると、レート制限や評価の低下につながる可能性があります。

Google Workspaceヘルプ メール送信者のガイドライン