AWS FIS ハンズオン

Fault Injection Service で障害を意図的に注入し、システムの自己修復(レジリエンス)を検証する

AWS FIS EC2 / Auto Scaling / ALB CloudWatch カオスエンジニアリング マネコン操作 所要時間 60〜75 分 v1.0

📋 概要

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 は次の特徴で安全性を担保します。

  • 停止条件(Stop Condition):CloudWatch アラームが発報したら実験を自動中断
  • 明示的なロールバック:実験終了時にアクションを元に戻す(停止したインスタンスは設計次第で復旧)
  • IAM による最小権限:FIS が触れるリソース・アクションを厳密に制御
  • 対象の絞り込み:タグやフィルタ・割合(%)/件数で「一部だけ」壊せる

FIS の主要アクション(抜粋)

アクション ID内容
aws:ec2:stop-instancesEC2 インスタンスを停止(本ハンズオンで使用)
aws:ec2:terminate-instancesEC2 インスタンスを終了
aws:ssm:send-command/AWSFIS-Run-CPU-StressSSM 経由で CPU 負荷を注入(本ハンズオンで使用)
aws:ssm:send-command/AWSFIS-Run-Memory-Stressメモリ負荷を注入
aws:network:disrupt-connectivityネットワーク疎通を遮断(AZ 障害シミュレーションなど)
aws:rds:failover-db-clusterAurora クラスターのフェイルオーバー

🏗️ アーキテクチャ

FIS の実験が ALB + Auto Scaling 配下の EC2 に障害を注入し、システムが自動復旧する流れを観察します。

🧪 AWS FIS 実験(実験テンプレートから起動)
停止条件 CloudWatch アラームで安全に中断
↓ 障害注入(インスタンス停止 / CPU ストレス)
Application Load Balancer (ALB)
ヘルスチェックで異常なターゲットを切り離し
↓ ルーティング
Auto Scaling Group — Amazon EC2 ×2(複数 AZ)
異常インスタンスを検知し代替を自動起動
↓ メトリクス監視
Amazon CloudWatch アラーム
CPU 使用率を監視 → 停止条件として利用
ℹ️ 検証する「自己修復」のポイント
  • ALB:停止したインスタンスをヘルスチェックで unhealthy 判定し、ルーティング対象から除外 → サービス継続
  • Auto Scaling:希望台数を下回ると代替インスタンスを自動起動し、台数を維持
  • 停止条件:想定外に負荷が広がった場合、CloudWatch アラームで実験を即中断

✅ 前提条件

🔧 ツールの事前セットアップ

AWS CLI・Git・Docker などのインストールと初期設定は 環境セットアップガイド にまとめています。初めての方は先にご確認ください。

ℹ️ SSM 管理下かどうかの確認

Systems Manager → フリートマネージャー(マネージドノード)に対象インスタンスが表示されていれば SSM 管理下です。表示されない場合は IAM ロールへの AmazonSSMManagedInstanceCore アタッチと、SSM Agent の稼働を確認してください。

💰 課金とリージョンに注意

EC2 インスタンスは稼働中ずっと課金されます。また FIS は実験アクションの実行時間に応じて課金されます。作業リージョンは ap-northeast-1(東京) に固定し、終了後は必ずクリーンアップを実施してください。

🔐 ステップ 1 ― FIS 用 IAM ロールの作成

FIS が自分に代わって EC2 を停止したり SSM コマンドを送信したりするためのサービスロールを作成します。AWS 管理ポリシーを利用するのが簡単で安全です。

1-1. ロールを作成(信頼されたエンティティ)

IAM コンソール → ロールロールを作成カスタム信頼ポリシーを選び、以下を貼り付けます。FIS サービス(fis.amazonaws.com)がこのロールを引き受けられるようにします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "fis.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}
1-2. 権限ポリシーをアタッチ

次の 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": "*"
    }
  ]
}
1-3. ロール名を付けて作成
ロール名handson-fis-role

作成後、ロールの ARN(arn:aws:iam::<account-id>:role/handson-fis-role)を後のステップで使用します。

⚠️ 信頼エンティティの選択に注意

信頼ポリシーの Service は必ず fis.amazonaws.com にしてください。ここを誤ると実験テンプレートでロールを選択しても「実行できない」エラーになります。

🚨 ステップ 2 ― 停止条件用 CloudWatch アラームの作成

実験が暴走した場合の安全ブレーキとして、CPU 使用率が閾値を超えたら実験を自動中断する CloudWatch アラームを作成します。

2-1. 対象インスタンスのアラームを作成

EC2 コンソール → インスタンス → 対象インスタンスを選択 → アクションモニタリングとトラブルシューティングCloudWatch アラームの管理

アラーム通知(SNS)オフ(トグルを無効)
統計最大値(Maximum)
メトリクスCPU 使用率(CPUUtilization)
しきい値80 %
期間1 分

「作成」をクリックします。作成されたアラーム ARN を控えておきます。

ℹ️ 停止条件の考え方

停止条件は「これ以上は危険」というラインを CloudWatch アラームで表現します。本番に近い環境では、エラー率・レイテンシ・ALB 5xx などビジネス影響に直結するメトリクスをアラームにするのが定石です。

🧪 ステップ 3 ― 実験テンプレート①(EC2 インスタンス停止)

Auto Scaling 配下のインスタンスの一部を停止し、ALB と Auto Scaling が自動で回復するかを見る実験を作成します。

3-1. 実験テンプレートを作成

FIS コンソール → 実験テンプレート実験テンプレートを作成。説明と名前を入力します。

説明Stop one ASG instance and observe recovery
名前handson-stop-instance
3-2. アクションを追加

アクションアクションを追加

名前stopInstances
アクションタイプaws:ec2:stop-instances

startInstancesAfterDurationPT5M を指定すると、5 分後に FIS が自動でインスタンスを起動し直します。学習用にはこれを設定しておくと後片付けが楽です。

3-3. ターゲットを「タグ + 割合」で絞り込む

自動生成されたターゲットを編集します。Auto Scaling グループのインスタンスをタグで選択し、半分だけ停止します。

名前asgInstances
リソースタイプaws:ec2:instance
ターゲット方法リソースタグ・フィルター
タグキー / 値aws:autoscaling:groupName = <あなたの ASG 名>
選択モード割合(PERCENT)50
ℹ️ 「一部だけ壊す」のがコツ

選択モードを COUNT(1)PERCENT(50) にすることで、全台同時停止を避け、サービスを継続させながら回復を観察できます。

3-4. サービスアクセスと停止条件
  • サービスアクセス既存の IAM ロールを使用handson-fis-role を選択
  • 停止条件:ステップ 2 で作成した CloudWatch アラームを選択

確認画面で create と入力して作成します。

参考: 生成される実験テンプレート JSON

{
  "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": {}
}

▶️ ステップ 4 ― 実験を実行して自己修復を観察

4-1. 実験を開始

実験テンプレートの詳細ページ → 実験を開始。確認のため start と入力して開始します。

4-2. 進行状況を追跡

FIS → 実験 → 該当実験の State を確認します。runningcompleted と遷移します。

4-3. 別タブで「回復」をリアルタイム観察

実験中に以下を並行して確認します。

  • EC2 → インスタンス:対象インスタンスが stoppingstopped になる
  • EC2 → ターゲットグループ:停止したインスタンスが unhealthy登録解除される
  • EC2 → Auto Scaling グループ → アクティビティ:ヘルスチェック失敗を検知し代替インスタンスを起動するログが出る
  • ALB の DNS 名にブラウザでアクセス:一部停止中でもページが表示され続ける(サービス継続)
✅ 確認ポイント
  • インスタンスを 1 台停止しても、ALB 経由のアクセスが継続できた
  • Auto Scaling が希望台数を維持するため代替インスタンスを起動した
  • FIS 実験が completed で終了し、停止条件アラームは発報しなかった
ℹ️ Auto Scaling が回復するしくみ

停止でインスタンスが stopped になると、Auto Scaling のヘルスチェック(EC2 ステータス or ALB ヘルスチェック)が異常を検知し、希望台数を満たすよう新しいインスタンスを起動します。startInstancesAfterDuration を設定した場合は、FIS 自身も停止インスタンスを起動し直します。

🔥 ステップ 5 ― 実験テンプレート②(CPU ストレス注入)

SSM の事前定義ドキュメント AWSFIS-Run-CPU-Stress を使い、インスタンスに CPU 負荷をかけます。停止条件アラームが効くことも確認します。

5-1. 新しい実験テンプレートを作成
名前handson-cpu-stress

アクションを追加

名前runCpuStress
アクションタイプaws:ssm:send-command/AWSFIS-Run-CPU-Stress
ドキュメントパラメータ{"DurationSeconds":"120"}
Duration5 分(PT5M)
5-2. ターゲット・ロール・停止条件
  • ターゲットaws:ec2:instance、リソース ID で対象インスタンスを 1 台選択(選択モード ALL)
  • サービスアクセスhandson-fis-role
  • 停止条件:ステップ 2 の CloudWatch アラーム(80%)

確認画面で create と入力して作成します。

5-3. 実行して CPU を観察

実験を開始start と入力)。CloudWatch → メトリクス、または EC2 のモニタリングタブで対象インスタンスの CPUUtilization が跳ね上がるのを確認します。

✅ 確認ポイント
  • SSM 経由で CPU 使用率が上昇した(負荷注入が成功)
  • 80% を超えた場合、停止条件アラームが ALARM になり実験が自動中断される(安全ブレーキの動作確認)
  • 負荷が落ち着くとインスタンスは通常状態に戻る
⚠️ CPU ストレスには SSM 管理が必須

aws:ssm:send-command 系アクションは SSM Agent 経由で実行されます。対象が SSM 管理下でない場合は実験が failed になります(前提条件を再確認)。

🧭 ステップ 6 ― 応用と運用上の注意点

他に試せるアクション

シナリオアクション
メモリ枯渇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)
ℹ️ 安全に実験するためのベストプラクティス
  • 必ず停止条件を設定する(CloudWatch アラーム)。本番では複数アラームを組み合わせる
  • まずは小さく(1 台・短時間・低割合)から始め、徐々に範囲を広げる
  • 実験の仮説を先に立てる(例:「1 台落ちても ALB でサービス継続できるはず」)
  • IAM は最小権限。タグ条件で対象を限定する
  • 本番適用前に検証環境で十分にリハーサルする
⚠️ 本番環境での実施は計画的に

FIS は実際にリソースへ障害を与えます。対象・時間帯・関係者への周知・ロールバック手順を整えたうえで実施してください。本ハンズオンは必ず検証用環境で行ってください。

🧹 クリーンアップ

⚠️ 課金停止のため必ず実施してください

EC2 が稼働し続けると課金されます。以下を漏れなく削除してください。

  1. 実験テンプレートを削除
    FIS → 実験テンプレート → handson-stop-instance / handson-cpu-stress を選択 → 削除(確認入力 delete
  2. CloudWatch アラームを削除
    CloudWatch → アラーム → ステップ 2 で作成したアラームを削除
  3. FIS 用 IAM ロールを削除
    IAM → ロール → handson-fis-role を削除
  4. EC2 / ALB / Auto Scaling を削除
    本ハンズオン用に新規構築した場合は EC2 Auto Scaling ハンズオンのクリーンアップに従って削除してください
✅ クリーンアップ完了の確認
  • FIS → 実験テンプレートが空になった
  • CloudWatch → アラーム一覧から該当アラームが消えた
  • EC2 → インスタンスがすべて terminated になった(環境を破棄する場合)

学習のまとめ

習得したスキル実践内容
FIS サービスロールの作成信頼ポリシー(fis.amazonaws.com)+ EC2/SSM 権限
停止条件の設計CloudWatch アラームを安全ブレーキとして設定
障害注入(インスタンス停止)タグ + 割合でターゲットを絞り、自己修復を観察
障害注入(CPU ストレス)SSM 事前定義ドキュメントで負荷を注入
レジリエンス検証ALB ヘルスチェック + Auto Scaling による自動復旧の確認