コラム
中日本CC第二事業部ITソリューション2Gの平田です。
今回は、大量のメール配信をAWSサーバレスで実現する際に直面した問題や課題に対して、どのように解決していったかの事例をご紹介します。
とあるお客様の案件で「1時間以内に35万通のメルマガ配信をしたい」という要件がありました。一般的には、メールを配信する際はMTAサーバを用意することになります。
しかし、AWSのEC2(仮想サーバ)上でMTA運用する際の問題点がいくつかあります。
<EC2上でMTA運用する際の問題点>
・構築・運用・障害対策やスケールの調整などは自身で行わなければならない→構築・運用コストが高い
・Email送信のための制限解除やDNS逆引きなどフォームによる申請が必要→事前作業の手間
また、決まった周期や時刻での配信ではなく不定期での配信となる場合、EC2を常時起動して待機しなければならなくなるためコスト最適化が難しくなります。大量のメール配信を実現するためにサーバスペックも自然と上げることになるため、ランニングコストが高くなることは想像できます。
AWSでは、SES(Simple Email Service)というEメールを送受信できるマネージドサービスがあります。
メリットとしては、サーバを自前で構築不要、SMTPにおける送信元認証(SPF,DKIM,DMARC)、DNSの設定などが簡単に設定できるようになっているため、すぐ利用できるという点です。
SESでは、送信できるEメール数と送信レートを規制しています。
・送信クォータ:24時間当たりに送信できるEメールの最大数(デフォルト200件)
・最大送信レート:SESが1秒あたりにメール送信指示を受け付けられる最大数(デフォルト1件)
初期状態では、送信クォータと最大送信レートの上限値が低い状態にあり、運用に耐えられません。そのため、送信制限の上限緩和についてAWSのサポートへ申請する必要があります。
申請時は、サイトのURL・配信の運用要件、配信件数の根拠などについて詳しく質問を受けるため、1つ1つ詳細に答えていく必要があります。しかし、残念ながら初回からリクエストに対して上限緩和してもらえることはありません。要件を満たす上限値に達するまで何度も申請を行う必要があります。
また、1回あたりの申請のやりとりで数日かかりますので、ここで意外と時間を費やすことになります。SESを利用する際は余裕をもったスケジュールが必要です。
※注意:上限緩和の制限あり
最大送信レートの上限緩和は最大300まで(AWSサポートからの回答)。それ以上の場合は専有IP契約が必要です。
ここで問題となったのは、Lambdaの実行時間の上限が15分であるということ。
15分の間に送信できる件数は単純計算すると以下の通りです。
上限300通/秒 = 300通×900秒 = 270,000通
これでは35万通を配信するという要件を満たすことができません。
仮に並列で動作させたとしても、SESが受け付けられる送信レートの問題で15分間で受け付けられる量は変わりません。直列で複数回呼び出す方法も検討できますが、構成が複雑かつアプリケーション側の対応が必要になるため、できるだけ避けたいと考えました。
AWS Glueとは、分析基盤などで必要となる大量のデータ処理を行うためのETLサービス群の1つです。単独のバッチ処理(Python Shell)として他のサービスと連携して使用することが可能です。Glueの実行時間上限は48時間であるため、最大送信レート上限の問題をクリアしました。
※指定時間以上かかる場合は並列実行が必要となり、SESを複数リージョン用意して並列で利用する方法を検討します。
メルマガ配信では、配信登録した古いメールアドレスが残り、バウンス対象は日々増加していくことが予想されるため対策が必要です。
SESではバウンスを起こし続ける事で、送信元ドメインやSESのIPアドレスプールの評判が落ちないよう保護する機能(サプレッションリスト)が提供されています。
※サプレッションリスト:ハードバウンスしたEmailアドレスが登録されるリスト
リストに追加されたアドレスに対しては次回以降配信対象とならないため安心です。
しかし、SESでは、リストに追加されたアドレスを含めバウンス率(不達率)を一定以内に抑える必要があります。
<バウンス率>
2%未満:最良の結果を得られる
5%以上:アカウントはレビュー対象
10%以上:問題が解決するまで、以後の E メール送信を一時停止する場合がある
連続してオーバーした場合は、ペナルティとして送信停止処置が行われ配信ができなくなるため、対策が必要です。
バウンス対象のメールアドレスは、次回以降送信しないようNGリストに記録します。AWSが紹介している構成図はSQS→Lambda起動というようになっていますが、リアルタイムではなくバッチで一括登録する方法としています。理由としては、1アドレス単位でリアルタイムでLambdaを実行されるとコストがかかるため、1日2回以上のメルマガ配信は行われないという事情もあり夜間に一括で処理する方式としました。
ここまでで、送信制限やバウンスの問題をクリアしてきました。
最後に、「本当に35万通を指定の時間内に配信できるのか」という点を検証する必要があります。しかし、実際に35万のアドレスを用意することは難しく現実的ではありません。
SESでは、シミュレーター機能がありバウンス率を気にすることなくテスト可能です。
▼シミュレーターを使用した Amazon SES でのテストメール送信
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/send-an-email-from-console.html#send-email-simulator
これにより大量のメール配信のテストが手軽に行えます。また、バウンスを想定した場合のテストも可能となっており便利です。
いかがでしたでしょうか。
AWSに限らずクラウドサービス、特にサーバレスでは様々なサービス独自の制約や課題がつきものです。課題を一つ一つ解決することで、構築と運用コストの大幅な削減を実現できます。
もしサーバ運用を見直したい、構築や運用のコストを下げるためサーバレスを検討したいというご要望をお持ちの場合は、ぜひ弊社へお気軽にご相談ください。
DCRは、お客様のお悩みに合わせたAWS導入支援サービス提供で課題解決いたします。
クラウド検討から、クラウド環境の構築、システムのクラウド移行、クラウド環境で重要となる運用設計・運用環境の構築を含め、トータルでご支援いたします。
詳しくは、下記フォームより「AWS導入支援サービス」資料をダウンロードください。
導入事例もご紹介しておりますので、ぜひ事例をご参考のうえ、どうぞお気軽にお問い合わせください。