概要
AWS Fault Injection Service(FIS)は、AWS 上のワークロードに対して制御された障害を注入し、システムの回復力をテストするためのマネージドサービスです。カオスエンジニアリングの手法を AWS 環境で手軽に実践できます。
本番環境で障害が発生した際にシステムが適切に回復できるかは、実際に障害を起こしてみなければわかりません。FIS を使うことで、EC2 インスタンスの停止、ネットワーク遅延の発生、API エラーの注入といった障害シナリオを安全に実行し、システムの弱点を事前に特定できます。
本記事では、FIS の実験テンプレートを作成し、EC2 インスタンスに対する障害注入実験を体験します。

この記事のメリット
- AWS Fault Injection Service の基本概念とカオスエンジニアリングの考え方を理解できる
- 実験テンプレートの構成要素(アクション、ターゲット、停止条件)を把握できる
- マネジメントコンソールから実験テンプレートを作成する手順を習得できる
- EC2 インスタンスの停止という障害シナリオを実際に実行・確認できる
- 停止条件を使った安全な実験の管理方法を体験できる
キャラクター紹介
クラウド資格実践ラボの基礎学習記事では、ルクシーちゃんと代表の土肥が対話形式で AWS 認定試験で必要な知識をハンズオンとともに解説していくブログです。これからこのブログを案内する2人を紹介します。

ルクシーちゃん
クラウド資格に挑戦中の好奇心旺盛なナビゲーター。初学者目線で「これってなんだろう?」と素朴な疑問を投げかけ、知識を引き出していく役どころ。難しい内容も、ルクシーちゃんと一緒なら一歩ずつ理解できると思います!
土肥(とひ)
株式会社Luxyの代表であり同社の元エンジニア。これまでオンプレとAWS環境のインフラを担当。AWS認定資格の学習で得た知識をハンズオンとともに解説するのが得意。直近では新人の教育なども行っており、これから技術を学ぼうという方が納得できるように解説できることに喜びを感じているとのこと。

技術解説
カオスエンジニアリングとは
Luxyちゃんとひさん、「カオスエンジニアリング」って名前からして怖いんですけど、一体どういうものなんですか?
名前はちょっと物騒だけど、やってることはすごく理にかなってるんだ。本番環境に近い条件で、わざと障害を起こしてシステムの回復力を確かめる手法だよ。



わざと障害を起こすんですか…? それって大丈夫なんですか?
むしろ、本番で突然障害が起きて慌てるよりも、事前にテストしておいた方が安全だよね。具体的には、こういうステップで進めるんだ。
- 定常状態の仮説を立てる(例: インスタンスが1台停止してもサービスは継続する)
- 障害を注入して仮説を検証する
- 結果を分析し、システムを改善する



なるほど、「たぶん大丈夫」を「実際に確認した」に変えるための手法なんですね!
そのとおり。障害が発生しても正常に動作し続けるシステムを作るためには、実際に試してみるのが一番確実なんだ。
AWS Fault Injection Service とは



カオスエンジニアリングの考え方はわかりました。それを AWS でやるためのサービスが FIS ということですか?
そうだよ。AWS FIS はカオスエンジニアリングを AWS 環境で手軽に実践できるマネージドサービスなんだ。事前に「実験テンプレート」を定義しておいて、それに基づいて障害を注入して影響を観察する仕組みだよ。



どんな障害を起こせるんですか?
かなり幅広いよ。対応する主な障害シナリオをまとめるとこんな感じだね。
| カテゴリ | 障害シナリオの例 |
|---|---|
| EC2 | インスタンスの停止、再起動、API エラーの注入 |
| ECS | タスクの停止 |
| EKS | Pod の削除、ノードグループのインスタンス終了 |
| RDS | フェイルオーバーの強制実行、インスタンスの再起動 |
| ネットワーク | ネットワーク遅延・パケットロスの注入 |
| Systems Manager | CPU ストレス、メモリストレスの発生 |



EC2 だけじゃなくて、ECS や RDS、ネットワークまでカバーしてるんですね!
そうなんだ。AWS の主要なサービスに対して障害を注入できるから、いろんなパターンの耐障害性テストができるよ。
実験テンプレートの構成要素



さっき出てきた「実験テンプレート」って、具体的にはどういう構成になっているんですか?
実験テンプレートは3つの要素で構成されるんだ。「アクション」「ターゲット」「停止条件」の3つだよ。


| 要素 | 説明 |
|---|---|
| アクション | 実行する障害の種類と設定(例: EC2 インスタンスの停止、持続時間) |
| ターゲット | 障害を注入する対象リソース(タグやリソースIDで指定) |
| 停止条件 | 実験を自動停止する条件(CloudWatch アラームなど) |



「何をするか」「どこにするか」「いつ止めるか」の3つをセットで定義するわけですね!
いい整理だね。この3つを組み合わせることで、安全に制御された障害実験ができるんだ。それぞれもう少し詳しく見ていこう。
アクション



まず「アクション」について教えてください。
アクションは実験で実行する具体的な障害注入操作のことだよ。FIS にはあらかじめたくさんのアクションが用意されていて、すぐに使えるんだ。代表的なものを挙げるとこんな感じだね。
aws:ec2:stop-instances— EC2 インスタンスを停止するaws:ec2:reboot-instances— EC2 インスタンスを再起動するaws:ec2:send-spot-instance-interruptions— スポットインスタンスの中断通知を送信するaws:rds:failover-db-cluster— RDS クラスターのフェイルオーバーを実行する



aws:サービス名:操作 っていう命名規則になっているんですね。わかりやすいです!
そうそう。名前を見れば何をするアクションかすぐわかるようになっているよ。
ターゲット



次に「ターゲット」ですが、障害を注入する対象はどうやって決めるんですか?
ターゲットの指定方法は2種類あるんだ。
- タグによる指定: 特定のタグを持つリソースを対象にする(例:
Environment=test) - リソースIDによる指定: 特定のインスタンスIDを直接指定する



タグで指定すると、複数のリソースがまとめて対象になったりしますか?
なるよ。しかもタグベースで指定する場合、対象リソースの中からランダムにN個を選択する設定も可能なんだ。例えば「このタグが付いたインスタンス10台のうち、ランダムに3台だけ停止する」みたいなこともできるよ。



より実際の障害に近い状況を再現できるわけですね!
停止条件



障害を注入するのはわかりましたが、実験が暴走して本当にシステムが壊れたらどうするんですか?
いい質問だね。そのための「停止条件」だよ。これは実験中にシステムへの影響が想定を超えた場合に、実験を自動停止するための安全装置なんだ。



具体的にはどうやって止めるんですか?
CloudWatch アラームを指定しておいて、アラーム状態になったら実験を自動的に中止する仕組みだよ。例えば「エラー率が5%を超えたら即停止」みたいな条件を設定できるんだ。



ちゃんと安全弁があるんですね。これなら安心して実験できそうです!
そうだね。カオスエンジニアリングは「制御された実験」であることが大事で、停止条件はその制御の要なんだ。
実践
前提条件
- リージョン:
ap-northeast-1(東京) - 障害注入対象の EC2 インスタンスが1台起動済みであること
- 対象インスタンスにタグ
FISTarget=trueが設定されていること
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| FIS 実験テンプレート | stop-ec2-experiment | EC2 インスタンス停止の実験定義 |
| IAM ロール | FISExperimentRole | FIS がリソースを操作するための権限 |


FIS 用の IAM ロールを作成する
- 上部の検索バーに
IAMと入力し、表示された「IAM」を選択します - 左側ナビゲーションの「ロール」を選択し、「ロールを作成」をクリックします
- 「信頼されたエンティティタイプ」で「AWS のサービス」を選択します
- 「ユースケース」のドロップダウンで「FIS」を検索し、「AWSFaultInjectionSimulatorEC2Access」を選択します
- 「次へ」をクリックします
- 「次へ」をクリックします
- ロール名に
FISExperimentRoleと入力します - 「ロールを作成」をクリックします


実験テンプレートを作成する
- 上部の検索バーに
FISと入力し、表示された「AWS FIS」を選択します - 左側ナビゲーションの「実験テンプレート」を選択し、「実験テンプレートを作成」をクリックします
- 以下の項目を入力します
- 説明:
stop-ec2-experiment - 名前:
stop-ec2-experiment - 「次へ」をクリック


ターゲットを設定する
- 「ターゲット」セクションで「編集」をクリックし、
targetEC2を編集します - 以下の項目を設定します
- 名前:
targetEC2 - リソースタイプ:
aws:ec2:instance - ターゲットメソッド: 「リソースタグ」を選択
- リソースタグ:
- キー:
FISTarget - 値:
true - 選択モード:
ALL(タグに一致するすべてのリソースを対象) - 「保存」をクリックします


アクションを追加する
- 「アクション」セクションで「アクションを追加」をクリックします
- 以下の項目を入力します
- アクションタイプ:
aws:ec2:stop-instances - 名前:
StopEC2Instance - ターゲット:
targetEC2を入力 - Duration:
2分 - 「保存」をクリックします


サービスアクセスの設定
- 「既存のIAMロールを使用する」を選択
- IAMロールに冒頭作成した「FISExperimentRole」を選択
- 「次へ」をクリック
- オプションの設定は変更なしで「次へ」をクリック


テンプレートを保存する
- 「停止条件」セクションはデフォルトのままにします(今回は設定なし)
- 「実験テンプレートを作成」をクリックします
- 確認ダイアログが表示されるので、テキストフィールドに
作成と入力して「実験テンプレートを作成」をクリックします


実験を実行する
- 作成した実験テンプレートの詳細画面で「実験を開始」をクリックします
- 確認ダイアログが表示されるので、テキストフィールドに
開始と入力して「実験を開始」をクリックします - 実験のステータスが「initiating」→「running」に変わります


実験結果を確認する
- 実験のステータスが「completed」になるまで待ちます
- 「タイムライン」タブでアクションの実行状況を確認します
- EC2 コンソールに移動し、対象インスタンスのステータスが「停止済み」になっていることを確認します




まとめ
- AWS Fault Injection Service はカオスエンジニアリングを実践するためのマネージドサービス
- 実験テンプレートはアクション、ターゲット、停止条件の3要素で構成される
- ターゲットはタグベースまたはリソースIDで指定でき、柔軟な対象選択が可能
- EC2 インスタンスの停止・再起動、RDS のフェイルオーバーなど多数のアクションが用意されている
- 停止条件を設定することで、実験中にシステムへの影響が想定を超えた場合に自動停止できる
- FIS の利用には専用の IAM ロールが必要であり、実験対象リソースへの適切な権限を付与する









