エンハンスドロードバランサの固定レスポンスを試してみた

さくらのクラウド

皆さんこんにちは!新人のアナサピです!
今回は、さくらのクラウドのエンハンスドロードバランサを使って、Apacheを起動したままメンテナンス用の応答へ切り替えてみました。
Webサイトのメンテナンス中に、通常のページではなく「現在メンテナンス中です」と案内を出したいことがあると思います。 そのためだけにWebサーバ側のファイルや設定を変更するのではなく、ロードバランサ側の設定だけで切り替えられるのでしょうか。
そこで今回は、エンハンスドロードバランサの「固定レスポンス」を使って、変更前後のHTTP応答を確認してみます!

今回やること

流れは大まかに以下の通りです。

  1. Apacheで確認用のページを用意する
  2. エンハンスドロードバランサ経由で通常のページが返ることを確認する
  3. 固定レスポンスを設定して、対象のページだけをメンテナンス表示へ切り替える
  4. 対象外のページやApacheへの直接アクセスも確認する
  5. Apacheやサーバ自体を停止した場合の確認

今回はサイト全体ではなく、/index.html だけを対象にします。 切り替えるページと、そのまま返すページを分けることで、設定の影響を確認していきます。

検証環境

今回は、エンハンスドロードバランサ1台とApacheを動かすサーバ1台を使用しました。

項目内容
エンハンスドロードバランサ名TestLB
待受設定HTTP・80番ポート
実サーバWebサーバ1台
WebサーバApache 2.4.63
切替対象/index.html
対象外の確認用ファイル/health-c.txt

本文では、エンハンスドロードバランサのVIPを ELB_IP、実サーバのIPアドレスを WEB_IP と表記します。

通常時のアクセス経路は以下の通りです。

curl → エンハンスドロードバランサ(HTTP/80)→ web(Apache/80)

今回使う固定レスポンスは、条件に一致したリクエストに対して、エンハンスドロードバランサ側に設定したステータスコードや本文を返す機能です。機能の詳細については、公式マニュアルもご確認ください。

Apacheで確認用のページを用意する

まずは、実サーバ側の準備から行っていきます。
現状はApacheとcurlを用意し、Apacheを起動しています。
まずは応答を見分けるためのファイルを2つ置きます。

[root@web ~]# echo "Apache OK" > /var/www/html/index.html
[root@web ~]# echo "HEALTH" > /var/www/html/health-c.txt
[root@web ~]# cat /var/www/html/index.html /var/www/html/health-c.txt
Apache OK
HEALTH
[root@web ~]#

index.html は今回の切替対象、health-c.txt は対象外の応答確認に使います。

サーバ自身から、まずは通常のページが返るか確認します。

[root@web ~]# curl -i http://127.0.0.1/index.html
HTTP/1.1 200 OK
~省略~
Content-Type: text/html; charset=UTF-8

Apache OK
[root@web ~]#

想定通り、ステータス200で「Apache OK」が返ってきました。
こちらを通常時の応答として、エンハンスドロードバランサの設定前後で比較していきます。

エンハンスドロードバランサを設定する

コントロールパネルの「グローバル → エンハンスドLB」から、検証用のエンハンスドLBを作成します。 今回は TestLB という名前を付けました。

待受ポートを設定

「待受ポート」タブから「追加」を選択し、以下の内容を設定します。

エンハンスドロードバランサで実サーバを登録

続いて「実サーバ」タブから「追加」を選択し、先ほどApacheを用意したサーバを登録します。

ここで指定するポート番号は、実サーバのApacheが待ち受けているポートです。今回は80番にそろえています。

また、HTTP監視のパスは、実サーバ側に置いたファイルと同じ /health-c.txt にそろえます。
設定後は、画面上部の「反映」をクリックし設定適用していきます。

変更前の応答を確認

それでは、エンハンスドLBのVIPへアクセスしてみます。

[root@web ~]# curl -i http://ELB_IP/index.html
HTTP/1.1 200 OK
~省略~
server: Apache/2.4.63 (Rocky Linux)
~省略~
content-type: text/html; charset=UTF-8
via: 1.1 sac-elb

Apache OK
[root@web ~]#

エンハンスドLB経由でも 200 OK と Apache OK が返ってきました。
これで、エンハンスドLBから実サーバへ通常の転送ができていることを確認できました。

固定レスポンスを設定する

ここから、対象のページをメンテナンス用の応答に切り替えていきます。 Apacheのファイルやサービスには手を加えず、エンハンスドLBの「ルール」タブから設定します。

「追加」を選択し、今回は以下の内容にしました。

項目設定内容
ホストヘッダ空欄
パス/index.html
送信元IP空欄
リクエストヘッダ名・値空欄
アクション固定レスポンス
ステータスコード503 Service Unavailable
コンテンツタイプtext/html
コンテンツボディ下記のHTML
<h1>Maintenance</h1><br>
LBTest

今回のポイントは、パスを /index.html に限定していることです。 すべてのページを切り替える設定にはしていないため、対象外の /health-c.txt と比較できます。

変更後の応答を確認

切替対象のページにアクセス

先ほどと同じURLへアクセスします。

[root@web ~]# curl -i http://ELB_IP/index.html
HTTP/1.1 503 Service Unavailable
cache-control: private, no-store
content-type: text/html
connection: close

<h1>Maintenance</h1><br>
LBTest
[root@web ~]#

先ほどは 200 OK と Apache OK でしたが、今回は 「503 Service Unavailable」 と、エンハンスドLBに設定した本文が返ってきました!
Apacheの index.html を書き換えなくても、エンハンスドLB側の設定で応答を切り替えられたことが分かります。 本文に入れた LBTest も返っているため、通常転送が失敗しただけの503とは区別できます。

対象外のページにアクセス

続いて、ルールに指定していない /health-c.txt へアクセスします。

[root@web ~]# curl -i http://ELB_IP/health-c.txt
HTTP/1.1 200 OK
~省略~
server: Apache/2.4.63 (Rocky Linux)
~省略~
content-type: text/plain; charset=UTF-8
via: 1.1 sac-elb

HEALTH
[root@web ~]#

こちらは通常通り 200 OK と HEALTH が返ってきました。

同じエンハンスドLBにアクセスしていても、/index.html は保守応答、/health-c.txt はApacheの通常応答になっています。 今回指定したパスだけが切り替わり、対象外のページへの転送は続いていることを確認できました。

Apacheへ直接アクセス

エンハンスドLBを通さず、実サーバ自身からApacheへ直接アクセスする確認も行いました。 確認に使うコマンドは以下です。

[root@web ~]# curl -i http://127.0.0.1/index.html
HTTP/1.1 200 OK
~省略~
Content-Type: text/html; charset=UTF-8

Apache OK
[root@web ~]#

直接アクセスでは 200 OK と Apache OK が返ることを確認しました。エンハンスド LB経由ページはメンテナンスとなっておりましたが、サーバ自身からのアクセスではApacheが通常応答を返すことを確認できました。

追加検証:Apacheを停止しても保守応答は返る?

ここまではApacheを動かしたまま、エンハンスドLB側の応答を切り替えました。 では、保守表示に切り替えた後、実際にApacheを停止するとどうなるのでしょうか。

メンテナンス中には、Webサーバのサービスを停止する作業も考えられます。 そこで追加で、固定レスポンスを有効にした状態でApacheを停止してみました。

まず、Apacheが起動していることを確認してから停止します。

[root@web ~]# systemctl is-active httpd
active
[root@web ~]# systemctl stop httpd
[root@web ~]# systemctl is-active httpd
inactive
[root@web ~]#

この状態で、もう一度エンハンスドLBの切替対象へアクセスします。

[root@web ~]# curl -i http://ELB_IP/index.html
HTTP/1.1 503 Service Unavailable
cache-control: private, no-store
content-type: text/html
connection: close

<h1>Maintenance</h1><br>
LBTest
[root@web ~]#

Apacheを停止していても、変わらず固定レスポンスが返って来たことを確認しました。
同じ503でも、今回はエンハンスドLBに設定した Maintenance と LBTest が返っています。 今回確認したタイミングでは、Apacheの稼働に頼らず、エンハンスドLBの固定レスポンスを取得できることが分かりました。

サーバを停止しても固定レスポンスが返ってくるのか

ここまでの確認では、webサーバを稼働した状態で実行していましたが、次にサーバを停止した状態ではどうなるか確認します。
サーバ停止を確認後、手元のWindows PCのPowerShellから、エンハンスドLBへアクセスしてみます。

PS C:\> curl.exe -i http://ELB_IP/index.html
HTTP/1.1 503 Service Unavailable
cache-control: private, no-store
content-type: text/html
connection: close

<h1>Maintenance</h1><br>
LBTest
PS C:\>

こちらも 「503 Service Unavailable」 と、設定した Maintenance、LBTest が返ってきました。
サーバ停止を伴う作業でも問題がないことがわかります。

まとめ

今回は、エンハンスドロードバランサの固定レスポンスを使って、Apacheを起動したままメンテナンス用の応答へ切り替えてみました。
今回の条件では、Webサーバ側にメンテナンス用のファイルを置き直さずに、エンハンスドロードバランサ側の設定だけで対象パスの応答を切り替えられました。 また、対象外のページは通常通り返せることも確認できました。
また、サーバ内のApacheやサーバ事態を停止した際にも、対象パスではエンハンスドロードバランサに設定した503応答を取得できました。

メンテナンス表示を出したい時に、Webサーバ側を変更する以外の方法として、実際の設定画面と応答を確認できたのは勉強になりました!

最後までご覧いただきありがとうございました!

この記事を書いた人

アナサピ

サービス業からのエンジニア転職。

クラウドに触れながら得た気付きや、初心者からの視点をお届け。

「これから触る人の参考になる情報」をまとめていきます!

【取得資格】

LinuC Level1

さくらのクラウド検定