Elastic Load Balancer(以降はELBと記載)とAmazon Elastic Container Service(以降はECSと記載)を連携させる構成は一般的ではありますが、その際に行われるECSのヘルスチェックについては思ったよりも分かりにくく理解しづらいものがあると感じましたので、今回は解説をしてみようと思います。
ヘルスチェックの種類
ECSに関係するヘルスチェックは大きく二つ存在いたします。
- ELBのヘルスチェック
ターゲットグループから行われるヘルスチェック。
こちらはターゲットグループで指定されたパスに対してアクセスを行い、対象のコンテナが動作しているかを判断するものとなります。
コンテナが外部からアクセスが可能かの判断を行うことができます。 - コンテナのヘルスチェック
コンテナの定義内で行われるヘルスチェック
タスク定義の中で記載する、Docker内でのヘルスチェック。
コンテナの内部からのアクセスであり、サービスがきちんと起動できているかの判断を行うことができます。
簡単に図で示すと以下のようなイメージになります。

ヘルスチェックの状態について
1. ELBのヘルスチェック
大きく以下の3つの状態に分かれます。
- initial … 準備中の状態。この状態の間はタスクは落とされず保留状態のままとなる。
- healthy … ヘルスチェックで応答があり、問題がない状態。
- unhealthy … ヘルスチェックで想定通りの応答がなく、正しい状態ではない
また、ELBのヘルスチェックには「猶予期間」という仕組みがあります。
これはECSの状態を確定させるための時間であり、この時間が経過して初めてECSの状態が上記3つのいずれかに確定いたします。
2. コンテナのヘルスチェック
大きく以下の3つの状態に分かれます。
- UNKNOWN … ヘルスチェックの判断中の状態(HEALTHY/UNHEALTHYのどちらでもない)
- HEALTHY … ヘルスチェックで応答があり正常な状態
- UNHEALTHY … ヘルスチェックで想定通りの応答がなく、正常ではない状態
コンテナのヘルスチェックは「開始期間」という仕組みがあります。
こちらはコンテナが起動してからコンテナのヘルスチェックの判定を開始するまでの時間となります。
開始期間+コンテナヘルスチェックの判定確定までにかかる期間は状態がUNKNOWNとなります。
各ステータスの組み合わせとその際の挙動
ELBのヘルスチェックとコンテナのヘルスチェックはそれぞれ独立しており
この組み合わせによって最終的にECSのサービスに対してAWS側でタスクの再起動などを行います。
| initial | healthy | unhealthy | |
|---|---|---|---|
| UNKNOWN | △ | 〇 ※1 | × |
| HEALTHY | - | 〇 | - ※2 |
| UNHEALTHY | - | × | - ※2 |
〇…ヘルスチェックでOK(問題なくサービスが起動されたと判断された状態)
△…ヘルスチェック待機 or 判断中
×…ヘルスチェックで失敗し、タスク終了→新しいタスク起動を行う状態
-…存在しえないパターン
※1…コンテナのヘルスチェックが存在しない場合はUNKNOWNとして処理され、ELBのヘルスチェックの結果で判断される
※2…ELBのヘルスチェックがunhealthyで確定した時点で、タスク終了と新しいタスク起動が行われる
基本的には以下の挙動となります。
- ELBのヘルスチェック、コンテナのヘルスチェックどちらか一方でもunhealthyまたはUNHEALTHYの場合はタスクが終了され新しいタスクが起動されます
- ELBのヘルスチェックの方が先に判断されます
ここに前述の猶予期間と開始期間が加わることで、以下のような挙動となります。
- 猶予期間はコンテナのヘルスチェックを判断するための期間であり、この期間内であればUNHEALTHYと判断されてもタスクは落とされない
→逆に言いますと、この期間内にHEALTHYにならないと猶予期間終了と同時にタスク終了が行われます - 猶予期間が設定されていたとしても、ELBのタスクチェックでunhealthyとなった時点でタスク終了され新しいタスクが起動されます
- 開始期間はコンテナのヘルスチェックの開始を行うまでの待機時間であり、初期処理に時間がかかるような場合にこの開始時間をうまく利用する
→タスク自体が仮に5xxのステータスを返却していたとしても、開始期間中は無視されるので、開始期間が長すぎる場合はエラーとなっていてもタスクの再起動までに時間がかかることに注意
今回はECSのヘルスチェックについて簡単ですが紹介をいたしました。
ECSのタスクの処理によって、開始期間や猶予期間を適切に設けることで、無駄のないヘルスチェックを実現することができると思います。

