AWSのAuto ScalingとELBの関係

AWSのAuto Scaling機能使ってますか?

Auto ScalingにはHealth Check Grace Periodという設定がありますが、この機能を勘違いしていたので実際の動きとともに見てみましょう。

Health Check Grace PeriodはELBがHealth Checkを開始するまでの時間、そう考えていた時期が僕にもありました。

どうやら動きが少し違うようなので、実際の動きとともに見てみます。

Auto Scaling

Auto Scalingによりインスタンスの起動を行います。Auto Scalingのヒストリーに残っていたログは以下のとおり。

起動開始 07:00:53 起動完了 07:01:57(きっとこれは インスタンスのstateがrunningになったタイミングかと思います)

7:00にスケジューリングしても実際にインスタンスが起動し始めるまでにはタイムラグがあるようです。

インスタンス

次にインスタンスのApacheのログを見てみます。起動したインスタンスはELBにぶら下げるように設定をしています。また、Health Check Grace Periodには300を指定しています。

XX.XX.XX.XX (-) - - [23/Feb/2015:07:04:25 +0900] "GET /healthcheckurl HTTP/1.1" 503 323 "-" "ELB-HealthChecker/1.0" 
XX.XX.XX.XX (-) - - [23/Feb/2015:07:04:40 +0900] "GET /healthcheckurl HTTP/1.1" 503 323 "-" "ELB-HealthChecker/1.0" 
XX.XX.XX.XX (XX.XX.XX.XX) - - [23/Feb/2015:07:05:10 +0900] "GET /healthcheckurl HTTP/1.1" 200 - "-" "ELB-HealthChecker/1.0" 
XX.XX.XX.XX (XX.XX.XX.XX) - - [23/Feb/2015:07:05:25 +0900] "GET /healthcheckurl HTTP/1.1" 200 - "-" "ELB-HealthChecker/1.0" 
XX.XX.XX.XX (XX.XX.XX.XX) - - [23/Feb/2015:07:05:40 +0900] "GET /healthcheckurl HTTP/1.1" 200 - "-" "ELB-HealthChecker/1.0" 
XX.XX.XX.XX (XX.XX.XX.XX) - - [23/Feb/2015:07:04:55 +0900] "GET /healthcheckurl HTTP/1.1" 200 - "-" "ELB-HealthChecker/1.0" 
XX.XX.XX.XX (XX.XX.XX.XX) - - [23/Feb/2015:07:05:55 +0900] "GET /healthcheckurl HTTP/1.1" 200 - "-" "ELB-HealthChecker/1.0" 
XX.XX.XX.XX (XX.XX.XX.XX) - - [23/Feb/2015:07:06:10 +
0900] "GET /healthcheckurl HTTP/1.1" 200 - "-" "ELB-HealthChecker/1.0" 

ELBからのヘルスチェックのアクセスが07:04:25ですでに始まっています。はて300秒(5分)に設定したHealth Check Grace Periodとは何だったのか・・・。

そして 07:05:10 に 200を返すので、ここからInServiceになっているものと思われます。(実際にはHealthy Thresholdの回数やIntervalによって変わります)

Health Check Grace Periodの説明

The length of time that Auto Scaling waits before checking an instance's health status. The grace period begins when an instance comes into service.

とあります。インスタンスがインサービスになってからカウントを始めるようです。このインサービスはインスタンスが起動開始した07:00:53なのか、起動完了した07:01:57なのかそれともHealth Checkが通るようになった07:05:10の辺なのか・・・・。

以下は推測です。

  • どうやらELBに組み込まれた段階でELBからはヘルスチェックのアクセスが発生する。
  • ELB的にはインスタンスがInServiceになったらリクエストをインスタンスに割り振るようになる。
  • Auto Scalingではインスタンスが起動完了してからHealth Check Grace Periodの間はヘルスチェックの可否によってAuto Scaling の新しいアクションが発動するようにはしない。

タイミング的には完全に一致しないみたいなので多少時間が前後しても問題ない作りにしておきましょう。