ヘルスチェックとは、ロードバランサーが「このサーバー、ちゃんと生きてる?」と定期的に確認する仕組みだ。


なぜ必要なのか

複数台のサーバーにリクエストを振り分けるロードバランサーは、振り分け先が正常に動いているかを知る必要がある。サーバーがクラッシュしたり、アプリが応答しなくなったりしていても、ロードバランサーが気づかなければユーザーにエラーが届き続ける。

ヘルスチェックはこの問題を解決する。ロードバランサーが定期的にサーバーへリクエストを送り、正常なレスポンスが返ってくるかどうかを確認する。返ってこなければ「このサーバーは死んでいる」と判断して振り分けを止める。

クライアント
    ↓
ロードバランサー(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の失敗しきい値・成功しきい値を適切に設定することで、誤検知を防ぎつつ素早い障害検知ができる

参考文献