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 グループを選択します。
クリックすると拡大します
Auto Scaling グループの一覧が表示されるので 上記のチュートリアルで作成した、my-first-asg を選択します
クリックすると拡大します
「グループの詳細」パネルの右上の編集ボタンをクリックします。
クリックすると拡大します
「グループサイズ」ダイアログで、希望する容量 を 2、最大キャパシティを 2 に変更し、更新ボタンをクリックします。
クリックすると拡大します
インスタンス管理タブをクリックし、EC2 が 2 台起動し、ライフサイクルが InService になることを確認します。
(ステータスを確認する際は右上の更新アイコンをクリックして画面を更新してください)
クリックすると拡大します
これで、実験対象の EC2 インスタンスが起動できました。
1-3. AWS FIS が実験に利用する IAM ロールを作成する
AWS マネジメントコンソールの上部にある検索ボックス で “iam” と入力し、表示された IAM をクリックします。
クリックすると拡大します
左側のパネルからロールをクリックします。
クリックすると拡大します
ロールを作成 をクリックします。
クリックすると拡大します
ロールの作成画面で AWS サービス → EC2 を選択して次のステップ: アクセス権限ボタンを押します。
(2021 年 11 月 2 日現在、マネジメントコンソールから信頼されたエンティティとして、AWS FIS を選択することはできないため、一時的に EC2 を設定します。この設定は後のステップで変更します。)
クリックすると拡大します
Attach アクセス権限ポリシー の画面で、AmazonEC2FullAccess、AmazonSSMFullAccess の 2 つのポリシーを選択して次のステップ: タグボタンをクリックします。
(本来、最小権限の法則にしたがって権限を設定すべきですが、このワークショップでは簡単のために広めの権限を設定しています。実際の環境に適用する際は、実験で必要な最小の権限を設計しテンプレートごとに適切なポリシーを持った IAM ロールを設定することを推奨します)
クリックすると拡大します
タグの追加 (オプション) 画面では特に操作は不要です。
次のステップ: 確認 ボタンをクリックします。
クリックすると拡大します
ロール名に AWSFISHandsonRole と入力し、ロールの作成ボタンをクリックします。
クリックすると拡大します
ロールの作成が完了すると、ロール一覧の画面に遷移するので、AWSFIS と入力し、表示される AWSFISHnadosnRole を選択します。
クリックすると拡大します
AWSFISHnadosnRole の概要ページで信頼関係タブを開き、 信頼関係の編集ボタンをクリックします。
クリックすると拡大します
信頼関係の編集ページに表示されるポリシードキュメントの “Service” の値を “ec2.amazonaws.com” から ”fis.amazonaws.com” に変更します。
編集後のポリシードキュメントは下記のようになります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "fis.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
編集後、信頼ポリシーの更新ボタンをクリックして、ポリシーを更新します。
クリックすると拡大します
信頼されたエンティティが IDプロバイダー fis.amazonaws.com になっていることを確認してください。
クリックすると拡大します
2. 実験 1 : EC2 インスタンスを停止する
2-1. EC2 インスタンスを停止するための実験テンプレートを作成する
AWS マネジメントコンソールの上部にある検索ボックス で“fis* と入力し、表示された AWS FIS をクリックします。
クリックすると拡大します
表示された AWS FIS の画面で実験テンプレートを作成をクリックします。
クリックすると拡大します
実験テンプレートを作成画面で、下記を入力していきます。
- 説明 :「ASG 内のインスタンスを半分停止します。」
(この実験で何をするかを説明します。必須項目です) - 名前 - オプション - : FISHandson-Terminate-Instances
(ここに設定された値が Name タグに設定され、一覧画面の Name 列 で確認できます。オプションですが、管理しやすさのために設定することをお勧めします) - IAM ロール : 事前準備で作成した AWSFISHandsonRole
(実験の実行時にAWS FIS が利用するIAM ロールを設定します)
クリックすると拡大します
画面をスクロールし、「アクション」パネルを表示して、アクションを追加ボタンをクリックします。
クリックすると拡大します
「新しいアクション」 パネルが表示されるので下記を設定して保存ボタンをクリックします。
- 名前 : Terminate-Instances
- アクションタイプ : aws:ec2:terminate-instances
- ターゲット : Instances-Target-1 が自動的に設定されます。
- この項目はアクションタイプを設定すると表示され、自動的に値が設定されます。この後の手順でターゲットの設定をしていきます。 - その他の項目 : デフォルトのまま
クリックすると拡大します
「ターゲット」パネルに表示された “Instainces-Target-1 (aws:ec2:instance)” の編集ボタンをクリックします。
クリックすると拡大します
「ターゲットを編集」ダイアログが表示されるので、下記を設定して、保存ボタンをクリックします。
- 名前 : ASG-Instances-50Percent
- この項目は変更しなくても問題ありませんがわかりやすい名前をつけることを推奨します。 - リソースタイプ : aws:ec2:instance
- (デフォルト値のままです) - ターゲットメソッド : リソースタグとフィルターを選択
- 選択モード : ドロップダウンリストからパーセントを選択
- パーセンテージ(%) が表示されるので、50 と入力
- パーセンテージ(%) が表示されるので、50 と入力
- 新しいタグを追加 : ボタンをクリックし、表示される下記の項目に下記の値を設定します。
- キー : aws:autoscaling:groupName
- 値 - オプション に my-first-asg
クリックすると拡大します
実際の実験では停止条件を設定することを推奨しますが、今回は AWS FIS の基本的な動作を学ぶことが目的のため、割愛します。
実験テンプレートを作成ボタンをクリックします。
クリックすると拡大します
停止条件を設定しないでテンプレートを作成するため、警告のダイアログが表示されます。
今回はハンズオンのために停止条件の設定を割愛しておりますので、表示されたダイアログで 作成 と入力して 実験テンプレートを作成ボタンをクリックします。
クリックすると拡大します
2-2. EC2 インスタンスを停止する実験を行う
実験テンプレートが無事作成されると、実験テンプレートの詳細画面に遷移します。アクションドロップダウンから、開始を選択します。
クリックすると拡大します
「実験を開始」 画面で新しいタグを追加ボタンをクリックし表示される項目に下記の値をセットし、実験を開始ボタンをクリックします。
- キー : Name
- 値 - オプション : FISHandson-Exp1-run1
※この設定は必須ではありませんが、一覧画面で実験を識別するために設定することをお勧めします。
クリックすると拡大します
「実験を開始」ダイアログが表示されます。ここでは誤って実験を開始し、ワークロードに想定外の問題を発生させないための最終確認のため、フォームに 開始 と入力することを求められます。
開始 と入力すると実験を開始ボタンが有効化されるので、クリックして実験を開始します。
クリックすると拡大します
実験が正常に開始されると、こちらのような画面が表示されます。
状態 が Initiating であることをご確認ください。
クリックすると拡大します
少しして、更新ボタンをクリックすると、状態が Running → Completed と変化していきます。
クリックすると拡大します
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 のリンクをクリックします。
クリックすると拡大します
インスタンス概要ページで、アクション > セキュリティ > IAM ロールを変更 を選択します。
クリックすると拡大します
新しい IAM ロールを作成 のリンクをクリックします。
クリックすると拡大します
ロールを作成 をクリックします。
クリックすると拡大します
ロールの作成画面で AWS サービス → EC2 を選択して次のステップ: アクセス権限ボタンを押します。
クリックすると拡大します
Attach アクセス権限ポリシー の画面で AmazonSSMFullAccess の 2 つのポリシーを選択して 次のステップ: タグ ボタンをクリックします。
(本来、最小権限の法則にしたがって権限を設定すべきですが、このワークショップでは簡単のために広めの権限を設定しています。実際の環境に適用する際は、実験で必要な最小の権限を設計しテンプレートごとに適切なポリシーを持った IAM ロールを設定することを推奨します)
クリックすると拡大します
タグの追加 (オプション) 画面では特に操作は不要です。
次のステップ: 確認 ボタンをクリックします。
クリックすると拡大します
ロール名に AWSFISHandsonSSMRole と入力しロールの作成ボタンをクリックします。
クリックすると拡大します
EC2 の IAM ロールを変更画面を表示していたブラウザのタブに戻り、更新ボタンを押してから、作成した AWSFISHandsonSSMRole を選択して、保存ボタンをクリックします。
クリックすると拡大します
3-2. CPU 負荷をかける実験テンプレートの作成
AWS マネジメントコンソールの上部にある検索ボックス で “fis” と入力し、表示された AWS FIS をクリックします。
クリックすると拡大します
表示された AWS FIS の画面で 実験テンプレートを作成 をクリックします。
クリックすると拡大します
実験テンプレートを作成画面で、下記を入力していきます。
- 説明 : 指定したインスタンスへ 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 を入力
- その他の項目はデフォルトのまま
クリックすると拡大します
「ターゲット」パネルに表示された “Instainces-Target-1(aws:ec2:instance)” の編集ボタンをクリックします。
クリックすると拡大します
「ターゲットを編集」ダイアログが表示されるので、下記を設定して、保存ボタンをクリックします。
- 名前 : InstanceBurnCPUviaSSMbyId
- この項目は変更しなくても問題ありませんがわかりやすい名前をつけることを推奨します。 - リソースタイプ : aws:ec2:instance
- (デフォルト値のままです) - ターゲットメソッド : リソース ID を選択
- リソース ID : 2.1 で選択したインスタンスのインスタンス ID を指定します
- 選択モード : ドロップダウンリストから すべて を選択 (デフォルト値のままです)
クリックすると拡大します
実際の実験では停止条件を設定することを推奨しますが、今回は AWS FIS の基本的な動作を学ぶことが目的のため割愛します。
実験テンプレートを作成ボタンをクリックします。
クリックすると拡大します
停止条件を設定しないでテンプレートを作成するため、警告のダイアログが表示されます。
今回はハンズオンのために停止条件の設定を割愛しておりますので、表示されたダイアログで 作成 と入力して 実験テンプレートを作成 ボタンをクリックします。
クリックすると拡大します
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
※この設定は必須ではありませんが、一覧画面で実験を識別するために設定することをお勧めします
クリックすると拡大します
「実験を開始」ダイアログが表示されます。
ここでは誤って実験を開始し、ワークロードに想定外の問題を発生させないための最終確認のため、フォームに開始と入力することを求められます。開始と入力すると実験を開始ボタンが有効化されるので、クリックして実験を開始します。
クリックすると拡大します
実験が正常に開始されると、下記のような画面が表示されます。状態が Initiating であることをご確認ください。
クリックすると拡大します
少しして、更新ボタンをクリックすると、状態が 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 を無料でお試しいただけます