# 機能設計書 91-ヘルスチェック

## 概要

本ドキュメントは、Fizzyアプリケーションのヘルスチェック機能の設計仕様を定義する。

### 本機能の処理概要

アプリケーションの稼働状態を外部から確認するためのエンドポイントを提供する機能。ロードバランサーやKubernetesなどのオーケストレーションツールからの死活監視に利用される。

**業務上の目的・背景**：本番環境でのアプリケーション運用において、システムが正常に稼働しているかを定期的に確認する必要がある。ヘルスチェックエンドポイントは、外部の監視システムやロードバランサーがアプリケーションの状態を把握し、障害時に適切なフェイルオーバーやアラートを実行するための基盤となる。Rails 7.1以降に標準搭載されたこの機能により、インフラ運用の標準化と簡素化が実現できる。

**機能の利用シーン**：
- ロードバランサーがトラフィックを振り分ける前にサーバーの稼働状態を確認する場合
- Kubernetesのliveness/readiness probeとしてポッドの状態を監視する場合
- 監視システム（Datadog、New Relicなど）がアプリケーションの可用性を追跡する場合
- デプロイ後のスモークテストでアプリケーションの起動完了を確認する場合

**主要な処理内容**：
1. `/up`エンドポイントへのHTTP GETリクエストを受信
2. アプリケーションが正常に応答可能な状態かを判定
3. HTTPステータスコード200（正常）または503（異常）を返却

**関連システム・外部連携**：
- ロードバランサー（AWS ALB、nginx等）からの定期的なヘルスチェックリクエスト
- Kubernetes liveness/readiness probe
- 外部監視サービス（Datadog、CloudWatch、Mackerel等）

**権限による制御**：本エンドポイントは認証・認可なしで誰でもアクセス可能。これはヘルスチェックの性質上、認証前の段階でシステムの稼働状態を確認する必要があるため。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | なし | - | 画面を持たないAPIエンドポイント |

## 機能種別

システム監視・死活監視

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| なし | - | - | パラメータは不要 | - |

### 入力データソース

HTTPリクエスト（GET /up）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| HTTPステータスコード | Integer | 200（正常）または503（異常） |
| レスポンスボディ | HTML | シンプルなHTMLページ |

### 出力先

HTTPレスポンス

## 処理フロー

### 処理シーケンス

```
1. HTTP GETリクエストを /up で受信
   └─ Rails標準のRails::HealthControllerが処理を担当

2. アプリケーションの稼働状態を確認
   └─ Railsプロセスが正常に動作していることを確認

3. HTTPレスポンスを返却
   └─ 正常時: 200 OK
   └─ 異常時: 503 Service Unavailable
```

### フローチャート

```mermaid
flowchart TD
    A[HTTP GET /up] --> B{Railsプロセス稼働中?}
    B -->|Yes| C[200 OK]
    B -->|No| D[503 Service Unavailable]
    C --> E[HTMLレスポンス返却]
    D --> E
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-91-01 | 認証不要 | ヘルスチェックエンドポイントは認証なしでアクセス可能 | 常時 |
| BR-91-02 | 即座に応答 | データベース接続等の複雑なチェックは行わず、即座に応答する | 常時 |

### 計算ロジック

計算ロジックは存在しない。

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| なし | - | - | データベースアクセスは行わない |

### テーブル別操作詳細

データベース操作なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 503 | Service Unavailable | Railsプロセスが異常状態 | プロセスの再起動、ログの確認 |

### リトライ仕様

ヘルスチェックのリトライは呼び出し側（ロードバランサー等）が制御する。

## トランザクション仕様

トランザクションは使用しない。

## パフォーマンス要件

| 要件 | 値 |
|------|-----|
| レスポンス時間 | 100ms以下 |
| 同時リクエスト数 | 制限なし（軽量処理のため） |

## セキュリティ考慮事項

- 認証なしでアクセス可能なエンドポイントであるため、機密情報を含まないこと
- レスポンスボディにはシステムの詳細情報（バージョン、内部構成等）を含めない
- 本番環境ではDNS rebinding保護を考慮（`config.host_authorization`の設定）

## 備考

- Rails 7.1以降で標準搭載された機能
- エンドポイントURLは`/up`（`rails_health_check_path`）
- `config/routes.rb`で`get "up", to: "rails/health#show"`として定義

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: ルーティング定義を理解する

まず、ヘルスチェックエンドポイントがどのように定義されているかを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | routes.rb | `config/routes.rb` | ヘルスチェックエンドポイントの定義を確認 |

**主要処理フロー**:
1. **244行目**: `get "up", to: "rails/health#show", as: :rails_health_check`でエンドポイント定義

**読解のコツ**: Rails 7.1以降では、`rails/health#show`は Rails 標準のコントローラー（`Rails::HealthController`）を指す。このコントローラーはRailsフレームワーク内に組み込まれており、アプリケーション側にソースコードは存在しない。

#### Step 2: 本番環境の設定を理解する

本番環境でのヘルスチェック関連の設定を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | production.rb | `config/environments/production.rb` | DNS rebinding保護の設定を確認 |

**主要処理フロー**:
1. **122-123行目**: `host_authorization`設定（コメントアウト状態）でDNS rebinding保護の除外設定が可能

**読解のコツ**: 本番環境では、外部からのヘルスチェックリクエストがDNS rebinding保護に引っかからないよう設定が必要な場合がある。

### プログラム呼び出し階層図

```
HTTP GET /up
    │
    └─ Rails Router (config/routes.rb)
           │
           └─ Rails::HealthController#show (Rails標準)
                  │
                  └─ 200 OK または 503 Service Unavailable
```

### データフロー図

```
[入力]               [処理]                    [出力]

HTTP GET /up ───▶ Rails::HealthController ───▶ HTTP Response
                   (Rails標準機能)              (200/503)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義（244行目） |
| production.rb | `config/environments/production.rb` | 設定 | 本番環境設定（host_authorization） |
