2AZ 構成の ALB でゾーンシフトを試してみた

2023.11.07

こんにちは!アノテーションの砂川です。
最近業務で、2AZ 構成の ALB でゾーンシフト機能を検証する機会がありましたため、ご紹介します。

ゾーンシフトとは

特定 AZ (アベイラビリティーゾーン) へのトラフィックを一時的に遮断できる機能です。
例えば、「複数AZ(1a,1c,1d)で動かしている ALB があるけど、1d で AZ 障害が発生しちゃった。。一時的に 1d へのトラフィックを止めたい」のような時に使える機能です。

ゾーンシフト機能を使うことで、ワンクリックで特定ゾーンへのトラフィックを遮断できるため、障害発生時のリソース切り離しがスムーズになり、運用の負担が減りそうですね。

余談ですが、これまで ALB を構成するときは、AZ 障害発生時に備えて、3AZ 構成を取ることがしばしばありました。 ALB は仕様上、2AZ 以上で稼働させる必要があり、3AZ で稼働させていれば、障害発生中の AZ を切り離しても、2AZ の条件を満たすことができます。 一方で、最初から 2AZ のみで運用していた場合は、障害 AZ を切り離すと 1AZ になってしまうため、仕様上その操作はできません。
詳細は以下の記事が大変分かりやすいので、ご参照ください。

上記のように 3AZ 構成は、冗長化の手段として有効ではありますが、お客様によっては、2AZ の ALB で運用したいなどの要件もあるかと思います。
そんな時、今回のゾーンシフト機能を使えば、2AZ 構成の ALB でもゾーンの切り離しができるため、一時的に 1AZ のみでロードバランサーを稼働させることが可能になります。 もちろん、障害発生時には何が発生するか予測困難のため、ゾーンシフト機能そのものが正常に動作しなくなることもあり得ます。 あくまで本機能は、障害発生時における1つの対策手段として考えておくと良さそうです。
では手順を紹介していきます!

構成図

本ブログで作成する AWS 構成の全体像です。(※クロスゾーン負荷分散がオフの状態の図です。クロスゾーン負荷分散については後述します。)
下記の図では、各 AZ に ALB ノードが1つずつあるように記載していますが、作成する論理 ALB は1つになります。 以下の環境を作成後、ゾーンシフト機能を実施して、特定ゾーンへのトラフィックを遮断できるか検証します。

環境準備

VPC の作成

以下のように、パブリックサブネットを2つ持つ VPC を作成します。作成方法については、【初心者向け】Amazon VPCの作成方法が詳しいので、ご参照ください。

EC2 インスタンスの作成

2つの AZ(ap-northeast-1a, ap-northeast-1c) に1台ずつ EC2 インスタンス(AMI:AL2023)を作成します。
なお、起動するインスタンスは、後ほど作成する ALB からのヘルスチェックに合格する必要があります。
そのため、起動時のユーザーデータに以下のスクリプトを設定し、Apache のドキュメントルート配下(/var/www/html/)にヘルスチェック応答用のファイル(index.html)を配置しておきましょう。
echo "Helo From 1a" の部分は適宜分かりやすいように変えてください。

#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
touch /var/www/html/index.html
echo "Hello From 1a" | tee -a /var/www/html/index.html

2台のインスタンスを作成しました。

動作確認として、各インスタンスに直接アクセスしてみます。
それぞれ値が返って来ているので、想定通り設定できています。もしエラーになる場合は、インスタンスのセキュリティグループおよびサブネットの NACL 設定等が適切か確認しましょう。

$ curl 52.196.26.99
Hello From 1a
$ curl 13.231.65.75
Hello From 1c

ALB の作成

2AZ 構成の Internet-facing な ALB、 および ALB に紐づく Target Group を作成します。 詳細な作成方法については、ELB(Elastic Load Balancing)を調べて使ってみた。をご参照ください。
以下、作成結果の重点箇所のみ、画像を掲載します。

作成した ALB(ap-northeast-1a, ap-northeast-1c) 作成したターゲットグループ: 2台のインスタンスを登録 ターゲットグループのヘルスチェックパスはデフォルトの「/」を使用

動作確認として、ALB の DNS に対しアクセスしてみます。

$ curl sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com
Hello From 1c
$ curl sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com
Hello From 1a

ALB 先の各 AZ にあるインスタンスからレスポンスが返って来ているため、適切に設定できていることが分かります。
もしここでエラーになった場合は、ALB とインスタンスのセキュリティグループを今一度ご確認ください。

次項のゾーンシフト開始後と比較するため、現在の ALB の DNS を確認しておきます。Tips ですが、ALB の DNS 名の先頭にアベイラビリティゾーンを付け加えることで、各 AZ にある ALB ノードの IP を個別に調べることができます。

$ dig sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com +short
54.248.1.219
52.197.178.163
$ dig ap-northeast-1a.sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com +short
54.248.1.219
$ dig ap-northeast-1c.sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com +short
52.197.178.163

上記結果より、現在の ALB ドメインには、ap-northeast-1a と ap-northeast-1c の ALB ノード IP が紐付いていることがわかります。

ゾーンシフトを試す

前項までで、環境準備ができたので、ゾーンシフトを実施していきます。

クロスゾーン負荷分散をオフにする

ゾーンシフトを実施するには、ターゲットグループのクロスゾーン負荷分散をオフにする必要があります。 クロスゾーン負荷分散をオフにすることで、各 AZ のロードバランサーノードは、ローカル AZ 内のターゲットのみにリクエストをルーティングするようになります。
以下の図(公式ブログから引用)の左がオン、右がオフの状態です。

そのため、公式ドキュメント-クロスゾーン負荷分散をオフにするの手順を参考に、オフに設定します。

ゾーンシフトの開始

それでは、ゾーンシフトを試していきます。
ゾーンシフトは、ロードバランサーの統合タブから開始できます。

今回は、ゾーンシフトで ap-northeast-1c を10分間切り離してみます。

ゾーンシフトを開始すると、以下のような画面表示になります。

ゾーンシフト開始直後、約1分程度で、ap-northeast-1c の ALB ノードの IP が名前解決されなくなり、1c へのトラフィックが遮断されていることがわかります。 もちろん、curlしても ap-northeast-1a のインスタンスからの結果しか返りません。

$ dig sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com +short                
54.248.1.219
$ curl sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com
Hello From 1a

10分後、ゾーンシフトが終了すると、約1分程度で以下のように ap-northeast-1c の ALB ノードの IP が復活し、再び 2AZ 構成の ALB に戻りました。

$ dig sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com +short
52.197.178.163
54.248.1.219
$ curl sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com
Hello From 1a
$ curl sunagawa-test-alb-97029264.ap-northeast-1.elb.amazonaws.com
Hello From 1c

上記結果から分かるように、ゾーンシフトでは、切り離したい AZ にある ロードバランサーノード の IP を DNS から解除することで、パージ操作を行なっているようです。
手順としては、クロスゾーン負荷分散をオフにして、開始ボタンを押すだけなので、かなり便利な機能になっていますね。これなら、障害時でも慌てずに操作ができそうです。

まとめ

今回は、ゾーンシフトの開始手順をご紹介しました。本機能を用いることで、2AZ 構成の ALB でもリソースの切り離しが容易にできることがわかりました。 なお、ゾーンシフトでは、実行中に期間の更新やキャンセルが可能になっています。そのため、障害発生時だけでなく、開発中の一時的なテストの際にも使えそうです。AWS は便利な機能が続々と出てくるので、すごいですね。

この記事がどなたかの役に立てば幸いです。
最後までお読みいただきありがとうございました!

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。