メール配信サービスの移行をしたので、調べた事や意識した事など残しておこうと思います。
メール周りは運用していくにあたってインボックスプロパイダにより独自のレピュテーション基準があったり、配信サービスとしてもバウンス・ブロック等様々な判定基準がバラバラであったりするためより良い仕組みを構築しようとするのには難しさを感じます。
それ故敬遠しており、普段メール周りの監視項目などもあまり意識をせず(良くない😣)保守運用をしてしまっていたので、学びの多い開発になりました。
どこかで誰かの参考になれば嬉しく思います。
前述の通り自分はメール配信サービスの開発者等ではなく、SengGridを利用してメール配信機能の開発・運用をしているエンジニアとなります。記載の情報には誤りがある恐れがありますのでご注意ください。(なるべくソースは載せるようにしています。)
昨年、Googleが発表したメール送信者ガイドラインを受け、認証まわりの見直しと、より良い運用・保守性を求めてメールサービスの変更を決定しました。
メールサーバを管理しMTAの構築やDKIMの認証設定を自らしていたので、アプリケーションの変更が認証結果にも影響を及ぼす可能性があり把握しておく必要がありました。設定にも落とし穴があり、運用・保守・開発とそれぞれしっかりと意識していないといけない状態となります。
例えばMTA側で改行コードやテンプレートの変換をしてしまい、メールハッシュ値が変わることによりDKIM認証がFAIL(body hash did not verify)となる可能性があります。
バージョンにもよりますが、sendmail_fix_line_endingsの設定等で回避しなければいけなかったりします。
IPアドレスのレピュテーションを守る(というか捨てられるようにする、、、)ためにリレーサービスを利用していましたが、その構成自体が冗長なものとなってしまっていました。
メールのトラブルが発生した際にも、アプリケーションサーバ、メールサーバ、リレーサーバとサービスを切り分けて調査していく必要があります。
こちらはドキュメントも十分に存在し、特段困ることはありませんでした。
基本的に以下2点を確認しておけば十分に開発が可能でした。
※動的テンプレートやワンクリック解除などは独自開発していたため、SendGrid側の機能は利用していません。
※ワンクリック解除に関しては、送信時にアプリケーション側からPersonalizationsでメールヘッダを設定する形としました。
※できればSendGrid側での開封率・クリック率測定も設定したかったものの、テキストメールに関してはクリック率を測定するのにパラメータが付与されてしまうので以下の理由から利用はしていません。
新規のメールサービスを立ち上げる訳ではなく載せ替えとなるため、移行に関しては以下2点を意識しました。
この観点を計画立案時に持てておらず、リリース1週前で一括載せ替えのリリースから段階的なものへとリリースの計画変更をしました、、、😭
メールサービスの載せ替え(というより送信元IPアドレスの変更)が今後あるか分かりませんが、勉強になりました、、。
スケジューリングに関してはこちらを参考に設定しました。
多い日によっては2万通のメールを送信するプロダクトだったため、スロットリングやブロックが発生してしまうと大事故となります。
問題のない可能性もありましたが、慎重になりすぎるぐらいが丁度いいと思い分割で徐々に適用していく計画としました。
実際の送信数は以下のように推移し、過度な遅延が発生するなどの問題はなく1日あたり2万通の送信まで移行することができました。
移行段階 | 経過日数 | メール配信数 |
---|---|---|
1stリリース | 1 | 63 |
2 | 83 | |
3 | 73 | |
4 | 106 | |
5 | 127 | |
2ndリリース | 6 | 363 |
7 | 2,027 | |
8 | 1,255 | |
3rdリリース(最終) | 9 | 8,454 |
10 | 20,800 |
こちらに関しては問題ないとし、リリース時のクリーニングは実施しない形としました。
バウンス率に関しては最低でも3%未満をキープするものとしています。現行システムでの配信エラー率が3%未満であったため、載せ替え時においてのクリーニングは実施しないという判断をしました。
とはいえ、ソフトバウンス・ハードバウンスともにSendGridでは独自の基準に基づいて振り分けられているため、移行後の変動など注視していく必要はあると感じています。(移行時に限らず送信先リストのクリーニングは定期的に実施をする必要があります。)
また、バウンス率は平均5%~10%あると言われているものの、理想的な数値は0.5%とも言われています。
今回は問題が発生しないと考えられる中で現実的に守れる範囲を設定したので、この水準は改善し続けていかなければいかないと捉えています。
実際、移行後に20万通弱のメールを送信した時点では3%未満をキープする結果となっています。
運用・保守に関してはO'Reilly『入門 監視』の以下の考え方が重要だと考えています。
監視とは役割ではなくスキルであり、チーム内の全員がある程度のレベルに至っておくべきです。
https://www.oreilly.co.jp/books/9784873118642/
メール機能周りの監視・運用に関してはそれ単一の領域で専門的なスキルが求められるため無意識のうちに役割化してしまいがちですが、そうではなく、だからこそ全員が"ある程度"のスキルを獲得し、組織として運用していけるようにしなければいけないと捉えています。
また、対象プロダクトの特性でもあるのですが、SendGridの機能を使い切って安定したメール配信機能の提供だけではなくプロダクト自体の成長にも繋げていきたいという思いもあり、開発チーム外にもレクチャーを実施し組織横断して血の通った運用を実現していく狙いがありました。
これらの考え方をもとに、サービス載せ替えのリリースと同時にチーム全体で運用をしていくために以下の説明会を実施しました。
元々はプロダクト開発チーム向けに開催しようと考えていた説明会・ハンズオン会は3つほど案を用意していました。
それぞれ実施希望をアンケートで確認したのですが、以下のような結果になりました。
※()内の割合が希望率になります。
2に関してはWebAPIやSDKのドキュメントを各自で見ていくのが一番手っ取り早いと感じていましたし、1に関しては普段は変更の必要がないDNSやSendGrid側の設定などに触れていくつもりでしたが、こちらは早急なキャッチアップが必要なものではありません。3に関して100%の希望率となったことは、DevOpsを実践していくチームとして全員が監視のスキルを持ち合わせ、インシデント対応もできなければならないという意識が自然と顕れた証拠なのかなとも感じており嬉しかったです。
1に関する内容は、チーム内wikiのような形で運用しているページに残す形でカバーしていこうと考えています。
基本的な監視項目に関してはPostmasterToolsのダッシュボードに集約してくれているのでこちらをもとに設計しました。
ただし、PostmasterToolsの結果だけを見ていくのは注意が必要です。
特に2点目は注意が必要かなと感じています。
リスクに対して事前検知ができない(気づいた時には問題が発生している)という点で、監視ツールとして利用していくべきではないと考えています。
以下の観点で整理をしてみました。(あくまで自組織で運用していこうと考えているものになりますのでご注意ください。)
APIキーの不正利用により高まるセキュリティリスクもあるので、IP Access Managementの設定&確認必須。
固定アドレスでない場合、共有アドレスとなるため他のユーザーによってIPレピュテーションが低下するリスクがありプロプランとしました。
DMARC認証通過の条件に関してはこちらの表がわかりやすかったです。
他にも遅延の発生率やスパムレポートなど見ていきたいものが多くあるのですが、代表的なものはこの辺かなと思っています。
直近、対応していきたいと考えているのは以下2点です。