[アップデート] Amazon SES にノイジーネイバー対策となるテナント機能が追加されました
いわさです。
先日のアップデートで Amazon SES にテナント機能が追加されました。
Amazon SES を運用する上では苦情やバウンスなどレピュテーションに注意して運用する必要があります。
このあたりがケアされずにいると、ある時から突然メールが送信できなくなってしまった。なんてことが起きてしまいます。
メール送信内容が自分たちで管理できる通常のワークロードであれば、レピュテーションメトリクスをしっかり管理してある一定の閾値を超えたタイミングで対策するなどの運用で普通は送信できなくなるリスクを抑えることが出来ます。
ただし、SaaS を提供していてその SaaS にメール送信機能があり Amazon SES をメール送信基盤に使っている場合、レピュテーションはテナントごとの使い方に依存してしまいます。
例えば、ある SaaS で複数のテナントである AWS アカウントの Amazon SES の機能を使っている場合に、特定のテナントがスパムメールのような使い方をしてしまい苦情率があがったとします。そうするとその特定のテナントのせいで他の適切な使い方をしていたテナントまでメール送信できなくなる可能性があります。
あるいはアカウント全体でメール送信数の上限を定めていたりレートリミットがある場合に、特定のテナントが大量にメール送信をすることで、少量のメール送信を行うテナントの送信に影響が出てしまう場合があります。
ノイジーネイバーってやつですね。
今回のアップデートではメール送信のコンテキストに「テナント」を含めることができるようになりました。
そして、テナントごとに分離されたレピュテーションメトリクスを管理できるようになり、ノイジーネイバーの恐れがある場合に特定テナントだけメール送信を停止させることが出来ます。これによって適切な使い方をしているテナントを保護することができるようになります。
テナントの作成
この機能はオプションなのでテナント分離の必要がなければ従来どおりの使い方のままで良いです。今回のアップデートの影響はありません。
テナント分離機能を使いたい場合はまず Amazon SES の新しいリソース「テナント」を作成する必要があります。
テナントは、作成だけであれば名前だけですぐに作成できます。
ただし、テナントは作成しただけではメール送信に利用できず、送信 ID と設定セットへの関連付けが必要です。
割り当てるにはコンソール上の ID タブあるいはセットアップパネル上から割り当てを行います。
1 テナントに複数の送信 ID を割り当てることもできますし、1 つの送信 ID に複数のテナントを割り当てることもできます。
割り当てられたテナントは送信 ID 側でも確認が可能です。
なお、今回はテナント機能から既存の送信 ID に割り当てを行いましたが、新規送信 ID や設定セットの作成時には既存テナントを割り当てることも可能です。
このテナントですが、リージョン固有のリソースになっているので、複数のリージョンからメール送信する場合はリージョンごとに作成が必要です。
また、デフォルトでは最大 10,000 テナントまで作成が可能で、Service Quoataas から引き上げが可能です。ドキュメントによると 300,000 までは自動承認されるみたいです。
テナントごとに評価ポリシーを割り当てる
このテナントですが、評価ポリシーという概念があります。
Amazon SES はテナントごとのレピュテーションを自動で評価しレピュテーション違反を検出してくれます。この評価ポリシーを使ってその際の感度や挙動を少しカスタマイズできます。
テナント作成時のデフォルトでは「標準(推奨)」が選択されていますが、他に「厳格」と「なし」が選択できます。
明確な内容が公式ドキュメントにも記載されていないのですが、レピュテーション違反には重要度が低い警告(対処しないと配信に影響する可能性のある軽微な問題)と重要度が高い警告(配信に影響を及し、強制措置が取られる場合もある重大な問題)があります。
「標準」ポリシーでは重要度の高い高いレピュテーション違反が検出された時に一時的に対象テナントのメール送信機能を停止させます。
「厳格」ポリシーでは重要度が低い警告が検出された場合にも停止します。
「なし」は検出はされるのですが、自動停止はされません。
テナントごとのメール送信
メール送信側はテナントを指定して送信する必要があります。
Amazon SES v2 API か、SMTP 送信で指定することができます。
SES v2 API の場合はsend-email
時にTenantName
を指定します。
% cat hoge.json
{
"FromEmailAddress": "tenant1@mail1.tak1wa.com",
"Destination": {
"ToAddresses": [
"iwasa.takahito+to1@example.com"
]
},
"Content": {
"Simple": {
"Subject": {
"Data": "hoge-subject"
},
"Body": {
"Text": {
"Data": "hoge-body"
}
}
}
},
"ConfigurationSetName": "hoge-config",
"TenantName": "hoge-tenant1"
}
% aws sesv2 send-email --cli-input-json file://hoge.json
{
"MessageId": "010601986ca0dd21-dbdb91a0-b3b6-4801-86de-669e94ae10ba-000000"
}
今回試していませんが、SMTP 経由で送信している場合はX-SES-TENANT
カスタムヘッダーでテナントを指定することができるみたいです。[1]
なお、対象送信 ID に指定したテナントが割り当てされていない場合はメール送信時に次のようにエラーとなります。
% aws sesv2 send-email --cli-input-json file://hoge.json
An error occurred (AccessDeniedException) when calling the SendEmail operation: Tenant not associated with resources [arn:aws:ses:ap-northeast-1:123456789012:configuration-set/hoge-config, arn:aws:ses:ap-northeast-1:123456789012:identity/mail1.tak1wa.com].
テナントごとのメール送信状況を確認する
上記のように送信アプリケーション側でテナントを指定してメール送信をすることで、テナントごとに分離された情報を管理できるようになります。
試しにテナント1で3件メール送信し、テナント2で7件メール送信してみたところ、次のようにテナント画面からそれぞれのメール送信件数を確認することが出来ました。
さらに、バウンス数などについてもテナントごとの状況を確認することが出来ます。
Amazon SES コンソールのテナント機能からも確認はできるのですが、今回のアップデートで CloudWatch メトリクス上でもテナントが扱えるようになっています。
Amazon SES のメトリクスにテナントのディメンションが追加されています。
この中でテナントごとに送信数やバウンス数などを確認できるようになりました。
後述のテナントの停止機能を自動化したり、警告通知を送りたい場合などはこのあたりをうまく使えると色々と出来そうです。
テナントの送信を停止させる
テナントごとのステータスですが、レピュテーション違反による自動停止と手動停止が出来ます。
今回はバウンスをいくつか発生させてもレピュテーション違反が検出できなかったので手動停止の様子をお伝えしたいと思います。
テナントごとに「送信を一時停止」というボタンがありまして、こちらをを操作することでそのテナントのメール送信を停止させることが出来ます。
違反が検出されたりメトリクスが危ない状態になった時に他のテナントへの影響を避ける場合に該当テナントを停止させたい時に使えそうです。
一時停止ボタンを押すと確認ダイアログが表示されるので、確認を押します。
当然ながら停止されたテナントには影響が出るわけですが、他の適切なテナントへの影響を避けるためです。必要な措置です。
確認すると、即停止されます。送信ステータスが「一時停止」になりましたね。
この状態で先程と同じようにテナントを指定してメールを送信してみましょう。
停止されたテナントを指定すると、次のようにメール送信に失敗しました。
% aws sesv2 send-email --cli-input-json file://hoge.json
An error occurred (MessageRejected) when calling the SendEmail operation: Sending disabled for <arn:aws:ses:ap-northeast-1:123456789012:tenant/hoge-tenant2/tn-1e34e0a360600930e0f32b91ade54>. For more information, please check the resource configuration and status.
そして、停止されていない他のテナントの場合は引き続き正常に送信出来ていますね。今回だと同じ送信 ID を使っているので共有リソース上でうまく分離されていることがわかります。
% aws sesv2 send-email --cli-input-json file://hoge.json
{
"MessageId": "010601986ca60534-09351175-e1a6-4518-afa3-08d2b1c00aa1-000000"
}
自動停止・手動停止をした場合には手動での再開が必要です。
改善措置が取られたことが確認出来たあとに再開操作を行うイメージでしょう。
「送信を再開」ボタンを押します。
ステータスが「回復」になりました。
このステータス、私はすぐにステータスが正常に戻りましたが、アクティブなレプテーション違反が解決されるまではこの状態のままとなります。
試してみると、先程送信できなくなっていたテナントで再び送信できるようになっていました。
% aws sesv2 send-email --cli-input-json file://hoge.json
{
"MessageId": "010601986ca8d7c7-106a837d-2986-4916-8b4b-91c0b82a5ab0-000000"
}
追加料金がかかる
このテナント機能ですが、有償の追加オプションになっています。
まず、1 テナントあたり $0.005 ドル/月発生します。
さらに、1,000 通のメール送信ごとに $0.005 ドル発生します。
通常のメール送信が 1,000 通あたり $0.1 ドルなので、テナント機能を使うと $0.105 ドルになる感じですかね。
どうだろう、私の所感では料金インパクトは大きくなく、導入しやすそうな料金です。
さいごに
本日は、Amazon SES にノイジーネイバー対策となるテナント機能が追加されたので使ってみました。
今回のアップデートアナウンスでなるほどと思ったのですが、たしかにマルチテナント SaaS で Amazon SES を使う場合、使い方によってはノイジーネイバー対策が必要な対象ですね。
それも結構気をつけなければいけないところだと気が付きました。とても良い機能だと思います。
最近マルチテナント SaaS 向けのアップデートが多いですね。力を入れているのかな。