ヘルスチェックパターン
サービスの稼働状態を定期的に確認し、異常を検知したらトラフィックを切り離す仕組み
可用性運用
ヘルスチェックパターンとは
ヘルスチェックパターンは、ロードバランサーやオーケストレーターがサービスの稼働状態を定期的に確認し、異常なインスタンスをトラフィックから自動的に切り離す仕組みである。手動での障害検知・対応を排除し、システムの可用性を向上させる。
シャローとディープの使い分け
| 種類 | チェック内容 | 用途 | リスク |
|---|---|---|---|
| シャロー (浅い) | プロセスが生きているか | ALB のターゲットヘルスチェック | 依存先の障害を検知できない |
| ディープ (深い) | DB、キャッシュ、外部 API への疎通 | 監視・アラート | カスケード障害のリスク |
// シャローヘルスチェック: プロセスが生きていれば 200
app.get('/health', (req, res) => {
res.status(200).json({ status: 'ok' });
});
// ディープヘルスチェック: 全依存先の状態を確認
app.get('/health/deep', async (req, res) => {
const checks = {
db: await checkWithTimeout(() => db.query('SELECT 1'), 3000),
cache: await checkWithTimeout(() => redis.ping(), 1000),
s3: await checkWithTimeout(() => s3.headBucket({ Bucket: 'my-bucket' }), 2000),
};
const allHealthy = Object.values(checks).every(c => c.ok);
res.status(allHealthy ? 200 : 503).json(checks);
});
async function checkWithTimeout(fn: () => Promise<any>, ms: number) {
try {
await Promise.race([fn(), new Promise((_, reject) => setTimeout(() => reject('timeout'), ms))]);
return { ok: true };
} catch (err) {
return { ok: false, error: String(err) };
}
}
AWS でのヘルスチェック
ALB ターゲットグループ
ALB はターゲットグループに設定したヘルスチェックパスに定期的にリクエストを送り、異常なターゲットを自動的に切り離す。チェック間隔、連続失敗回数 (即切り離しを防ぐ)、復帰に必要な連続成功回数を設定する。
Route 53 ヘルスチェック
Route 53 のヘルスチェックは、エンドポイントの障害を検知して DNS フェイルオーバーを実行する。プライマリリージョンが障害の場合、セカンダリリージョンに自動切り替えする。
ECS タスクヘルスチェック
ECS はタスク定義にヘルスチェックコマンドを設定でき、異常なタスクを自動的に停止・再起動する。
カスケード障害の防止
ディープヘルスチェックの最大のリスクは、依存先の障害が自サービスの障害に波及するカスケード障害だ。
DB 一時障害 → ディープヘルスチェック失敗 → ALB がインスタンスを切り離し
→ 残りのインスタンスに負荷集中 → さらにヘルスチェック失敗 → 全インスタンス切り離し
対策:
- ALB にはシャローヘルスチェックを使う (プロセスの生存確認のみ)
- ディープヘルスチェックは監視・アラート用に別エンドポイントで提供
- ヘルスチェックにタイムアウトを設定し、依存先の遅延で自身が遅延しない
ヘルスチェックのレスポンス設計
{
"status": "degraded",
"checks": {
"database": { "status": "healthy", "latency_ms": 12 },
"cache": { "status": "unhealthy", "error": "connection refused" },
"disk": { "status": "healthy", "free_gb": 45.2 }
}
}
healthy / degraded / unhealthy の 3 段階で表現する。一部の依存先が障害でも、コア機能が動作する場合は degraded として、トラフィックは受け続ける。
ヘルスチェックの種類
| 種類 | 確認対象 | 用途 |
|---|---|---|
| Shallow | プロセスの応答 | ALB のルーティング |
| Deep | DB, 外部 API の接続 | 監視アラート |
| Liveness | プロセスが生きているか | K8s の再起動判定 |
| Readiness | リクエスト受付可能か | K8s のルーティング |
ヘルスチェックパターンの背景や設計思想は関連書籍に詳しい。