おうちK8s上でメールサーバーを建てようと思ったけどやめた方がいいねってなった話。
背景
個人開発しているものの要件の中に、メールアカウントを動的に生成したいという要件が生まれたのだが、当然そうなると管理用のRESTAPIを提供しているメールサーバーが必要になる。
今の所、onamae.comのようなサイトでもこのような機能は備えていない。
そこで、mailuというサービスがhelmチャートを用意していたので、悪戦苦闘しながらデプロイしていた。しかし、その悪戦苦闘をした上で、メールサービスはレンタルサーバーを使った方がいいという結論に辿り着いた。
ここでは、それについて詳しく言及していこうと思う。
そもそもメールという規格自体が古い
そもそもクラウドネイティブな開発とはどういうメリットがあるのか。
それは、ネットワーク機器など、ハードウェア上の制約が少ないことであると考える。
ネットワークを仮想化することによって、さまざまな環境で再現性の高いE2Eテストができるなどだ。
メールという企画自体、それにあっていないのだ。
具体的に説明しよう。メールという企画は、主にIPアドレスとDNSによってメールの検証を行なっている。
当然仮装ネットワークを使ってようがなんだろうが、結局プロバイダーの契約はするので、IPアドレスは必須である。
問題は逆引きDNSの存在だ。
Gmailでは迷惑メールフィルターの内容を簡単に紹介しているが、
二番目に逆引きDNSが一致しているかどうかということが上がっている。
逆引きDNSというのは本来DNSサーバーにIPアドレスを問い合わせるが、
メールという企画は、DNSのレコードに内包されている情報によってなりすましや改竄を防いでいる。
すなわち、DNSは単なるIPアドレスを返すだけの存在ではなく、認証局ですらあるのだ。
そのため、DNS自体のなりすましを防ぐため、IPアドレスを提供しているプロバイダー自体に問い合わせを行い、このIPアドレスは本当にこのドメインと紐づいていますか?みたいな問い合わせを行う。
これは一つのIPに一つのドメインしか紐づけられない。
つまり、バーチャルホスティング前提のKubernetesにとっては致命的な企画なのだ。
これを対策するには、複数のプロバイダーと契約して、IPアドレスを複数契約し、Kubernetes上でこのIPでListenした場合はこのサービスへ...というふうに設定しなくてはいけない。
これでは、クラウドネイティブの恩恵が失われてしまうのだ。
さらに言えば、めんどくさすぎる。
もしこのメールサービスをAWS上のクラスタに移植するとなった場合、IPアドレスも変わるので、プロバイダー関連の設定も変わる。再現性がある確証もない。
メールサーバーごときにスケーリングが必要か
そう。いってしまえばメールサーバー「ごとき」なのだ。
Webアプリの場合は、もしバズれば100万人が使うかもしれない。
そうなるとサーバーは当然スケーリングしなくてはならない。
だが所詮はメールだ。会社で使うようなメールサーバーでも2Gもあれば十分に動作する。
もしそこまでメールサーバーに負荷がかかる要件があるのであれば、それはそれで問題だ。
クラウドサービスはすごい
さくらVPSに月額800円しか払ってない分際で、逆引きDNS名を設定できる。
普通にデータセンター向けの回線を複数IPアドレスオプションで申し込むと、
月数万円飛ぶのであほらしい。
Discussion