Amazon SESでの運用と注意点

エンジニアのAです。今回はAmazon SESについてご紹介します。

AmazonSESとは

Amazon SESはAmazon Simple Email Serviceの略で、SES経由で自身のメールアドレスとドメインを使用してメールを送受信するためのコスト効率の高いメール配信サービスです。

AWS SESは送受信されるメールの量に基づいて料金が発生します。無料枠に関しては、以前は月に62,000通まで無料で送信できていましたが、2023年8月の改訂により

  • 送信 E メール

  • 受信 E メール

  • Virtual Deliverability Manager の送信 E メール処理

の3つのメッセージ料金が毎月最大 3,000 件分無料になります。 (SESの使用開始後の最初の12 か月間)

2024年現在の料金は

  • メール送信 1000件ごとに0.10USD、1GB ごとに0.12 USDの追加料金

  • メール受信 1000件ごとに0.10USD、受信メールチャンク1000 件につき0.09 USDの追加料金

となっています。

最新の料金は下記をご参照ください。 aws.amazon.com

無料枠が減ったとはいえ、月に32KBのメールを200万件送信しても

  • (2,000,000 (メールの件数) - 3,000 (無料枠のメッセージ)) × 0.0001 USD (1 件あたりの料金) = 199.70 USD

  • (0.000032 GB × 2,000,000 - 3,000(無料枠のメッセージ)) × 0.12 USD (データ 1 GB あたりの料金) = 7.67 USD

上記を合わせて207.37USD、日本円換算(145円/ドル)で約3万円に収まります。

これだけ大量のメールを送信してもこの値段で収まり、送信が数万程度ならば数百円程度で済むため、コストパフォーマンスは非常に良いと言えるでしょう。

運用上の注意点

AWS SESにはメールを送れる制限が秒間(最大送信レート)と日間(送信クォータ)が存在しています。

  • 送信クォータ 過去 24 時間に送信したメール数

  • 最大送信レート Amazon SES がアカウントから 1 秒あたりに受け入れることができるメールの最大数

メッセージの送信がアカウントの 1 日の最大数を超える場合、Amazon SES への呼び出しは拒否されます。その為、短期間にメールを大量に送信しようとするとこの送信レートに引っかかる可能性がある為、状況に応じて送信クォータの引き上げをリクエストする必要があります。

引き上げの手順としては、

  1. AWSマネジメントコンソールにサインインし、Amazon SESコンソールを開く

  2. [アカウントダッシュボード]を選択し、送信制限欄にある[制限の引き上げのリクエスト]を押す

  1. サービスクォータの中から、引き上げたいクォータかレートを選択し、[アカウントレベルでの引き上げをリクエスト]を押して、希望する一日あたりの送信クォータか、最大送信レートを入力してリクエス

となっています。

必ずしも承認されるわけではないようなので、クォータ増加リクエストが拒否された場合は、AWS サポートに問い合わせると良いようです。

送信の引き上げを行う際は、[アカウントダッシュボード]の[1 日のE メール使用量]欄を見つつ、送信制限に近づかないように適切に設定しましょう。

また、メールの各種イベントの統計ではなくログを取るには設定が必要です。

参考

repost.aws

Gmailのスパム対策に抵触しないためにもCloudWatchでBounce rate(返送率)やComplaint Rate(苦情率)の閾値設定や監視設定を行った方が良いです。

参考

repost.aws

さらに返送が連続した場合や苦情が発生した場合の処理や通知の設定もしておくと良いでしょう。

PHPでの実装の注意点

実際にSESへのリクエストをPHPのバッチなどで運用している場合、そのまま送信リクエストを送り続けてしまうと最大送信レートを超えてしまうため、usleepなどで秒間のリクエスト間隔を調整する必要があります。

最大送信レートはある程度ならばバーストしても耐えることはできるようですが、長くは続かないようです。

また、他のバッチなどでもリクエストをしていた場合、気付かぬうちに送信レートがバーストしてメールの送信ができないといったことも起こりうるため、SESへの自動送信機能を新たに設定する際は必ず[アカウントダッシュボード]で現在の状態を確認するようにしましょう。