カオスエンジニアリング
本番環境で起こりうる障害を意図的に注入し、システムの耐障害性を検証する手法を学びます。
前提: 負荷テスト と Observability 基礎 を読んでから本ドキュメントを読むと、より理解が深まります。
なぜカオスエンジニアリングが必要か
負荷テストは「どこまで耐えられるか」を測定します。カオスエンジニアリングは「壊れたときにどうなるか」を検証します。
┌───────────────────────────────────────────────────────────────┐
│ 負荷テスト vs カオスエンジニアリング │
├───────────────────────────────────────────────────────────────┤
│ │
│ 負荷テスト: │
│ 「正常な状態で、どこまで耐えられるか?」 │
│ → スループット限界、飽和点、ボトルネック特定 │
│ │
│ カオスエンジニアリング: │
│ 「異常な状態で、正しく振る舞えるか?」 │
│ → 障害時の挙動確認、フォールバック検証、回復性 │
│ │
│ 両方必要。負荷テストが「晴れの日」のテストなら、 │
│ カオスエンジニアリングは「嵐の日」のテスト。 │
│ │
└───────────────────────────────────────────────────────────────┘
IdP/認証基盤は全サービスの入口です。IdPが止まると、連携する全サービスのログイン・API呼び出しが止まります。だからこそ「壊れたときにどうなるか」を事前に知っておく必要があります。
カオスエンジニアリングの原則
- 定常状態の仮説を立てる — まず「正常とは何か」をSLI/SLOで定義する
- 実世界のイベントを注入する — 実際に起こりうる障害を再現する
- 本番に近い環境で実験する — 開発環境では見つからない問題がある
- 爆発半径を最小化する — 影響範囲を限定してから始める
- 自動化して継続的に実行する — 一度きりではなく、回帰的に検証する
障害の分類と注入手法
インフラ障害
| 障害 | 注入手法 | 検証観点 |
|---|---|---|
| Pod/コンテナの強制停止 | kubectl delete pod、Chaos Mesh の PodChaos | 残りのPodで処理継続できるか |
| ノード障害 | ノードのcordon + drain | Pod再配置後にサービス復旧するか |
| デ ィスクI/O遅延 | Chaos Mesh の IOChaos | ログ書き込み遅延がリクエスト処理に影響しないか |
ネットワーク障害
| 障害 | 注入手法 | 検証観点 |
|---|---|---|
| レイテンシ注入 | tc netem delay、Chaos Mesh の NetworkChaos | タイムアウトが適切に効くか |
| パケットロス | tc netem loss | リトライで回復するか、リトライ嵐にならないか |
| DNS障害 | DNS応答の遅延/失敗注入 | キャッシュが機能するか |
| 特定ホストへの接続断 | iptables、NetworkChaos | 外部IdP連携の障害が他機能に波及しないか |
アプリケーション障害
| 障害 | 注入手法 | 検証観点 |
|---|---|---|
| スレッドプール枯渇 | 意図的にスロークエリを注入 | タイムアウトで解放されるか |
| メモリ圧迫 | Stress-ng、コンテナのメモリ制限縮小 | OOM Killer発動後に再起動するか |
| 依存サービスの5xx | モック/プロキシで503を返す | エラーハンドリングが適切か |
データストア障害
| 障害 | 注入手法 | 検証観点 |
|---|---|---|
| DB接続断 | ネットワーク遮断、DBプロセス停止 | 接続プールが回復するか |
| フェイルオーバー発生 | Aurora/RDSの手動フェイルオーバー | 一時エラー後に自動回復するか |
| 接続プール枯渇 | 最大接続数を極端に小さく設定 | 適切なエラーレスポンスを返すか |
IdP固有の実験シナリオ
IdPの特性上、特に重要な4つのシナリオを紹介します。
1. 外部IdP連携の障害
Federation機能(Google、Azure AD等との連携)で外部通信が発生します。
実験:
- 外部IdPのUserInfoエンドポイントに3秒の遅延を注入
- JWKSエンドポイントへの接続を遮断
- 外部IdPが503を返す状態を作る
検証観点:
- タイムアウト設定は適切か(デフォルト無制限になっていないか)
- JWKSのキャッシュは機能するか(接続断でも既存の鍵で検証を継続できるか)
- 外部IdPの障害がパスワードログインなど他の認証方式に波及しないか
2. CIBA通知の障害
CIBAフローではFCM等を通じてデバイスにプッシュ通知を送信します。
実験:
- FCMへの送信を遅延/失敗させる
- Polling中にidp-serverのPodを再起動する
検証観点:
- 通知失敗時にクライアントへ適切なエラーレスポンスを返すか
- Poll/Ping/Pushの各モードで障害時の挙動が正しいか
- auth_req_idの状態が再起動後も保持されるか
3. マルチテナント環境での障害伝播
マルチテナントIdPでは、1テナントの問題が他テナントに影響しないことが重要です。
実験:
- 特定テナントに対して大量リクエストを送る(ノイジーネイバー)
- 特定テナントのDB操作を意図的に遅延させる
検証観点:
- 他テナントのレイテンシ・エラーレートに影響が出ないか
- テナント間のリソース分離は機能しているか