AWS Fault Injection Simulator でカオスエンジニアリングの実験を始めてみよう !
Author : 金森 政雄
こんにちは ! ソリューションアーキテクトの金森政雄です。
この投稿では、AWS Fault Injection Simulator (AWS FIS )を使って、カオスエンジニアリングの実験をしていく方法をご紹介したいと思います。カオスエンジニアリングの基本的な考え方と AWS FIS の概要については、こちらの記事 をご覧ください。
今回は、下記の 2 つの実験を試しながら、AWS FIS の基本的な使い方を学びましょう
- Auto Scaling グループ で起動されている 2 台の EC2 インスタンスのうち、1 台を停止し、停止されたインスタンスが自動的に復旧することを確認します。
- 指定した EC2 インスタンスの CPU に負荷をかけ、CPU 利用率が 100% になることを確認します。
<前提条件>
- AWS アカウントを持っていること。 AWS アカウントがない方は こちら の手順に従って、作成してください(※)。
- AWS にログインした際に、AWS FIS、Amazon EC2、AWS Auto Scaling、AWS Systems Manager、AWS IAM を操作できる権限を持っていること (ハンズオンを円滑に進めるために、AdministratorAccess の IAM ポリシーがセットされた IAM ユーザー / ロールを利用することをお勧めします)
- AWS FIS が利用できるリージョンを利用してください。現在利用できるリージョンは こちら のサービスエンドポイントを参照してください。
- マネジメントコンソールは日本語で設定されていることを前提として手順を記載します。
※AWS アカウントを作成し、IAM の基本的な設定をしていく手順については、「AWS Hands-on for Beginners ハンズオンはじめの一歩: AWS アカウントの作り方 & IAM 基本のキ」を参考にしていただくことをお勧めします。
目次
1. 事前準備
1-1. AWS マネジメントコンソールにログインする
1-2. 実験の対象になる EC2 インスタンスを起動する
1-3. AWS FIS が実験に利用するIAM ロールを作成する
2-1. EC2 インスタンスを停止するための実験テンプレートを作成する
2-2. EC2 インスタンスを停止する実験を行う
2-3. 実験の結果を確認する
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »
毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。
1. 事前準備
1-1. AWS マネジメントコンソールにログインする
※この手順は一番簡単なメールアドレスとパスワードでログインできる設定で記載しています。MFA を有効 にしていたり、AWS Single Sign On を利用している場合はその手順に従ってください。(パスワードだけの認証を利用されている場合、ぜひ MFA の設定 をご検討ください)
AWS マネジメントコンソール にアクセスします。
IAM ユーザーを選択し、アカウント ID かエイリアスを入力し次へをクリックします。
1-2. 実験の対象になる EC2 インスタンスを起動する
今回の実験の対象となる、EC2 インスタンスを起動します。今回は、Auto Scaling グループを利用して、EC2 インスタンスを起動します。こちらのドキュメント のチュートリアルに従って、Auto Scaling グループを作成し、EC2 インスタンス を起動してください。
上記の手順で Auto Scaling グループを作成すると、1 台の EC2 インスタンスが作成されるはずです。
今回の最初の実験では、2 台のインスタンスが起動している状況を対象とするため、Auto Scaling グループの設定を変更し、EC2 インスタンスを2台起動するように変更します。
EC2 のコンソール を開いてください。
左側のナビゲーションパネルを下までスクロールし、Auto Scaling グループを選択します。
インスタンス管理タブをクリックし、EC2 が 2 台起動し、ライフサイクルが InService になることを確認します。
(ステータスを確認する際は右上の更新アイコンをクリックして画面を更新してください)
これで、実験対象の EC2 インスタンスが起動できました。
1-3. AWS FIS が実験に利用する IAM ロールを作成する
ロールの作成画面で AWS サービス → EC2 を選択して次のステップ: アクセス権限ボタンを押します。
(2021 年 11 月 2 日現在、マネジメントコンソールから信頼されたエンティティとして、AWS FIS を選択することはできないため、一時的に EC2 を設定します。この設定は後のステップで変更します。)
Attach アクセス権限ポリシー の画面で、AmazonEC2FullAccess、AmazonSSMFullAccess の 2 つのポリシーを選択して次のステップ: タグボタンをクリックします。
(本来、最小権限の法則にしたがって権限を設定すべきですが、このワークショップでは簡単のために広めの権限を設定しています。実際の環境に適用する際は、実験で必要な最小の権限を設計しテンプレートごとに適切なポリシーを持った IAM ロールを設定することを推奨します)
信頼関係の編集ページに表示されるポリシードキュメントの “Service” の値を “ec2.amazonaws.com” から ”fis.amazonaws.com” に変更します。
編集後のポリシードキュメントは下記のようになります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "fis.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
2. 実験 1 : EC2 インスタンスを停止する
2-1. EC2 インスタンスを停止するための実験テンプレートを作成する
実験テンプレートを作成画面で、下記を入力していきます。
- 説明 :「ASG 内のインスタンスを半分停止します。」
(この実験で何をするかを説明します。必須項目です) - 名前 - オプション - : FISHandson-Terminate-Instances
(ここに設定された値が Name タグに設定され、一覧画面の Name 列 で確認できます。オプションですが、管理しやすさのために設定することをお勧めします) - IAM ロール : 事前準備で作成した AWSFISHandsonRole
(実験の実行時にAWS FIS が利用するIAM ロールを設定します)
「新しいアクション」 パネルが表示されるので下記を設定して保存ボタンをクリックします。
- 名前 : Terminate-Instances
- アクションタイプ : aws:ec2:terminate-instances
- ターゲット : Instances-Target-1 が自動的に設定されます。
- この項目はアクションタイプを設定すると表示され、自動的に値が設定されます。この後の手順でターゲットの設定をしていきます。 - その他の項目 : デフォルトのまま
「ターゲットを編集」ダイアログが表示されるので、下記を設定して、保存ボタンをクリックします。
- 名前 : ASG-Instances-50Percent
- この項目は変更しなくても問題ありませんがわかりやすい名前をつけることを推奨します。 - リソースタイプ : aws:ec2:instance
- (デフォルト値のままです) - ターゲットメソッド : リソースタグとフィルターを選択
- 選択モード : ドロップダウンリストからパーセントを選択
- パーセンテージ(%) が表示されるので、50 と入力
- パーセンテージ(%) が表示されるので、50 と入力
- 新しいタグを追加 : ボタンをクリックし、表示される下記の項目に下記の値を設定します。
- キー : aws:autoscaling:groupName
- 値 - オプション に my-first-asg
実際の実験では停止条件を設定することを推奨しますが、今回は AWS FIS の基本的な動作を学ぶことが目的のため、割愛します。
停止条件を設定しないでテンプレートを作成するため、警告のダイアログが表示されます。
今回はハンズオンのために停止条件の設定を割愛しておりますので、表示されたダイアログで 作成 と入力して 実験テンプレートを作成ボタンをクリックします。
2-2. EC2 インスタンスを停止する実験を行う
「実験を開始」 画面で新しいタグを追加ボタンをクリックし表示される項目に下記の値をセットし、実験を開始ボタンをクリックします。
- キー : Name
- 値 - オプション : FISHandson-Exp1-run1
※この設定は必須ではありませんが、一覧画面で実験を識別するために設定することをお勧めします。
「実験を開始」ダイアログが表示されます。ここでは誤って実験を開始し、ワークロードに想定外の問題を発生させないための最終確認のため、フォームに 開始 と入力することを求められます。
開始 と入力すると実験を開始ボタンが有効化されるので、クリックして実験を開始します。
2-3. 実験の結果を確認する
EC2 インスタンスのコンソールに移動し、Auto Scaling グループをクリックして、 my-first-asg を選択し、インスタンス管理タブをクリックします。インスタンスの数が、一時的に 2 台になっていることが確認できるはずです (この画面に反映されるまで少しかかりますので、適宜更新ボタンを押して確認してください)。
AWS FIS から指定した Auto Scaligng グループ の EC2 インスタンスを停止する実験の手順を確認しました。なお、希望する容量を 2 と設定しているため、Auto Scaligng グループは自動的に新しい EC2 インスタンスを立ち上げて状態を復帰させようとします。
アクティビティタブのアクティビティ履歴から、インスタンスが停止され、復旧のために新しいインスタンスが起動する流れが確認できます。
3. 実験 2 : 指定したインスタンスの CPU に負荷をかける
実験 1 では EC2 インスタンスの停止を試みましたが、実際の環境では CPU に負荷がかかったり、メモリなどのリソースが逼迫するなど、インスタンスは停止していなくてもアプリケーションが正常に動作しない状況が発生する場合があります。
そのような状況を再現して実験するために、AWS FIS では、AWS Systems Manager と連携して、OS 上でコマンドを実行して実験を行う機能が提供されています。また、実験のために事前に用意された AWS Systems Manager ドキュメント を利用するアクションが用意されています。ここからは、この機能を利用して、指定したインスタンスに CPU 負荷をかける実験を行います。
3-1. 実験対象のインスタンスを決定し、Systems Manager のための IAM ロールを設定する
my-first-asg のインスタンス管理タブを表示し、2台表示されたインスタンスのうち、実験の対象とする EC2 インスタンスを選択して、インスタンス ID をメモし、インスタンス ID のリンクをクリックします。
Attach アクセス権限ポリシー の画面で AmazonSSMFullAccess の 2 つのポリシーを選択して 次のステップ: タグ ボタンをクリックします。
(本来、最小権限の法則にしたがって権限を設定すべきですが、このワークショップでは簡単のために広めの権限を設定しています。実際の環境に適用する際は、実験で必要な最小の権限を設計しテンプレートごとに適切なポリシーを持った IAM ロールを設定することを推奨します)
EC2 の IAM ロールを変更画面を表示していたブラウザのタブに戻り、更新ボタンを押してから、作成した AWSFISHandsonSSMRole を選択して、保存ボタンをクリックします。
3-2. CPU 負荷をかける実験テンプレートの作成
実験テンプレートを作成画面で、下記を入力していきます。
- 説明 : 指定したインスタンスへ CPU 負荷をかけます
- この実験で何をするかを説明します。必須項目です。 - 名前 - オプション - : FISHandson-CPU-stress
- ここに設定された値が Name タグに設定され、一覧画面の Name 列 で確認できます。オプションですが、管理しやすさのために設定することをお勧めします。 - IAM ロール : 事前準備で作成した AWSFISHandsonRole
- 実験の実行時に AWS FIS が利用する IAM ロールを設定します。
画面をスクロールし、「アクション」パネルを表示して、アクションを追加ボタンをクリックします。
「新しいアクション」 パネルが表示されるので下記を設定して保存ボタンをクリックします。
- 名前 : CPU-Stress
- アクションタイプ : aws:ssm:send-command/AWSFIS-Run-CPU-Stress
- ターゲット : Instances-Target-1 が自動的に設定されます。
- この項目はアクションタイプを設定すると表示され、自動的に値が設定されます。この後の手順でターゲットの設定をしていきます。 - documentArn : 使用しているリージョンに合わせて、 arn:aws:ssm:<region>:document/AWSFIS-Run-CPU-Stress が自動的に設定されます。これは、このアクションタイプのために AWS が事前に用意した SSM ドキュメントの ARN です。
- documentParameters : {"DurationSeconds":120}
- duration : 分 に設定して、2 を入力
- その他の項目はデフォルトのまま
「ターゲットを編集」ダイアログが表示されるので、下記を設定して、保存ボタンをクリックします。
- 名前 : InstanceBurnCPUviaSSMbyId
- この項目は変更しなくても問題ありませんがわかりやすい名前をつけることを推奨します。 - リソースタイプ : aws:ec2:instance
- (デフォルト値のままです) - ターゲットメソッド : リソース ID を選択
- リソース ID : 2.1 で選択したインスタンスのインスタンス ID を指定します
- 選択モード : ドロップダウンリストから すべて を選択 (デフォルト値のままです)
停止条件を設定しないでテンプレートを作成するため、警告のダイアログが表示されます。
今回はハンズオンのために停止条件の設定を割愛しておりますので、表示されたダイアログで 作成 と入力して 実験テンプレートを作成 ボタンをクリックします。
3-3. 実験対象のインスタンスに接続し、CPU の利用状況を確認する
CPU に負荷をかける前に、対象のインスタンスにログインし、CPU の利用状況をモニタリングするコマンドを実行します。対象のインスタンスへのログインには、AWS Systems Manager Session Manager を利用します。
EC2 のコンソールに移動し、左のナビゲーションから インスタンス を選択しインスタンス一覧で 2.1 で選択したインスタンスのチェックボックスを選択します。
選択した状態で、接続 ボタンをクリックします。
「インスタンスに接続」画面で 接続 ボタン をクリックします。
(接続ボタンが有効にならない場合、2.1 で設定した IAM ロールが正しく EC2 インスタンスに設定されているかを確認してください。それでも解決しない場合、画面に表示されるメッセージに従って設定を確認してください。設定が反映されるまで少し時間がかかることがあります。)
以下のような画面が表示され、OS にログインできます。
ログインしたら、 top コマンドを実行します。

こちらのように、現在のマシンの CPU 使用率などが表示されます。このタブはそのままにして次の手順に進みます。

3-4. 指定したインスタンスの CPU に負荷をかける実験を行う
AWS FIS のコンソールで、実験テンプレートをクリックし、一覧から、FISHandson-CPU-stress のテンプレートを選択し、アクションドロップダウンから実験を開始をクリックします。
「実験を開始」 画面で新しいタグを追加ボタンをクリックし表示される項目に下記の値をセットし、実験を開始ボタンをクリックします。
- キー : Name
- 値 - オプション : FISHandson-Exp2-run1
※この設定は必須ではありませんが、一覧画面で実験を識別するために設定することをお勧めします
「実験を開始」ダイアログが表示されます。
ここでは誤って実験を開始し、ワークロードに想定外の問題を発生させないための最終確認のため、フォームに開始と入力することを求められます。開始と入力すると実験を開始ボタンが有効化されるので、クリックして実験を開始します。
少しして、更新ボタンをクリックすると、状態が Running になります。この実験は、duration を 2 分に設定しているので、2 分間実験を継続します。その間に、3-3. で接続したインスタンスで何が起きているか確認しましょう
3-5. 実験の結果を確認する
3-3. でインスタンスに接続し、top コマンドを実行したブラウザのタブに戻ります。
CPU 使用率が 100% になっていることが確認できれば成功です。

4. 後片付け
リソースを残してしまうことで、AWS の利用料が残らないように今回利用したリソースを削除していきます。
- EC2 コンソールのナビゲーションパネルから Auto Scaling グループを選択し、my-first-asg を選択して削除ボタンをクリックし、「Auto Scaling グループの削除」ダイアログのフォームに削除と入力し、削除ボタンをクリックします。
- EC2 コンソールのナビゲーションパネルからテンプレートの起動をクリックし、起動テンプレート名 my-template-for-auto-scaling のテンプレートを選択し、アクションドロップダウンから、テンプレートの削除を選択します。「my-template-for-auto-scaling を削除」 ダイアログでフォームに削除と入力し、削除ボタンをクリックします。
- AWS FIS のコンソールで実験テンプレートから、FISHandson-Terminate-Instances のテンプレートを選択し、アクションドロップダウンから、実験テンプレートを削除をクリックし、実験テンプレートを削除ダイアログでフォームに delete と入力し、実験テンプレートを削除ボタンをクリックします。FISHandson-CPU-stress も同じ手順を繰り返します。
- IAM コンソールでロールを選択し、IAM ロール一覧から、AWSFISHandsonRole を選択し、削除ボタンをクリックして表示される 「AWSFISHandsonSSMRole を削除しますか ?」ダイアログのテキスト入力フィールドに AWSFISHandsonRole と入力し、削除ボタンをクリックします。AWSFISHandsonSSMRole も同じ手順を繰り返して削除します。
5. まとめ
このハンズオンでは、EC2 インスタンスの停止や、OS 上で CPU に負荷をかける実験を AWS FIS から行う方法を試してみました。AWS FIS を利用することで、追加の agent のインストールなどを行わずに実験を自動化できることをご理解いただけたかと思います。
実際にカオスエンジニアリングを行う際は、システムの健全性を確認するためのオブザーバビリティの確保や、定常状態の定義や仮説の構築などの実験前のプロセスが重要になりますが、AWS FIS でどのような実験を自動化できるかを知ることで、カオスエンジニアリングの具体的な実施方法を考える一助になれば幸いです。
なお、Amazon EKS を利用した Kubernetes 環境に対して実験を行う方法は こちらの AWS ブログ で紹介しています。ご興味ある方はぜひこちらもお試しください。
筆者プロフィール

金森政雄
アマゾン ウェブ サービス ジャパン合同会社
デベロッパースペシャリスト ソリューションアーキテクト
Web、モバイル向けの自社サービスの開発やクラウドを活用したシステムの請負開発を経験後、パートナーソリューションアーキテクトとして、アマゾン ウェブ サービス ジャパン合同会社に入社。2021 年から DevAx チームとして、開発者の方に向けたイベントやワークショップの提供を中心に活動。
最近の個人的ニュースは家の近くのラーメン屋で、「まさお」という自分の名前と同じメニューがあったこと。
AWS を無料でお試しいただけます