はじめに:なぜ Chaos Engineering なのか
現代(げんだい)の分散(ぶんさん)システムは、数十(すうじゅう)から数百(すうひゃく)のマイクロサービス、メッセージキュー、データベース、キャッシュ、ロードバランサーで構成(こうせい)されています。 この複雑(ふくざつ)なシステムにおいて、障害(しょうがい)は「発生するかどうか」ではなく、「いつ発生するか」の問題です。
2012年、NetflixはAWS US-East-1リージョンの障害により、サービス全体が停止する事態を経験しました。 この事件の後、Netflixは「障害を避けるのではなく、障害に強いシステムを作ろう」という哲学のもとChaos Engineeringを誕生(たんじょう)させました。
Chaos Engineeringは単に「ランダムにサーバーを落とすこと」ではありません。 科学的実験方法論に基づいて、システムの脆弱性(ぜいじゃくせい)を事前に発見し、障害発生時にもサービスが正常に動作するようレジリエンス(復元力)を強化(きょうか)する規律(きりつ)です。
この記事で扱う内容
- Chaos Engineeringの核心原則と実験設計
- Netflix Chaos Monkey誕生ストーリーとSimian Army
- 主要ツール比較:Litmus Chaos、Chaos Mesh、Gremlin、AWS FIS
- 障害タイプ別実験:ネットワーク、CPU、メモリ、Pod、ノード、AZ
- Kubernetes環境のカオス実験YAMLサンプル
- ゲームデイ運営ガイド
- 段階的導入戦略(開発 → ステージング → プロダクション)
- NetflixとAmazonのケーススタディ
- CI/CD統合とオブザーバビリティ
1. Chaos Engineering の核心原則
Chaos Engineeringの原則はprincipalesofchaos.orgに定義されています。
1.1 定常状態仮説(Steady State Hypothesis)
すべてのカオス実験は「定常状態」を定義することから始まります。
定常状態の例:
- APIレスポンスタイム p99 < 200ms
- エラー率 < 0.1%
- 注文処理成功率 > 99.9%
- データベースレプリケーション遅延 < 1秒
定常状態仮説とは:「特定の障害を注入しても、システムは定常状態を維持するだろう」という予測です。
1.2 実際の事象を変化させよ(Vary Real-World Events)
実際に発生し得る障害をシミュレートする必要があります。
| 障害タイプ | 実際の事例 | 実験方法 |
|---|---|---|
| サーバーダウン | ハードウェア障害、OOM Kill | Pod/インスタンスの強制終了 |
| ネットワーク遅延 | リージョン間通信遅延 | tcコマンドでレイテンシ注入 |
| ネットワークパーティション | スイッチ障害 | iptablesルールでトラフィック遮断 |
| CPU過負荷 | 突発的なトラフィック急増 | stress-ngでCPU負荷生成 |
| ディスク満杯 | ログ爆発 | ddコマンドでディスクを埋める |
| DNS障害 | DNSサーバーダウン | DNSレスポンス操作 |
| AZ障害 | データセンター障害 | AZ全体のトラフィック遮断 |
1.3 プロダクションで実験せよ(Run Experiments in Production)
真の信頼度(しんらいど)はプロダクション環境でのみ検証できます。 ステージング環境はトラフィックパターン、データ量、インフラ構成がプロダクションと異なるためです。
もちろん、最初からプロダクションで始めるという意味ではありません。 段階的に導入しつつも、最終目標はプロダクションでの実験であるべきです。
1.4 爆発半径を最小化せよ(Minimize Blast Radius)
爆発半径の制御戦略:
1. 小規模から開始:単一インスタンス → グループ → AZ → リージョン
2. 時間制限:実験持続時間の設定(例:5分)
3. 自動中断:主要メトリクスの閾値超過時に実験を即座に中断
4. トラフィック制限:全トラフィックの1%にのみ実験を適用
5. ロールバック計画:実験前にロールバック手順を確認
1.5 自動化せよ(Automate Experiments)
手動の実験はスケールできません。自動化には以下が含まれます:
- 実験のスケジューリング(毎週特定の時間に実行)
- CI/CDパイプラインとの統合
- 自動結果収集とレポート生成
- 中断条件の自動モニタリング
2. Chaos Monkey:Netflix の始まり
2.1 誕生の背景
2010年、Netflixが自社データセンターからAWSへ全面移行する際、根本的な問いに直面しました。
「クラウドインフラではサーバーはいつでも消える可能性がある。我々のシステムはこれに耐えられるのか?」
この問いに答えるために誕生したのがChaos Monkeyです。 Chaos Monkeyはプロダクション環境でランダムにインスタンスを終了させ、すべてのサービスが単一インスタンスの障害に対する耐性を持つよう強制しました。
2.2 Simian Army
Chaos Monkeyの成功後、Netflixはより多様な障害シナリオを実験するためにSimian Armyを作りました。
Simian Army メンバー:
+----------------------+----------------------------------------+
| 名前 | 役割 |
+----------------------+----------------------------------------+
| Chaos Monkey | ランダムなインスタンス終了 |
| Latency Monkey | ネットワーク遅延注入 |
| Conformity Monkey | ベストプラクティス非準拠の検出 |
| Doctor Monkey | 異常インスタンスのヘルスチェック |
| Janitor Monkey | 未使用リソースのクリーンアップ |
| Security Monkey | セキュリティ脆弱性の検出 |
| Chaos Gorilla | AZ全体の障害シミュレーション |
| Chaos Kong | リージョン全体の障害シミュレーション |
+----------------------+----------------------------------------+
2.3 Chaos Monkey 設定例
# Chaos Monkey 設定 (Spinnaker統合)
chaos_monkey:
enabled: true
leashed: false
schedule:
frequency: "weekday"
start_hour: 10
end_hour: 16
timezone: "Asia/Tokyo"
grouping: "cluster"
probability: 1.0
exceptions:
- account: "prod-critical"
region: "ap-northeast-1"
stack: "payment"
3. カオスツールの比較
3.1 主要ツール概要
| ツール | 開発元 | 環境 | ライセンス | 特徴 |
|---|---|---|---|---|
| Litmus Chaos | CNCF | Kubernetes | Apache 2.0 | ChaosHub、GitOpsネイティブ |
| Chaos Mesh | CNCF | Kubernetes | Apache 2.0 | 強力なダッシュボード、TimeChaos |
| Gremlin | Gremlin Inc. | 全環境 | 商用 | SaaSベース、エンタープライズ機能 |
| AWS FIS | AWS | AWS | 従量課金 | AWSサービスネイティブ統合 |
| Azure Chaos Studio | Microsoft | Azure | 従量課金 | Azureサービスネイティブ統合 |
| Steadybit | Steadybit | 全環境 | 商用 | 安全ガードレール重視 |
3.2 Litmus Chaos 詳細
LitmusはCNCF Incubatingプロジェクトで、Kubernetesネイティブのカオスエンジニアリングフレームワークです。
# Litmus Chaos インストール
apiVersion: v1
kind: Namespace
metadata:
name: litmus
---
# LitmusChaos Operator デプロイ
apiVersion: apps/v1
kind: Deployment
metadata:
name: chaos-operator-ce
namespace: litmus
spec:
replicas: 1
selector:
matchLabels:
name: chaos-operator
template:
metadata:
labels:
name: chaos-operator
spec:
serviceAccountName: litmus
containers:
- name: chaos-operator
image: litmuschaos/chaos-operator:3.0.0
env:
- name: CHAOS_RUNNER_IMAGE
value: "litmuschaos/chaos-runner:3.0.0"
- name: WATCH_NAMESPACE
value: ""
Litmusの核心概念はChaosExperiment、ChaosEngine、ChaosResultです。
# Pod Delete 実験定義
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosExperiment
metadata:
name: pod-delete
namespace: litmus
spec:
definition:
scope: Namespaced
permissions:
- apiGroups: [""]
resources: ["pods"]
verbs: ["delete", "list", "get"]
image: "litmuschaos/go-runner:3.0.0"
args:
- -c
- ./experiments -name pod-delete
command:
- /bin/bash
env:
- name: TOTAL_CHAOS_DURATION
value: "30"
- name: CHAOS_INTERVAL
value: "10"
- name: FORCE
value: "false"
3.3 Chaos Mesh 詳細
Chaos Meshは多様な障害タイプをサポートするKubernetesカオスプラットフォームです。
# Chaos Mesh インストール (Helm)
# helm repo add chaos-mesh https://charts.chaos-mesh.org
# helm install chaos-mesh chaos-mesh/chaos-mesh -n chaos-mesh --create-namespace
# ネットワーク遅延実験
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: network-delay-example
namespace: default
spec:
action: delay
mode: all
selector:
namespaces:
- default
labelSelectors:
app: my-service
delay:
latency: "200ms"
jitter: "50ms"
correlation: "50"
duration: "5m"
scheduler:
cron: "@every 1h"
3.4 AWS Fault Injection Service (FIS)
AWS FISはAWSサービスにネイティブ統合されたカオスエンジニアリングサービスです。
{
"description": "EC2インスタンス終了実験",
"targets": {
"myInstances": {
"resourceType": "aws:ec2:instance",
"resourceTags": {
"Environment": "staging",
"ChaosReady": "true"
},
"selectionMode": "COUNT(1)"
}
},
"actions": {
"stopInstances": {
"actionId": "aws:ec2:stop-instances",
"parameters": {},
"targets": {
"Instances": "myInstances"
}
}
},
"stopConditions": [
{
"source": "aws:cloudwatch:alarm",
"value": "arn:aws:cloudwatch:ap-northeast-1:123456789:alarm:HighErrorRate"
}
],
"roleArn": "arn:aws:iam::123456789:role/FISRole"
}
4. 障害タイプ別実験
4.1 ネットワーク障害
ネットワーク障害は分散システムにおいて最も一般的で致命的な問題です。
# Chaos Mesh: ネットワークパーティション
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: network-partition
namespace: default
spec:
action: partition
mode: all
selector:
namespaces:
- default
labelSelectors:
app: order-service
direction: both
target:
selector:
namespaces:
- default
labelSelectors:
app: payment-service
mode: all
duration: "2m"
# Chaos Mesh: パケットロス
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: packet-loss
namespace: default
spec:
action: loss
mode: all
selector:
labelSelectors:
app: api-gateway
loss:
loss: "25"
correlation: "50"
duration: "3m"
# Chaos Mesh: 帯域幅制限
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: bandwidth-limit
namespace: default
spec:
action: bandwidth
mode: all
selector:
labelSelectors:
app: file-service
bandwidth:
rate: "1mbps"
limit: 20971520
buffer: 10000
duration: "5m"
4.2 CPUストレス
# Chaos Mesh: CPUストレス
apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
name: cpu-stress
namespace: default
spec:
mode: one
selector:
labelSelectors:
app: compute-service
stressors:
cpu:
workers: 4
load: 80
duration: "5m"
4.3 メモリプレッシャー
# Chaos Mesh: メモリストレス
apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
name: memory-stress
namespace: default
spec:
mode: one
selector:
labelSelectors:
app: cache-service
stressors:
memory:
workers: 2
size: "512MB"
duration: "3m"
4.4 Pod Kill
# Chaos Mesh: Pod Kill
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: pod-kill-example
namespace: default
spec:
action: pod-kill
mode: fixed
value: "2"
selector:
namespaces:
- default
labelSelectors:
app: web-frontend
gracePeriod: 0
duration: "1m"
# Chaos Mesh: コンテナ Kill
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: container-kill
namespace: default
spec:
action: container-kill
mode: one
selector:
labelSelectors:
app: multi-container-app
containerNames:
- sidecar-proxy
duration: "30s"
4.5 ノードドレイン
# Litmus: ノードドレイン実験
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: node-drain-engine
namespace: litmus
spec:
engineState: active
chaosServiceAccount: litmus-admin
experiments:
- name: node-drain
spec:
components:
env:
- name: TOTAL_CHAOS_DURATION
value: "60"
- name: TARGET_NODE
value: "worker-node-02"
- name: APP_NAMESPACE
value: "default"
- name: APP_LABEL
value: "app=critical-service"
4.6 AZ障害シミュレーション
AZ(Availability Zone)障害は最大の爆発半径を持つ実験です。
# AWS FIS: AZ障害シミュレーション
experiment_template:
description: "AZ-a障害シミュレーション"
targets:
azSubnets:
resourceType: "aws:ec2:subnet"
resourceTags:
AvailabilityZone: "ap-northeast-1a"
selectionMode: "ALL"
actions:
disruptConnectivity:
actionId: "aws:network:disrupt-connectivity"
parameters:
scope: "all"
targets:
Subnets: "azSubnets"
duration: "PT10M"
stopConditions:
- source: "aws:cloudwatch:alarm"
value: "arn:aws:cloudwatch:region:account:alarm:CriticalErrorRate"
4.7 DNS障害
# Chaos Mesh: DNS障害
apiVersion: chaos-mesh.org/v1alpha1
kind: DNSChaos
metadata:
name: dns-failure
namespace: default
spec:
action: error
mode: all
selector:
labelSelectors:
app: external-api-client
patterns:
- "external-api.example.com"
duration: "2m"
5. 実験設計方法論
5.1 体系的な実験設計
カオス実験は科学的実験と同じ構造に従います。
カオス実験設計フレームワーク:
1. 仮説の策定 (Hypothesis)
「決済サービスのPodが1つ終了しても、
注文成功率は99.9%以上を維持するだろう」
2. 定常状態の定義 (Steady State)
- 注文成功率:99.95%
- APIレスポンスタイム p99:180ms
- エラー率:0.05%
3. 実験変数 (Variables)
- 独立変数:Pod 1つの強制終了
- 従属変数:注文成功率、レスポンスタイム、エラー率
4. 爆発半径 (Blast Radius)
- 対象:payment-serviceの3つのPodのうち1つ
- 影響範囲:決済関連リクエストの約33%
5. 中断条件 (Abort Conditions)
- 注文成功率 < 99.0%
- APIレスポンスタイム p99 > 1000ms
- 同時エラー数 > 100/min
6. 実行と観察 (Execute and Observe)
- 実験開始前5分間の基準値収集
- 実験実行(2分間)
- 実験終了後5分間の回復観察
7. 分析と改善 (Analyze and Improve)
- 仮説の検証/反証
- 発見された脆弱性の文書化
- 改善作業チケットの作成
5.2 実験チェックリスト
実験前チェックリスト:
[ ] 仮説が明確に定義されているか?
[ ] 定常状態メトリクスが収集されているか?
[ ] 爆発半径が適切に制限されているか?
[ ] 中断条件が設定されているか?
[ ] ロールバック手順が文書化されているか?
[ ] 関連チームに事前通知したか?
[ ] モニタリングダッシュボードが準備されているか?
[ ] オンコールエンジニアが待機しているか?
5.3 実験結果テンプレート
実験ID:CE-2025-042
日付:2025-04-14
実験者:SREチーム(田中太郎)
仮説:payment-serviceのPodが1つ終了しても
注文成功率99.9%以上を維持する
定常状態ベースライン:
- 注文成功率:99.97%
- p99レスポンスタイム:165ms
- エラー率:0.03%
実験結果:
- 注文成功率:99.12%(仮説反証!)
- p99レスポンスタイム:892ms
- エラー率:0.88%
- 回復時間:45秒
発見事項:
1. Kubernetes readiness probeの間隔が30秒に設定
→終了中のPodにトラフィックが継続して送信
2. Circuit breakerのタイムアウトが長すぎる(10秒)
3. リトライロジックが同じPodにリトライしている
改善アクション:
- [HIGH] readiness probeの間隔を5秒に短縮
- [HIGH] Circuit breakerのタイムアウトを2秒に調整
- [MED] リトライ時に別インスタンスにルーティングする
6. ゲームデイ運営ガイド
6.1 ゲームデイとは
ゲームデイは、チームが集まって計画された障害シナリオを実行し、リアルタイムで対応し、学習するトレーニングセッションです。 軍事訓練の「ウォーゲーム」からインスピレーションを受けており、実際のインシデント発生時の対応能力を向上させます。
6.2 ゲームデイの計画
ゲームデイ計画テンプレート:
1. 目的
- 決済システムのAZ障害レジリエンス検証
- インシデント対応プロセスの訓練
- 新メンバーのオンボーディング
2. スケジュール
- 日程:2025年4月14日(月)
- 時間:14:00 ~ 17:00 JST
- 場所:大会議室 + Zoom
3. 参加者
- ゲームマスター:SREリード(シナリオ注入担当)
- インシデントコマンダー:バックエンドリード
- 対応チーム:バックエンド3名、フロントエンド1名、DBA 1名
- オブザーバー:CTO、PM
4. シナリオ(参加者には非公開)
シナリオ1:payment-service Pod 50%終了
シナリオ2:データベース読み取りレプリカ接続断
シナリオ3:外部決済API応答5秒遅延
5. 成功基準
- 検出時間 < 5分
- 緩和時間 < 15分
- 顧客への影響ゼロ
6. 安全装置
- キルスイッチ:ゲームマスターが即座にすべての実験を中断可能
- ステージング環境で実行(プロダクションではない)
- 実際の顧客トラフィックへの影響なし
6.3 ゲームデイの役割
役割定義:
ゲームマスター (Game Master)
- シナリオ設計と障害注入
- 実験中断の決定権
- ヒント提供(必要時)
- 時間管理
インシデントコマンダー (Incident Commander)
- 対応チームの調整
- 意思決定
- コミュニケーション管理
- エスカレーション判断
対応チーム (Responders)
- 問題の診断と解決
- ランブック参照と実行
- リアルタイムの状態報告
オブザーバー (Observers)
- 対応プロセスの記録
- プロセス改善点のメモ
- 介入しないこと(重要!)
6.4 実行タイムライン
14:00 - 14:15 キックオフブリーフィング
14:15 - 14:20 シナリオ1注入(ゲームマスター)
14:20 - 14:50 対応チームの検出と対応
14:50 - 15:00 シナリオ1レビュー
15:00 - 15:10 休憩
15:10 - 15:15 シナリオ2注入
15:15 - 15:45 対応チームの検出と対応
15:45 - 15:55 シナリオ2レビュー
15:55 - 16:00 シナリオ3注入
16:00 - 16:30 対応チームの検出と対応
16:30 - 16:40 シナリオ3レビュー
16:40 - 17:00 総合振り返り(レトロスペクティブ)
7. 段階的導入戦略
7.1 Phase 1:開発環境(1~2週間)
目標:チームのカオスエンジニアリング能力構築
活動:
1. カオスツールのインストール(Chaos MeshまたはLitmus)
2. 簡単な実験の実行
- 開発環境でのPod Kill
- ネットワーク遅延注入
3. 実験設計方法の教育
4. 最初の実験レポート作成
成功指標:
- チーム全員が実験を1回以上実行
- 実験設計プロセスの文書化完了
7.2 Phase 2:ステージング環境(2~4週間)
目標:実戦に近い環境での体系的実験
活動:
1. ステージングにカオスツールをデプロイ
2. コアサービスを対象とした体系的実験
3. 最初のゲームデイの実行
4. CI/CDパイプラインへの基本実験統合
成功指標:
- 週1回以上の定期実験実行
- ゲームデイ1回完了
- 発見された脆弱性3件以上の改善
7.3 Phase 3:プロダクションカナリア(4~8週間)
目標:プロダクションでの安全な実験開始
活動:
1. プロダクションカオス実験の安全装置構築
2. 小規模プロダクション実験
- 全トラフィックの1%に対して単一Pod Kill
- 非クリティカルサービスへのネットワーク遅延
3. オブザーバビリティダッシュボードの強化
成功指標:
- プロダクション実験5回以上安全に完了
- 顧客への影響ゼロ
- 自動中断メカニズム1回以上検証
7.4 Phase 4:プロダクション正規化(8週間以降)
目標:カオスエンジニアリングを日常的な実践として定着
活動:
1. 自動化された定期的実験実行
2. 新サービスデプロイ時の必須カオステスト
3. 四半期ごとの大規模ゲームデイ
4. AZ/リージョンレベルの障害シミュレーション
5. カオス文化の全社展開
成功指標:
- 月10回以上の自動実験実行
- 四半期ゲームデイの定例化
- MTTR(平均復旧時間)50%削減
- 障害関連インシデント30%削減
8. Netflix ケーススタディ
8.1 Chaos Kong:リージョン退避訓練
NetflixはChaos Kongという実験でAWSリージョン全体の障害をシミュレートします。
Chaos Kong プロセス:
1. 準備段階
- トラフィックルーティングの確認
- 代替リージョンのキャパシティ確認
- モニタリング強化
- 関連チームへの事前通知
2. 実行段階
- US-East-1の全トラフィックをUS-West-2へ転送
- DNSベースのグローバルロードバランシングを活用
- 転送過程でのリアルタイムメトリクス監視
3. 観察項目
- トラフィック転送完了時間
- 代替リージョンのオートスケーリング応答時間
- ユーザー体験への影響
- データの一貫性
4. 復旧段階
- トラフィックを元のリージョンに復元
- データ同期の確認
- 全体結果の分析
8.2 Netflix カオス成熟度モデル
Level 0:カオスなし
- 障害時の手動対応
- 「うちのシステムは大丈夫」という希望
Level 1:基本カオス
- Chaos Monkeyによるインスタンス終了
- 個別サービスのレジリエンス確認
Level 2:体系的カオス
- 多様な障害タイプの実験
- 定期的なゲームデイの実行
- 結果に基づく改善
Level 3:高度なカオス
- AZ障害シミュレーション
- CI/CD統合
- 自動化された実験
Level 4:カオス文化
- リージョン退避訓練(Chaos Kong)
- 全チームがカオス実験を実施
- レジリエンスがアーキテクチャ意思決定の核心基準
9. Amazon ケーススタディ
9.1 Amazon GameDay
Amazonは2004年からGameDayという障害訓練を実施しています。
Amazon GameDay の原則:
1. "Everything fails, all the time" - Werner Vogels
- 障害を通常の運用の一部として扱う
2. 段階的な複雑度の増加
- 単一サービス → サービスチェーン → システム全体
3. 非難のない文化
- 障害対応の失敗を学習機会に変える
4. 文書化
- すべてのGameDay結果を詳細に記録
5. 繰り返し
- 同じシナリオを繰り返して改善を検証
10. CI/CD 統合
10.1 パイプライン統合戦略
# GitHub Actions: カオステスト統合
name: Chaos Testing Pipeline
on:
push:
branches: [main]
schedule:
- cron: '0 2 * * 1-5' # 平日午前2時
jobs:
deploy-staging:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy to Staging
run: kubectl apply -f k8s/staging/
chaos-test:
needs: deploy-staging
runs-on: ubuntu-latest
steps:
- name: Install Litmus
run: |
kubectl apply -f https://litmuschaos.github.io/litmus/3.0.0/litmus-3.0.0.yaml
- name: Run Pod Delete Experiment
run: |
kubectl apply -f chaos/experiments/pod-delete.yaml
sleep 120
kubectl get chaosresult pod-delete-result -o jsonpath='{.status.experimentStatus.verdict}'
- name: Verify System Recovery
run: |
./scripts/verify-steady-state.sh
11. オブザーバビリティとカオス
11.1 モニタリングダッシュボード
カオス実験中に必ず監視すべきメトリクスです。
主要メトリクス(Golden Signals):
1. レイテンシ (Latency)
- p50、p90、p99レスポンスタイム
- サービス間呼び出しレイテンシ
2. トラフィック (Traffic)
- 秒間リクエスト数(RPS)
- トラフィック分布
3. エラー (Errors)
- HTTP 5xx率
- アプリケーションエラー率
- タイムアウト率
4. 飽和度 (Saturation)
- CPU使用率
- メモリ使用率
- ネットワーク帯域幅
- ディスクI/O
11.2 アラート設定
# Prometheus AlertManager ルール
groups:
- name: chaos-safety-alerts
rules:
- alert: ChaosExperimentHighErrorRate
expr: |
sum(rate(http_requests_total{status=~"5.."}[2m]))
/
sum(rate(http_requests_total[2m]))
> 0.05
for: 1m
labels:
severity: critical
team: sre
annotations:
summary: "カオス実験中にエラー率5%超過"
description: "直ちに実験を中断して状態を確認してください"
12. SRE との関係
Chaos EngineeringはSRE(Site Reliability Engineering)の核心的な実践の一つです。
SREとChaos Engineeringの関係:
SREの目標:信頼性が高くスケーラブルなシステムの運用
|
+-- SLO/SLI/SLA定義 → カオス実験の成功基準
|
+-- Error Budget → カオス実験実行の可否を決定
|
+-- インシデント管理 → ゲームデイシナリオのソース
|
+-- ポストモーテム → 新しいカオス実験のアイデア
|
+-- Toil削減 → カオス実験の自動化
13. クイズ
以下のクイズで学んだ内容を確認しましょう。
Q1:Chaos Engineeringの最初のステップは何ですか?
正解:定常状態仮説(Steady State Hypothesis)の策定
すべてのカオス実験は、システムの定常状態を定義し、「この障害を注入しても定常状態を維持するだろう」という仮説を立てることから始まります。仮説なしに障害を注入するのはカオスエンジニアリングではなく、単なる破壊です。
Q2:NetflixのChaos Kongはどのレベルの障害をシミュレートしますか?
正解:AWSリージョン全体の障害
Chaos KongはNetflixの最も極端なカオス実験で、AWSリージョン全体のトラフィックを別のリージョンに転送するリージョン退避(Region Evacuation)をシミュレートします。
Q3:爆発半径(Blast Radius)を最小化するための3つの戦略を説明してください。
正解:
- 小規模から開始:単一インスタンスから始めて、段階的にグループ、AZ、リージョンレベルに拡大します。
- 時間制限:実験の持続時間を明示的に設定して、長期間の影響を防止します。
- 自動中断条件:主要メトリクスが閾値を超えた場合、実験を自動的に中断します。例えば、エラー率が5%を超えたら即座に中断します。
Q4:ゲームデイにおけるゲームマスターの役割は何ですか?
正解:
ゲームマスターはゲームデイの運営者として以下の役割を担います:
- シナリオ設計:事前に障害シナリオを設計(参加者には非公開)
- 障害注入:カオスツールを使用して計画されたタイミングで障害を注入
- 実験中断の決定権:状況が制御不能になった場合、キルスイッチで即座に中断
- ヒント提供:対応チームが行き詰まった場合にヒントを提供
- 時間管理:全体のタイムラインを管理
Q5:Chaos Engineeringの段階的導入の4フェーズを順番に挙げてください。
正解:
- Phase 1:開発環境(1~2週間)- ツールインストール、基礎実験、チーム教育
- Phase 2:ステージング環境(2~4週間)- 体系的実験、初ゲームデイ、CI/CD統合
- Phase 3:プロダクションカナリア(4~8週間)- 小規模プロダクション実験、安全装置構築
- Phase 4:プロダクション正規化(8週間以降)- 自動化定期実験、AZ/リージョン障害シミュレーション
核心は「ゆっくり、安全に、段階的に」範囲を拡大することです。
参考資料
- Principles of Chaos Engineering - principlesofchaos.org
- Chaos Engineering: System Resiliency in Practice - Casey Rosenthal, Nora Jones (O'Reilly)
- Netflix Tech Blog: Chaos Engineering - netflixtechblog.com
- Litmus Chaos Documentation - litmuschaos.io/docs
- Chaos Mesh Documentation - chaos-mesh.org/docs
- AWS Fault Injection Service - AWS公式ドキュメント
- Azure Chaos Studio - Microsoft公式ドキュメント
- Gremlin Documentation - gremlin.com/docs
- Google SRE Book - Chapter 17: Testing for Reliability - sre.google/sre-book
- The Practice of Cloud System Administration - Thomas Limoncelli 他
- Awesome Chaos Engineering - GitHubリポジトリ
- CNCF Chaos Engineering Whitepaper - cncf.io
- Learning Chaos Engineering - Russ Miles (O'Reilly)
- Chaos Engineering Adoption Guide - Gremlin Blog
현재 단락 (1/699)
現代(げんだい)の分散(ぶんさん)システムは、数十(すうじゅう)から数百(すうひゃく)のマイクロサービス、メッセージキュー、データベース、キャッシュ、ロードバランサーで構成(こうせい)されています。