はじめに
AWSのALBにぶら下げる形でECS on Fargateを利用しているのですが、起動するまでに数分の時間を要するアプリケーションを運用しており、ヘルスチェック失敗を防ぐためにヘルスチェックの猶予期間(healthCheckGracePeriodSeconds)を設定していました。
ただ、コンテナのデプロイ時に「監視ツール上ではステータスコードの200番しか記録されていない」「その後のアプリケーション自体も正常に動作している」にもかかわらず「unhealthy
判定がされてしまい、コンテナがエラー終了し、コンテナの再生成が繰り返されてしまう」といった事象に遭遇したため、その調査の過程を記録したものとなります。
前提として、ヘルスチェック猶予期間とは何か
ECSサービス定義のパラメータの一つです。
ヘルスチェック猶予期間を設定することで、その期間はECSタスクに対するヘルスチェックの結果を無視する事が可能となっています。
参考:サービス定義パラメータ > ネットワーク構成 > healthCheckGracePeriodSeconds
何が原因だったのか
結論から述べると「ヘルスチェックの猶予期間が過ぎた時点で、対象のコンテナがunhealthy
の状態になっていた事」が直接の原因でした。
誤解として「ヘルスチェック猶予期間」は「ヘルスチェック自体が行われなくなる」と認識していましたが、この点は誤りで、正しくは「ヘルスチェック自体は行われるが、その結果自体が無視される」という事となります。
実際に、AWS情報センターにも同様の回答としてELB に登録されていて、正常に機能している Amazon ECS タスクが異常とマークされて置き換えられるのはなぜですか?といったドキュメントがあります。
Amazon ECS タスクが猶予期間内に ELB ヘルスチェックに応答しない場合、異常のフラグが付けられます。
確認したこと
実在しないヘルスチェックパスに対してヘルスチェックを実行する(必ずunhealthy
となる)コンテナを、ALBのターゲットグループに登録しました。
結果として「失敗のしきい値(回数)×ヘルスチェックの間隔(秒数)」の経過後は、たとえコンテナがヘルスチェックの猶予期間内でもunhealthy
としてマークされるという事を確認しました。