AWS SESを使うときは必ずDKIM鍵設定をしよう

DKIM (Domainkeys Identified Mail) という公開鍵をSESに登録したメールアドレスに設定しないとG Mail(G Suite)等のメールサービスが提供するメーリングリスト(ML)にメールが届かないことがあります。

ということについて書こうと思います。

自己紹介

こんにちは。 AG-Boost事業部の開発責任者の清水(@shimizu_yoo)と申します! 現在はAG-Boost という広告提案支援をするツールの開発をしております。

今日はタイトルの通り社内のシステムにおいてAWSのSESを使ったときにDKIM設定が原因で起きたなかなか気づけなかった障害の話をしようと思います。

AWS SESについて

多くは説明する必要ないと思うので省きますが、SES(Simple Email Service)はAWSにおけるメール送信サービスです。 aws.amazon.com

ウェブサービス側からユーザーに対してメールを送りたい場面で使われています。

導入方法やサンプルコードなども数多くの方がブログで触れているのでここでは解説しません。

※ 参考 qiita.com

特定のメーリングリストに対してメールが送信できなくなる事象

あるサービスにおいて、顧客にシステムから送っているメールが突然届かなくなったという事象が発生。 そのサービスは外部のベンダーが作ったもの(若干レガシー...)を最近社内で引継ぎ保守管理をすることとなり、メンテナンスのためにdockerコンテナの再起動をしたのでそれが引き金になった可能性が高いと思い調査をしました。

結論から言うと、G Suiteで作られたMLに対するメールが届かなくなっていました。

G SuiteのMLではスパムと疑わしいメールは送信されずに管理者承認が必要になるというのがデフォルトの設定になっています。

f:id:so-technologies:20210813163105p:plain:w400
グループ設定変更画面

この設定に引っかかったメールは以下のように承認待ちの状態で管理者が承認を押すまでMLに入ってるメンバーには送信されません。

f:id:so-technologies:20210813163649p:plain:w700
グループ管理承認

MLグループの設定でスパムチェックせず全部通す設定にするか、都度管理者が承認を押すようにすれば当然流れるようになります。

しかしウェブサービスを運営している事業者側にとってはMLの設定は顧客側の問題であり、全ての顧客ユーザーに対して設定変更を要求するわけにはいきません。システム側で問題解決をする必要があります。 そこで表題の結論なのですが GoogleのシステムではDKIMを設定してないメールアドレスからの送信はスパム判定されてしまう可能性が高いようです。

この事象の非常に厄介な点は * 全てのメールアドレスに対して送れないわけじゃない * 個人宛てのアドレスには全て届く * MLですら送信可能なMLが存在する * DKIM設定していなくても送れるケースもある

よって動作確認したときに正常だと錯覚してしまい、エラー検知が遅れることとなりました。 SESの動作確認だと自分の個人アドレスでテストしてしまうことが多いですよね。

DKIM鍵設定

SESでDKIMを設定する流れは以下のとおりです

SESの画面上でDKIMを発行する

f:id:so-technologies:20210813170610p:plain:w300
DKIM生成
f:id:so-technologies:20210813171057p:plain:w300
DKIM key

ドメインサービスの管理画面からそのドメインに対して発行したDKIMを登録する

↑で発行された公開鍵のcnameを自分でドメインサービス(お名前ドットコム、バリュードメイン、AWS等)の管理画面で使用するドメインのDNS設定から追記しましょう。

f:id:so-technologies:20210813171801p:plain:w300
公開鍵設定

ただし、各サービスによってcnameの書き方が若干違うため注意が必要です。SES画面から発行されたものをそのままコピペしても動かないことがあります。 書き方のフォーマットは大体DNS設定ページに書いてあります。

statusがverifiedと緑になれば完了です。

f:id:so-technologies:20210813172808p:plain:w300
dkim設定完了

これを設定したことにより、無事G SuiteのMLに対して承認なしにメールが届くようになりました。 ちなみに、なぜコンテナ再起動が引き金になったのかは迷宮入りしてしまいました。 DKIMはコンテナ再起動前も設定していなかったため、再起動前はGoogleのシステムがスパム判定で見ている何らかの値が閾値を超えずギリギリ通っていたのかもしれません。

まとめ

SESの使い方解説サイトにおいてDKIM設定はさらっと紹介される程度か全く書かれていないことが多い印象でした。 が、DKIMを設定しないとひどい目に合うかもしれないので必ず設定しましょうという啓発のつもりで書かせていただきました。 この話はSESに限った話ではありません。 今回の件はG SuiteのMLのスパム判定に引っかかるという話でしたが、そもそも各メールサービスのスパム判定ロジックはこちらからでは把握しようがありません。 今後他のメールサービスもスパム判定のロジックが変更されることによって、今まで送れていたメールが届かなくなるという可能性はあります。 よってシステム側でスパムと疑われないための最大限の努力をしておいたほうが良いと思いました。

ということで、SESを使うときは一旦1つのアドレスに対して送信できることが確認できて満足してしまわず、必ずDKIM鍵設定しよう!!