- Published on
Chaos Engineering 完全解剖 — Netflix Simian Army、LitmusChaos/Chaos Mesh、AWS FIS、Game Day
- Authors

- Name
- Youngju Kim
- @fjvbn20031
はじめに — 「本番サーバーをわざと殺すの?」
Chaos Engineering を初めて聞く人はこう反応する。
「障害だけでも困るのに、なぜわざと起こすのか?」
答え: 障害はどうせ起きる。統制された環境で先に経験するほうが痛みが少ない。 2010 年、Netflix は AWS 移行でこの逆説的な真理を悟り、世界に Chaos Monkey を解き放った。
本稿では:
- なぜ Netflix はサーバーを殺し始めたのか — 誕生背景
- Chaos Engineering の 4 原則
- Simian Army — Chaos Monkey から Chaos Kong まで
- LitmusChaos / Chaos Mesh — Kubernetes のカオスツール
- AWS Fault Injection Simulator
- Game Day の設計と実行
- Observability とカオスの結合
- Blameless Postmortem — 文化の柱
- 実戦レシピ 10 個
- 成熟度モデル
1. 誕生背景 — 2010 年 Netflix の選択
問題: モノリスからクラウドへ
Netflix は 2008 年の DC 障害で DVD 配送が 3 日停止。結論: 「自社 DC では無理、クラウドへ」。AWS 移行で気づいたこと:
- 個別インスタンスの信頼性は低い (コモディティ VM)
- ネットワークは常に分断しうる (AZ/リージョン間)
- 依存サービスは常にどこかで失敗している
選択肢:
- 完璧なコードを書く (不可能)
- 失敗を前提に設計する (現実的)
Chaos Monkey の誕生 (2010)
シンプルなツール: AWS でランダムに EC2 を終了。内部反発は激しかった。「正気じゃない」。しかしエンジニアが自サービスを 1 インスタンス死んでも生き残る よう設計し始めた。結果:
- 再起動に耐えるアーキテクチャ
- ローリング更新の常態化
- 障害がニュースではなく日常に
2012 年 OSS 化。Chaos Engineering という名称が世に出る。
2. 4 つの原則
principlesofchaos.org が公式化:
1. Steady State Hypothesis を定義せよ
健全時の測定可能な指標 が必要:
- 秒間リクエスト数
- P99 レイテンシ
- エラー率
- ビジネス指標 (決済成功率)
Netflix の「Starts Per Second (SPS)」が有名。
2. 実世界イベントを多様化せよ
現実に起きる事象を注入:
- インスタンスダウン
- ネットワーク遅延/分断
- DNS 失敗
- 依存サービスのタイムアウト
- リージョン障害
- ディスク満杯
- 時計のずれ
コードバグより 環境イベント に集中。
3. 本番で実験せよ
Staging は本番ではない。トラフィックパターン、データ量、サードパーティ依存がすべて異なる。段階的に — 10 % から。しかし最終的には本番で。
4. 自動化し、継続せよ
一度きりでは意味がない。CI/CD のように カオスもパイプライン に。
3. Simian Army — Netflix の全体構成
Chaos Monkey (2010)
ランダム EC2 終了。業務時間内のみ。
Latency Monkey (2012)
サービス間通信に遅延を注入。
Conformity Monkey
標準外インスタンスを終了 (旧 AMI、誤ったタグなど)。
Doctor Monkey
異常インスタンス (CPU 100 %、無応答) を検知・対処。
Janitor Monkey
未使用リソース (孤立 EBS、未使用 IP) を整理。
Security Monkey
誤った IAM/セキュリティグループを自動検知。
Chaos Gorilla (2011)
AZ 1 つ全体 をダウンさせる。
Chaos Kong (2013)
AWS リージョン 1 つ全体 をダウン。2016 年の実障害でも Netflix は耐えた。
FIT (Failure Injection Testing)
特定サービス・ユーザー・リクエストのみにピンポイントで障害注入。
4. Kubernetes 時代 — LitmusChaos vs Chaos Mesh
LitmusChaos (CNCF Graduated 2024)
- CNCF 卒業プロジェクト
- Kubernetes ネイティブ (CRD ベース)
- ChaosHub — 数十種の既製実験
- GitOps 親和的
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: pod-delete-chaos
spec:
appinfo:
appns: default
applabel: app=nginx
experiments:
- name: pod-delete
spec:
components:
env:
- name: TOTAL_CHAOS_DURATION
value: "30"
- name: CHAOS_INTERVAL
value: "10"
実験種別: Pod delete、container kill、network loss/latency/corruption、CPU/memory/IO stress、node drain、AWS/Azure/GCP 操作。
Chaos Mesh (CNCF Incubating)
- PingCAP (TiDB 社) 製
- 優れた UI ダッシュボード
- 強力な スケジューリング (cron ベース反復)
- ワークフロー 対応
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: delay-example
spec:
action: delay
mode: one
selector:
namespaces:
- default
labelSelectors:
app: nginx
delay:
latency: "100ms"
correlation: "25"
jitter: "10ms"
duration: "5m"
比較
| 観点 | LitmusChaos | Chaos Mesh |
|---|---|---|
| 成熟度 | CNCF Graduated | CNCF Incubating |
| UI | 良い | 優秀 |
| 実験数 | ChaosHub 50+ | 内蔵 30+ |
| GitOps | 強い | 中 |
| スケジューリング | 基本 cron | 高度なワークフロー |
| 学習曲線 | 中 | 低 |
選択ガイド:
- すぐ始めたい → Chaos Mesh
- エンタープライズ + GitOps → LitmusChaos
5. AWS Fault Injection Simulator (FIS)
AWS 公式カオスサービス (2021 GA)。
主な機能
- EC2 stop/terminate
- EBS volume detach
- ネットワーク撹乱 (latency、packet loss)
- RDS フェイルオーバー
- CloudWatch アラーム による自動中止
- IAM による安全装置
リージョン停止実験 (慎重に)
FIS Template
├── Action: aws:network:disrupt-connectivity
├── Target: us-east-1 の特定サブネット
├── Stop Condition: CloudWatch アラーム「ビジネス指標低下」
└── IAM Role: 制限された権限
Netflix の Chaos Kong を AWS が公式提供 するイメージ。
Azure Chaos Studio / GCP
- Azure Chaos Studio: 2021 リリース、AKS 連携
- GCP: 公式製品なし、Chaos Mesh 推奨
6. Game Day — 組織的災害訓練
なぜ Game Day か
自動カオスが「技術検証」なら、Game Day は「組織検証」。検証対象:
- 誰が対応するか (on-call rotation)
- 実用的な Runbook はどれか
- Slack/PagerDuty 通知は機能するか
- コミュニケーションの遅延箇所
- エスカレーションは機能するか
設計テンプレート
- 目標設定 — 例: 「us-east-1 停止時に 15 分以内に us-west-2 へ復旧」
- 参加者 — SRE、Backend、DBA、Frontend、PM
- シナリオ — 「10:00 RDS プライマリ フェイルオーバー、10:05 書き込み +10 %、10:10 キャッシュ半分再起動」
- 実行 — 観察者と実行者を分離、タイムライン実況
- 振り返り — うまくいった点、驚いた点、更新すべき Runbook、必要な自動化
実戦 Tips
- 初回は低リスクで — 平日午後、トラフィック低い時間帯
- チャットチャンネルを常時オープン
- Time-boxing — 1 時間で復旧しなければ中止
- Blast Radius 制御 — 全体の 1〜5 %
7. Observability とカオスの結合
Chaos without Observability = Guessing
実験中に見るもの:
- Steady State 指標
- 依存サービスへのエラー伝播
- Cascading Failure の兆候
観測性 3 本柱 — Metrics / Logs / Traces。
Canary + Chaos パターン
- 10 % カナリアにデプロイ
- カナリアのみにカオス注入
- 正しくフェイルするかを検証
- 合格 → 全体展開
Auto-Abort
stopConditions:
- source: cloudwatch
alarm: checkout-success-rate-below-95
8. Blameless Postmortem — カオス文化の柱
なぜ「非難なし」か
個人を非難すると:
- 障害が隠蔽される
- 学習が止まる
- 心理的安全性が崩れる
「誰が悪いか」ではなく 「システムがなぜ失敗を許したか」 に集中。
テンプレート
- 影響 — ユーザー数、時間、金銭的影響
- タイムライン — 分単位
- 根本原因 — Five Whys
- よかった点 — 検知速度、チームワーク
- 悪かった点 — 通知漏れ、Runbook 不備
- アクションアイテム — 担当者と期限
Five Whys 例
問題: 決済が 15 分失敗
- なぜ? → 決済サービスが無応答
- なぜ? → DB コネクションプール枯渇
- なぜ? → インデックスなしのクエリ
- なぜ? → 直近のデプロイで追加したがインデックス漏れ
- なぜ? → PR レビュー チェックリストに「インデックス確認」がない
→ アクション: PR テンプレートに追加。根本原因は「開発者のミス」ではなく 「プロセスの欠落」 に帰結。
Just Culture
Blameless ≠ 無責任。故意の無視・繰り返しの不注意には処置。John Allspaw (Etsy) の Just Culture フレームワーク参照推奨。
9. 実戦カオスレシピ 10 個
1. Pod ランダム削除
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
spec:
action: pod-kill
mode: random-max-percent
value: "25"
selector:
namespaces: [production]
labelSelectors: { tier: backend }
scheduler:
cron: "0 */6 * * *"
検証: readinessProbe、graceful termination、PodDisruptionBudget。
2. CPU ストレス
検証: HPA のスケールアウト、Throttling 対応。
3. ネットワーク遅延
networkChaos:
action: delay
delay: { latency: "500ms" }
検証: タイムアウト、サーキットブレーカー。
4. DNS 失敗
検証: DNS キャッシュ方針、復旧後の再接続。
5. Disk Full
dd if=/dev/zero of=/tmp/fill bs=1M count=10000
検証: ログローテーション、ディスクアラーム。
6. 依存サービス 5xx
Envoy fault injection:
fault:
abort:
percentage: 50
httpStatus: 503
検証: リトライポリシー、フォールバック実装。
7. DB フェイルオーバー
検証: 接続プール再接続、クライアント側 retry。
8. Region/AZ 停止
AWS FIS でサブネット分断。検証: マルチ AZ 配置、自動フェイルオーバー。
9. Clock Skew
NTP 停止、時間操作。検証: JWT 検証、イベントタイムスタンプ、TLS 証明書。
10. Traffic Surge
k6/Locust で想定の 3 倍。検証: Rate limiting、HPA、CDN ヒット率。
10. カオス成熟度モデル
Level 1 — Chaos-curious
興味はあるがツール未導入。事後対応中心。非難ありのポストモーテム。
Level 2 — Staging Chaos
Staging で散発的に実験。Runbook 存在。On-call ローテーション。
Level 3 — Production Chaos
本番で統制された実験。ビジネス指標の Steady State。四半期 Game Day。
Level 4 — Continuous Chaos
CI/CD 統合。Blast Radius 自動拡大。自動中止 + Observability。
Level 5 — Engineering Culture
すべての PR が「このカオスシナリオは?」を考慮。Blameless が自然。失敗は学習機会。
Netflix、Google、Amazon は Level 5。多くは 1〜2。段階的に登ろう。
11. カオスが暴くアンチパターン
- Hidden Dependency — 「あのサービス死なないよ」→ 実験で死ぬ
- Cascading Failures — A→B 依存、B 落ち → A リトライ爆発 → C 巻き込み
- Single Point of Failure — 単一 DB、LB、DNS
- Inadequate Timeouts — 30 秒待ちの UX 苦痛
- Incomplete Retries — バックオフなしの再試行で負荷増幅
12. 規制環境 (金融・医療・政府)
「うちは規制が厳しくて本番カオスできない」。
アプローチ 1: Regulatory Sandboxing
多くの規制 (GDPR、PCI-DSS、HIPAA) は 本番ミラー環境 でのテストを許容。実データをマスクしてカオス適用。
アプローチ 2: 最小 Blast Radius
0.1 % から。内部ユーザーのみ。監査ログ徹底。
アプローチ 3: Game Day のみ本番で
年 1〜2 回、事前承認、事後報告。
アプローチ 4: 実障害をカオスとして記録
構造化された学習 — すでにカオス実施中。
13. 実戦チェックリスト 12 項目
- Steady State を先に定義 (ビジネス指標ベース)
- Staging から開始、次に本番 10 %
- Blast Radius 明示
- Stop Condition 必須
- Observability 先行
- Runbook と連携
- PDB / preStop hooks
- On-call に事前告知
- 結果のドキュメント化
- Blameless Postmortem 文化
- Game Day 定期化 (四半期)
- 経営層のスポンサーシップ
次回予告 — Feature Flag と Progressive Delivery
カオスが本番で 障害を探索 するなら、Feature Flag は本番で 新機能を探索 する。次回:
- Feature Flag の歴史 — Facebook Dark Launch から LaunchDarkly へ
- フラグ分類 — release、experiment、ops、permission
- Progressive Delivery — Canary → Rolling → Blue/Green
- A/B Testing との違い
- Trunk-based Development
- フラグ負債管理
- Unleash、LaunchDarkly、GrowthBook、Flagsmith
- OpenFeature 標準化
- 実戦ロールアウト戦略
「デプロイとリリースを分離せよ。コードはすでにそこにある、機能はまだオンになっていない — これが現代ソフトウェアの基本姿勢だ。」