ALBは3つのAZを指定するのがベストプラクティス?
先日発生したAWSの大規模障害に関して、2つのAZを使う構成だと片方で障害が発生したときそのAZを切り離して1つのAZで運用できないので、切り離せるように3つのAZで運用すべきという話(ITMedia News, orangeitems’s diary)がありますが、これは理想的ではないと思います。
RedisやMongoDBなどのpersistenceのクラスタで3つの独立したゾーンに各ノードを配置する設計は定番で、それは障害でネットワークが分離した場合にsplit-brain問題を防ぐために原理的にそうせざるを得ないわけですが、今回の障害はそれとは関係ありません。
ALBが2つ以上のAZの使用を前提としており、1つのAZのみの設定ができないのは、AWSが提唱するベストプラクティスを強いることを目的とした(言わば「おせっかい」な)仕様のためです。ロードバランサの原理として2つ以上の独立したゾーンが要求されるわけではありません。
また、仮に3つのAZの使用がベストプラクティスだとすると、AWSは今度は3つのAZの設定を必須とするようALBの仕様改正を始めることになるでしょう。そうしないとベストプラクティスを強いる姿勢が一貫しないからです。しかしそうすると、4つのAZを指定することがベストプラクティスとなります。これは無限ループで、必要なAZは際限なく増えてしまいます。
このように、使用するAZを3つにすることは、その場しのぎの対策としてはそれなりに意味があっても理想的な解決策とは言えないものです。この問題は根本的にはAWS側が解決すべきもので、1つのAZのみ指定できるようALBの制限を緩和したり、1つのAZの障害がALBの機能全体に影響を及ぼすことのないよう設計を改善したりすることが求められるのだと思います。AWSの利用者が行うことは、その対応をAWSに促していくことでしょう。
ちなみに弊社では、ひとつのAZのみでALBを使いたい場合、使用するAZとして2つのAZを指定しつつTargetには一方のAZのEC2インスタンスのみを指定するようにします。これでもALBは動作します。ただ、今回の障害がこの設定で回避できたかは不明です。私は数十のAWSアカウントを管理しているのですが、奇跡的に大きな問題は発生しませんでした。