Fault Injection Service で障害を意図的に注入し、システムの自己修復(レジリエンス)を検証する
AWS Fault Injection Service(FIS)は、AWS リソースに対して意図的に障害を注入(fault injection)し、システムが想定どおりに耐障害・自己修復するかを検証するマネージドなカオスエンジニアリングサービスです。このハンズオンでは、ALB + Auto Scaling 配下の EC2 に対して「インスタンス停止」「CPU ストレス」を注入し、ALB のヘルスチェックと Auto Scaling による自動復旧を実際に観察します。
| 項目 | 内容 |
|---|---|
| 対象サービス | AWS FIS、EC2、Auto Scaling、ALB、CloudWatch、Systems Manager(SSM) |
| 主な学習内容 | FIS 用 IAM ロール・停止条件・実験テンプレート・実験実行・自己修復の観察 |
| 所要時間 | 60〜75 分(環境構築済みの場合) |
| 難易度 | ★★★☆☆(中級者向け) |
| 前提知識 | EC2・ALB・Auto Scaling の基礎知識 |
| 費用目安 | 約 1〜2 USD(EC2 稼働料が中心。FIS は実験アクション時間に対して課金) |
本番に近い環境で「あえて壊す」ことで、障害発生時の挙動を事前に・安全に確認する手法です。FIS は次の特徴で安全性を担保します。
| アクション ID | 内容 |
|---|---|
aws:ec2:stop-instances | EC2 インスタンスを停止(本ハンズオンで使用) |
aws:ec2:terminate-instances | EC2 インスタンスを終了 |
aws:ssm:send-command/AWSFIS-Run-CPU-Stress | SSM 経由で CPU 負荷を注入(本ハンズオンで使用) |
aws:ssm:send-command/AWSFIS-Run-Memory-Stress | メモリ負荷を注入 |
aws:network:disrupt-connectivity | ネットワーク疎通を遮断(AZ 障害シミュレーションなど) |
aws:rds:failover-db-cluster | Aurora クラスターのフェイルオーバー |
FIS の実験が ALB + Auto Scaling 配下の EC2 に障害を注入し、システムが自動復旧する流れを観察します。
unhealthy 判定し、ルーティング対象から除外 → サービス継続AWS CLI・Git・Docker などのインストールと初期設定は 環境セットアップガイド にまとめています。初めての方は先にご確認ください。
AmazonSSMManagedInstanceCore をアタッチ。CPU ストレス注入で必須)Systems Manager → フリートマネージャー(マネージドノード)に対象インスタンスが表示されていれば SSM 管理下です。表示されない場合は IAM ロールへの AmazonSSMManagedInstanceCore アタッチと、SSM Agent の稼働を確認してください。
EC2 インスタンスは稼働中ずっと課金されます。また FIS は実験アクションの実行時間に応じて課金されます。作業リージョンは ap-northeast-1(東京) に固定し、終了後は必ずクリーンアップを実施してください。
FIS が自分に代わって EC2 を停止したり SSM コマンドを送信したりするためのサービスロールを作成します。AWS 管理ポリシーを利用するのが簡単で安全です。
IAM コンソール → ロール → ロールを作成。カスタム信頼ポリシーを選び、以下を貼り付けます。FIS サービス(fis.amazonaws.com)がこのロールを引き受けられるようにします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "fis.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}
次の AWS 管理ポリシーを検索して付与します(FIS のサービスロール用に AWS が用意したものです)。
AWSFaultInjectionSimulatorEC2Access … EC2 の停止/起動などを許可AWSFaultInjectionSimulatorSSMAccess … SSM 経由の CPU/メモリ等のストレス注入を許可管理ポリシーを使わず最小権限にしたい場合は、以下のような内容で十分です(本ハンズオン範囲)。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EC2StopStart",
"Effect": "Allow",
"Action": ["ec2:StopInstances", "ec2:StartInstances", "ec2:DescribeInstances"],
"Resource": "*"
},
{
"Sid": "SSMSendCommand",
"Effect": "Allow",
"Action": ["ssm:SendCommand", "ssm:ListCommands", "ssm:CancelCommand", "ssm:GetCommandInvocation"],
"Resource": "*"
}
]
}
作成後、ロールの ARN(arn:aws:iam::<account-id>:role/handson-fis-role)を後のステップで使用します。
信頼ポリシーの Service は必ず fis.amazonaws.com にしてください。ここを誤ると実験テンプレートでロールを選択しても「実行できない」エラーになります。
実験が暴走した場合の安全ブレーキとして、CPU 使用率が閾値を超えたら実験を自動中断する CloudWatch アラームを作成します。
EC2 コンソール → インスタンス → 対象インスタンスを選択 → アクション → モニタリングとトラブルシューティング → CloudWatch アラームの管理。
「作成」をクリックします。作成されたアラーム ARN を控えておきます。
停止条件は「これ以上は危険」というラインを CloudWatch アラームで表現します。本番に近い環境では、エラー率・レイテンシ・ALB 5xx などビジネス影響に直結するメトリクスをアラームにするのが定石です。
Auto Scaling 配下のインスタンスの一部を停止し、ALB と Auto Scaling が自動で回復するかを見る実験を作成します。
FIS コンソール → 実験テンプレート → 実験テンプレートを作成。説明と名前を入力します。
アクション → アクションを追加。
startInstancesAfterDuration に PT5M を指定すると、5 分後に FIS が自動でインスタンスを起動し直します。学習用にはこれを設定しておくと後片付けが楽です。
自動生成されたターゲットを編集します。Auto Scaling グループのインスタンスをタグで選択し、半分だけ停止します。
選択モードを COUNT(1) や PERCENT(50) にすることで、全台同時停止を避け、サービスを継続させながら回復を観察できます。
handson-fis-role を選択確認画面で create と入力して作成します。
{
"description": "Stop one ASG instance and observe recovery",
"targets": {
"asgInstances": {
"resourceType": "aws:ec2:instance",
"resourceTags": { "aws:autoscaling:groupName": "<あなたの ASG 名>" },
"selectionMode": "PERCENT(50)"
}
},
"actions": {
"stopInstances": {
"actionId": "aws:ec2:stop-instances",
"parameters": { "startInstancesAfterDuration": "PT5M" },
"targets": { "Instances": "asgInstances" }
}
},
"stopConditions": [
{ "source": "aws:cloudwatch:alarm", "value": "arn:aws:cloudwatch:ap-northeast-1:<account-id>:alarm:<alarm-name>" }
],
"roleArn": "arn:aws:iam::<account-id>:role/handson-fis-role",
"tags": {}
}
実験テンプレートの詳細ページ → 実験を開始。確認のため start と入力して開始します。
FIS → 実験 → 該当実験の State を確認します。running → completed と遷移します。
実験中に以下を並行して確認します。
stopping → stopped になるunhealthy → 登録解除されるcompleted で終了し、停止条件アラームは発報しなかった停止でインスタンスが stopped になると、Auto Scaling のヘルスチェック(EC2 ステータス or ALB ヘルスチェック)が異常を検知し、希望台数を満たすよう新しいインスタンスを起動します。startInstancesAfterDuration を設定した場合は、FIS 自身も停止インスタンスを起動し直します。
SSM の事前定義ドキュメント AWSFIS-Run-CPU-Stress を使い、インスタンスに CPU 負荷をかけます。停止条件アラームが効くことも確認します。
アクションを追加:
aws:ec2:instance、リソース ID で対象インスタンスを 1 台選択(選択モード ALL)handson-fis-role確認画面で create と入力して作成します。
実験を開始(start と入力)。CloudWatch → メトリクス、または EC2 のモニタリングタブで対象インスタンスの CPUUtilization が跳ね上がるのを確認します。
ALARM になり実験が自動中断される(安全ブレーキの動作確認)aws:ssm:send-command 系アクションは SSM Agent 経由で実行されます。対象が SSM 管理下でない場合は実験が failed になります(前提条件を再確認)。
| シナリオ | アクション |
|---|---|
| メモリ枯渇 | aws:ssm:send-command/AWSFIS-Run-Memory-Stress |
| ディスク逼迫 | aws:ssm:send-command/AWSFIS-Run-Disk-Fill |
| ネットワーク遅延 | aws:ssm:send-command/AWSFIS-Run-Network-Latency |
| AZ 障害シミュレーション | aws:network:disrupt-connectivity(スコープ availability-zone) |
| RDS フェイルオーバー | aws:rds:failover-db-cluster(Aurora) |
FIS は実際にリソースへ障害を与えます。対象・時間帯・関係者への周知・ロールバック手順を整えたうえで実施してください。本ハンズオンは必ず検証用環境で行ってください。
EC2 が稼働し続けると課金されます。以下を漏れなく削除してください。
handson-stop-instance / handson-cpu-stress を選択 → 削除(確認入力 delete)
handson-fis-role を削除
terminated になった(環境を破棄する場合)| 習得したスキル | 実践内容 |
|---|---|
| FIS サービスロールの作成 | 信頼ポリシー(fis.amazonaws.com)+ EC2/SSM 権限 |
| 停止条件の設計 | CloudWatch アラームを安全ブレーキとして設定 |
| 障害注入(インスタンス停止) | タグ + 割合でターゲットを絞り、自己修復を観察 |
| 障害注入(CPU ストレス) | SSM 事前定義ドキュメントで負荷を注入 |
| レジリエンス検証 | ALB ヘルスチェック + Auto Scaling による自動復旧の確認 |