ヘルスチェックとは、ロードバランサーが「このサーバー、ちゃんと生きてる?」と定期的に確認する仕組みだ。
なぜ必要なのか
複数台のサーバーにリクエストを振り分けるロードバランサーは、振り分け先が正常に動いているかを知る必要がある。サーバーがクラッシュしたり、アプリが応答しなくなったりしていても、ロードバランサーが気づかなければユーザーにエラーが届き続ける。
ヘルスチェックはこの問題を解決する。ロードバランサーが定期的にサーバーへリクエストを送り、正常なレスポンスが返ってくるかどうかを確認する。返ってこなければ「このサーバーは死んでいる」と判断して振り分けを止める。
クライアント
↓
ロードバランサー(ALB)
├── サーバーA ← ヘルスチェックOK → 振り分け対象
├── サーバーB ← ヘルスチェックOK → 振り分け対象
└── サーバーC ← ヘルスチェックNG → 振り分けから除外
サーバー側の実装
ヘルスチェックを受け取るサーバー側は、/health のようなエンドポイントを用意して 200 OK を返すだけでいい。
Railsなら数行で書ける:
# config/routes.rb
get '/health', to: proc { [200, {}, ['ok']] }
このエンドポイントはシンプルでいい。「アプリプロセスが起動していて、リクエストを受け付けられる状態か」を確認するのが目的なので、余計な処理は入れない。
DBへの疎通確認を含める場合は注意が必要だ。DBが一時的に重い場合にヘルスチェックが失敗し、正常に動いているアプリサーバーが切り離されてしまう。用途に合わせて判断する。
AWSのALBで設定できる主なパラメータ
| パラメータ | 内容 | 例 |
|---|---|---|
| ヘルスチェック間隔 | チェックの頻度 | 30秒おき |
| タイムアウト | レスポンスを待つ最大時間 | 5秒 |
| 失敗しきい値 | 何回連続失敗でダウン判定 | 2回 |
| 成功しきい値 | 何回連続成功で復旧判定 | 3回 |
失敗しきい値を2回にすれば、一時的なネットワークの揺れで即座に切り離されるのを防げる。1回の失敗ですぐアウトにすると、ネットワークのゆらぎで健全なサーバーが誤って除外されるリスクが上がる。
成功しきい値を3回にすれば、再起動直後の不安定なサーバーが早まって復旧判定されるのを防げる。ある程度安定してから振り分けに戻すことで、ユーザーへの影響を減らせる。
ECSとの組み合わせ
ECS Fargateを使っている場合、ALBのヘルスチェックに加えてECS自体にもヘルスチェックが設定できる。
- ALBのヘルスチェック:外部からのHTTPリクエストでタスクの正常性を確認する
- ECSのヘルスチェック:コンテナ内部でコマンドを実行して確認する
ALBのヘルスチェックが失敗するとタスクが振り分け対象から外れ、ECSのヘルスチェックが失敗するとタスク自体が再起動される。両方設定しておくと、異なるレイヤーの障害に対応できる。
まとめ
- ヘルスチェックは、ロードバランサーがサーバーの死活を定期確認する仕組み
- サーバー側は
/healthエンドポイントを用意して200 OKを返すだけでいい - ALBの失敗しきい値・成功しきい値を適切に設定することで、誤検知を防ぎつつ素早い障害検知ができる