AWS Fault Injection Simulator で始めるカオスエンジニアリング入門

# 概要
https://awsbasics.connpass.com/event/207751/

上記イベントで実施した[AWS FIS](https://docs.aws.amazon.com/ja_jp/fis/latest/userguide/what-is.html)の障害発生シミュレーションハンズオンの忘備録。
それと、独自に試したAWS FISの実験内容をまとめてみる。

# ハンズオンの忘備録
https://master.d3lyeoeu7zm1la.amplifyapp.com/appendices/

具体的な実施内容は上記で共有されているが、簡単に共有する。

### 実験内容
1. 起動しているEC2のLinuxインスタンスを、リソースID指定によってFISの実験で停止させることができるか検証。
1. 起動しているEC2のWindowsインスタンスを、タグ値指定によってFISの実験で終了させることができるか検証。
1. FISの実験でEC2インスタンスを終了させた場合、設定しておいたAuto Scalingグループの最小キャパシティの数だけEC2インスタンスの起動台数を維持するかを検証。

### FISの設定方法
まずは「実験テンプレート」にて、障害発生シミュレーションの設定を登録する。
設定項目は大別して以下の3つに分かれる。
**ターゲット / アクション / 停止条件**

#### ターゲット
この実験テンプレート内で実験対象としたいリソースを指定する。
ターゲットは複数指定が可能。
以下の例では、タグ:Name=Linux のEC2インスタンスを指定している。
![Screen Shot 2021-05-18 at 22.46.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198011/ee3275a6-33a0-f97d-740d-699d3c3be4c0.png)

#### アクション
この実験テンプレート内で指定したターゲットに対して実行するアクションを指定する。
![Screen Shot 2021-05-18 at 22.51.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198011/fcb1329f-acb4-5137-5f8a-360d1408eaed.png)

こちらで様々な指定可能アクションを確認できる。

https://docs.aws.amazon.com/ja_jp/fis/latest/userguide/fis-actions-reference.html

中でも *aws:ssm:send-command* は便利そう。
ターゲットであるEC2インスタンスに様々なコマンドを実行できる。

https://docs.aws.amazon.com/ja_jp/fis/latest/userguide/actions-ssm-agent.html

また、アクションは複数設定することが可能。
「次のあと開始 -オプション」項目の入力によってアクションの順番を指定できる。
![Screen Shot 2021-05-18 at 23.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198011/05f7c4f1-41d8-0b30-6370-d72de9438b82.png)

#### 停止条件
Amazon CloudWatch アラームとして定義したしきい値に達した場合に実験を停止する条件を指定できる。
![Screen Shot 2021-05-18 at 23.08.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198011/feb8125c-fd08-ba44-607e-76f171a01fde.png)

例えば、想定以上の停止EC2インスタンスが発生した場合に実験を中止する、などが可能となる。

### 実験の履歴
メニューの「実験」ページにて、実験履歴を確認できる。
履歴から再実験も可能。

### 注意点
FISの実行には実行ロールを作成する必要がある。
ただ、作成時の「ユースケースの選択」欄に現状ではFISは存在しない。
![Screen Shot 2021-05-18 at 22.00.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198011/2ac48843-3513-73e1-d4ab-dcb7c2a12ea0.png)
そのため、作成したロールの信頼ポリシーを編集し、アタッチされるサービスに *fis.amazon.com* を指定しなくてはならない。

1. IAMポリシー *fis-policy* を作成。ポリシーの編集にて以下を貼り付ける。

https://github.com/harunobukameda/AWS-FIS-Auto-Scaling/blob/main/rolepolify.txt

2. IAMロール *fis-role* を作成。
　アクセス権限ポリシー: fis-policy
　ユースケースの選択: **EC2**　（一時的にEC2を選択しておく）
3. IAMロール fis-role の信頼関係を編集。以下を貼り付ける。

https://github.com/harunobukameda/AWS-FIS-Auto-Scaling/blob/main/rolepolify.txt

# 個人的に試した実験
Auto Scaling のグループサイズ：最小キャパシティ: 2に設定。
FISで対象のインスタンスを終了させても、最小構成台数2台をキープするか検証。

### 1. Auto Scalingグループの作成
| 項目 | 設定値 |
|:--|:--|
| Auto Scaling グループ名  | linux-auto-healing2  |
| 起動テンプレート  | auto-healing-linux　（<-ハンズオンのものを再利用）  |
| ネットワーク  | VPC: 適当<br>サブネット: 適当  |
| ヘルスチェック  | ヘルスチェックの猶予期間: ６０秒  |
| グループサイズ  | 希望する容量: 2<br>最小キャパシティ: 2<br>最大キャパシティ: 2  |

「Auto Scalingグループを作成」クリックで、タグ:Name=Linux のEC2インスタンスが2台起動することを確認。
![Screen_Shot_2021-05-18_at_20.59.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198011/25a66675-973f-eab1-6e98-284de65970c2.png)

片方のタグ:Name を "Linux2" に編集しておく。

### 2. FIS 実験テンプレート登録
| 項目 | 設定値 |
|:--|:--|
| 説明  | linux-terminate2  |
| IAMロール  | fis-role　（<-ハンズオンのものを再利用）  |
| ターゲット > ターゲットを追加  | 名前: linux2<br>リソースタイプ:aws:ec2:instance<br>ターゲットメソッド: リソースタグとフィルター<br>選択モード: すべて<br>リソースタグ: キー=Name / 値: Linux  |
| アクション > 新しいアクション  | 名前: linux-terminate2<br>アクションタイプ: aws:ec2:terminate-instances<br>ターゲット: linux2　（<-ターゲットで追加したもの）  |

「実験テンプレートを作成」クリック。

### 3. FIS 実験
作成した実験テンプレートの詳細画面から実験を開始。

![Screen_Shot_2021-05-18_at_21.05.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198011/f609b786-6139-7a7c-0ef7-352db5647fb3.png)
開始してしばらくすると、FISの実験設定により、Name=Linux のEC2インスタンスが終了する。

![Screen_Shot_2021-05-18_at_21.08.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198011/0a352ca9-bc10-9794-4513-8139912023c9.png)
しばらくすると、Auto Scalingの最小キャパシティの設定通り、Name=Linux のEC2インスタンスが起動することが確認できた。

# 所感
- 従来では難しかったカオス的な振る舞いをする分散システムの連結検証を行う上で、有効な選択肢となるのではないか。
- 実験手順を明確に定義できるのは便利。実験テンプレートはCloudFormation化できるのか？（要調査）
- リージョン・AZを指定した障害シミュレーションはまだ未対応とのこと。
- 今後はターゲットも増えていくと思われる。個人的にはなるべく早めにLambdaに対応して欲しい。