前回の続き。

ロードバランサーの「ヘルスチェック」の仕組みについて調べます。

WEBサーバ(EC2インスタンス)が2台、ロードバランサーが1台…が設定済みであることが前提です。



・WEBサーバの1台を停止させてみる
elb20
ロードバランサーの動作確認の一環として、web01 を強制的に停止(STOP)させてみます。
AWS Management Console から「Instances→web01→Actions→Stop」とクリックして、web01 の EC2 インスタンスを停止状態(STOP)にします。



・ロードバランサーはweb01の停止を認識する?
elb21
「Load Balancers → test-lb → Instances」をクリックして、ロードバランサーが web01 をどのように認識しているかを確認します。
↑の画面では、Out of Service となっており、理由はともかく web01 が無応答であることを認識しています。
これは期待通りですね。



・web01がSTOPした状態でhttp疎通試験してみる

ローカルPCからコマンドラインでロードバランサーに対してhttpリクエストを発行してみます。

$ for R in $(seq 1 20) ; do curl 'http://dualstack.test-lb-2062688374.ap-northeast-1.elb.amazonaws.com/ec2meta.php/latest/meta-data/public-hostname'; echo -en "\n" ; done
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com
ec2-176-34-36-129.ap-northeast-1.compute.amazonaws.com

※ホスト名は、自分のロードバランサーのものと置き換えてください。

web01が停止しているので、web02 にだけリクエストが届いているのが分かります。



・全WEBサーバを停止(STOP)させる
elb22
「Instances→web02→Actions→Stop」とクリックして、web02 もSTOPさせてしまいます。



・ロードバランサーはweb02の停止を認識する?
elb23
「Load Balancers → test-lb → Instances」をクリックして、ロードバランサーが web02 の停止(STOP)を認識しているかどうか確認します。
↑の画面では、期待通り Out of Service になっていますね。

ちなみに、WEBサーバが2台しか存在しないのに、その2台両方ともが Out of Service になってしまったので、Availability Zones で ap-northeast-1a の Healty? 項目が No となっています。これは期待通りの反応です。




・WEBサーバが存在しない状態でhttpリクエストを投げてみる
ローカルPCからコマンドラインからロードバランサーに対して http リクエストを投げてみます。

$ curl -v 'http://dualstack.test-lb-2062688374.ap-northeast-1.elb.amazonaws.com/ec2meta.php/latest/meta-data/public-hostname'
* Connected to ec2-54-248-79-114.ap-northeast-1.compute.amazonaws.com (54.248.79.114) port 80
> GET /ec2meta.php/latest/meta-data/public-hostname HTTP/1.1
User-Agent: curl/7.9.5 (i386-redhat-linux-gnu) libcurl 7.9.5 (OpenSSL 0.9.6b) (ipv6 enabled)
Host: dualstack.test-lb-2062688374.ap-northeast-1.elb.amazonaws.com
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*

* Connection #0 left intact
* Closing connection #0

※ホスト名は、自分のロードバランサーのものと置き換えてください。

ロードバランサーらしきものには接続しますが、そこから先は 応答がありませんね...。

こういう状態になったときのための定型文「ただいま込み合っております」とかの表示をさせたいけど、方法が分からないので今回は無視しておきます。




・WEBサーバを両方とも再起動する
elb24
STOP状態にしてあるWEBサーバを、両方とも START 状態に戻します。
「INstances→webb01/web02を両方チェック→Actionsボタン→Start」で、両方のEC2サーバを同時に START 状態にできます。



elb25
確認画面が出ますが、特に気になることもないので Yes, Start で。



・ロードバランサーは両WEB サーバを正常動作中として認識する?
elb26
「Load Balancers → test-lb → Instances」をクリックして、ロードバランサーが 両方webサーバ再起動を認識しているか確認しますが……認識してませんね。なぜ???



・ロードバランサーのヘルスチェック設定確認
elb27
「Load Balancers → test-lb → Health Check」とクリックして、ヘルスチェックの設定を確認します。
Healthy Threshold の値が 10 になってますね。Interval が 30sec になっているので、30sec × 10 = 300sec、つまりサーバーが再起動してから5分間はロードバランサーの割当配下に戻らないということですね。
これでは(動作確認が)ツライので設定を見直します。Health Check ページの下部にある「Edit Health Check」をクリックします。



・ヘルスチェックの設定変更
elb28
ダイアログが開くので、Healthy Threshold をデフォルトの10から4に変更しておきます。
これで、復活したサーバーが再度ロードバランサー割当配下に戻るまでの時間が  4 × 30sec = 2分 に短縮されます。これぐらいなら待てるかなーという数値になりました(気に入らなければ interval も含めてもっと小さい数字にしてください)。


elb29
確認のダイアログが出ますが、特に気になることもないので Close (OK)で。


・ヘルスチェック設定値の再確認
elb30
Healthy Threshold が 4 になっています。それだけ…。



・ロードバランサーは両WEB サーバを正常動作中として認識する?(再)
elb31
二分と設定したので、二分ほど待ちます(実際には 忘れて30分ほど放置しましたが…)。

「Load Balancers → test-lb → Instances」をクリックして、ロードバランサーが 両方webサーバ再起動を認識しているか確認しますが……今回は正常に認識していますね。
どちらも「In Service」となっています。



・両WEBサーバが再認識された状態でロードハランサーにhttpリクエストを投げてみる
まずは小手調べに一回だけローカルPCからリクエストを投げてみます。

$ curl -v 'http://dualstack.test-lb-2062688374.ap-northeast-1.elb.amazonaws.com/ec2meta.php/latest/meta-data/public-hostname'
* Connected to ec2-54-248-79-114.ap-northeast-1.compute.amazonaws.com (54.248.79.114) port 80
> GET /ec2meta.php/latest/meta-data/public-hostname HTTP/1.1
User-Agent: curl/7.9.5 (i386-redhat-linux-gnu) libcurl 7.9.5 (OpenSSL 0.9.6b) (ipv6 enabled)
Host: dualstack.test-lb-2062688374.ap-northeast-1.elb.amazonaws.com
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*

* Connection #0 left intact
* Closing connection #0
ec2-54-248-163-66.ap-northeast-1.compute.amazonaws.com

ちゃんと応答がありますね。
次は、連続でリクエストしてみます。

$ for R in $(seq 1 20) ; do curl 'http://dualstack.test-lb-2062688374.ap-northeast-1.elb.amazonaws.com/ec2meta.php/latest/meta-data/public-hostname'; echo -en "\n" ; done
ec2-54-248-25-192.ap-northeast-1.compute.amazonaws.com
ec2-54-248-163-66.ap-northeast-1.compute.amazonaws.com
ec2-54-248-25-192.ap-northeast-1.compute.amazonaws.com
ec2-54-248-163-66.ap-northeast-1.compute.amazonaws.com
ec2-54-248-25-192.ap-northeast-1.compute.amazonaws.com
ec2-54-248-163-66.ap-northeast-1.compute.amazonaws.com
ec2-54-248-25-192.ap-northeast-1.compute.amazonaws.com
ec2-54-248-163-66.ap-northeast-1.compute.amazonaws.com
ec2-54-248-25-192.ap-northeast-1.compute.amazonaws.com
ec2-54-248-163-66.ap-northeast-1.compute.amazonaws.com
ec2-54-248-25-192.ap-northeast-1.compute.amazonaws.com
ec2-54-248-163-66.ap-northeast-1.compute.amazonaws.com
ec2-54-248-25-192.ap-northeast-1.compute.amazonaws.com
ec2-54-248-163-66.ap-northeast-1.compute.amazonaws.com
ec2-54-248-25-192.ap-northeast-1.compute.amazonaws.com
ec2-54-248-163-66.ap-northeast-1.compute.amazonaws.com
ec2-54-248-25-192.ap-northeast-1.compute.amazonaws.com
ec2-54-248-163-66.ap-northeast-1.compute.amazonaws.com
ec2-54-248-25-192.ap-northeast-1.compute.amazonaws.com
ec2-54-248-163-66.ap-northeast-1.compute.amazonaws.com

連続でリクエストすると、交互にサーバが負荷分散されています。
どちらも期待通りです。

※ホスト名は、自分のロードバランサーのものと置き換えてください。




・ヘルスチェック用のindex.htmlを消してみる
ヘルスチェック用として設定されている /ndex.html のファイルを消去(リネーム)して、ヘルスチェックを失敗させてみましょう。
ここでは web02 側の Ubuntu を操作します。

  cd /var/www
  sudo mv  index.html  index.html_

ロードバランサーの状態を確認してみます。
elb32
index.html を消去してから数分待てば、Out of Service として認識されています。期待通りの挙動です。



・ヘルスチェック用のindex.htmlを復活させる
先ほど消去(リネーム)した /index.html を復元します。web02側の Ubuntu を操作します。

  cd /var/www
  sudo mv  index.html_  index.html

その後、ロードバランサーの画面を見ると、以下のようになっているはずです。
elb33
web02 が In Service 状態に戻っていますね。

EC2インスタンス自体を停止(STOP)させたときは、Out of Service から In Service に復帰するまで 相当待たされましたが、Apache のファイルを消去→復元 しただけだと、2分かからずに In Serviceに復元しているように見えます。気のせいですかね...[謎]



・Apache を停止させてみる
次は、web02 の Apache サービス自体を停止させてみます。

ubuntu@ip-10-150-191-57:/var/www$ sudo service apache2 stop
 * Stopping web server apache2
 ... waiting    ...done.
ubuntu@ip-10-150-191-57:/var/www$

この状態でロードバランサーの Instances 画面を見ると…
elb34
…期待通り(しばらくすれば) Out of Service に変化しています。

次は、web02 の apache を再開させます。

ubuntu@ip-10-150-191-57:/var/www$ sudo service apache2 start
 * Starting web server apache2
   ...done.
ubuntu@ip-10-150-191-57:/var/www$

で、もう一度 AWS Management Console で LoadBalancer を確認してみると…。
Apache を再開させるて(2分経過することなく) すぐに In Service に復帰します。
どういう理由で2分待たずに復帰するのか分からないので、ヘルスチェックのログが見たいなぁ...(どこにあるのか知らないので見られないけど ^^;)



ロードバランサー用ヘルスチェックの動作確認もできたので、今回はここまで。



次回は後始末です。