はじめに
2019年8月に発生したAWSの東京リージョンでの障害は記憶に新しいことかと思います。
[東京リージョン (AP-NORTHEAST-1) で発生した Amazon EC2 と Amazon EBS の事象概要]
(https://aws.amazon.com/jp/message/56489/)
マルチAZで構築していても影響があった方も多かったと思います。
その中でALBにおいて、継続してサービスを提供するには2AZより3AZにすべき
という意見が見られたので、なぜ3AZにしなければならないのかを調べてみました。
なおAWSについて勉強し始めたばかりなので、間違い等あればご指摘ください。
ALBは2AZを指定する必要がある
ALBでは2つ以上のAZのサブネットを設定する必要があります。1AZにすることは出来ません。
そのため、3AZならば2AZに減らすことは出来ます。
2AZでもALBがロードバランスしてくれるから、問題ないのではと最初思っていました。
しかし、ALBの仕組みを見ていくと2AZでも障害が起こってしまう可能性があることがわかりました。
ALBはどう動いているのか
2AZでALBを試しに作り、yuki-furukawa-alb-hogehoge.us-east-1.elb.amazonaws.com
というDNS名が払い出されたとします。
これをdigコマンドを使って見てみます。
(DNS名やIPアドレスは適当に書き換えています)
$ dig yuki-furukawa-alb-hogehoge.us-east-1.elb.amazonaws.com 土 3/14 16:59:20 2020
; <<>> DiG 9.10.6 <<>> yuki-furukawa-alb-hogehoge.us-east-1.elb.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26213
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;yuki-furukawa-alb-hogehoge.us-east-1.elb.amazonaws.com. IN A
;; ANSWER SECTION:
yuki-furukawa-alb-hogehoge.us-east-1.elb.amazonaws.com. 59 IN A XXX.XXX.XXX.1
yuki-furukawa-alb-hogehoge.us-east-1.elb.amazonaws.com. 59 IN A XXX.XXX.XXX.2
;; Query time: 41 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sat Mar 14 17:01:18 JST 2020
;; MSG SIZE rcvd: 116
DNSのAレコードに2つのIPアドレスが割り当てられているため、DNSラウンドロビンによってXXX.XXX.XXX.1
またはXXX.XXX.XXX.2
にアクセスすることになります。
XXX.XXX.XXX.1
とXXX.XXX.XXX.2
がALBのIPアドレスになります。
ALBはEC2のインスタンスのようなものが立ち上がって、アクセスを振り分けているということです。
EC2のインスタンスが停止した場合
ALBはヘルスチェックを行っているので、停止したEC2インスタンスへアクセスは行かず、他のインスタンスにアクセスします。
この場合は2AZでも障害が起きても問題はないです。
ALBのインスタンスが停止した場合
ALBのインスタンスが停止した場合を考えてみます。
ALBはEC2の基盤を使っていると考えれれるので、EC2のサービスが提供できなくなった場合、ALBにも影響が出ると思われます。
DNSラウンドロビンによってALBへのアクセスを振り分けているため、ALBのインスタンスが1つでも停止していると影響を受けることになります。
この例では名前解決の結果XXX.XXX.XXX.2
にアクセスした場合、エラーが表示されてしまいます。
これが3AZだったらどうでしょうか。
3AZなら2AZに変更することができるので、障害が起きたALBを切り離す事ができます。
つまり、ALBの障害を考慮すると、3AZで構築する必要があるということになります。
おわりに
SLAにもよるかと思いますが、ALBでの障害を考慮した場合3AZにしたほうが安心です。
ALBは3AZにした方がいいよって言われたときに、なんでだろうと思った人に参考になれば幸いです。