AWS FIS (Fault Injection Simulator) でカオスエンジニアリングを感じてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/ba544fcf-b059-9981-3180-27ddfa147c35.png)

# はじめに
仕事で AWS Fault Injection Simulator (FIS) を利用するかもしれないので、さわってみました。
LT 会とか、ハンズオンとかのネタにしたいと思ったので投稿です。

AWS FIS のシナリオライブラリから、「EC2 ストレス：メモリ」をハンズオンしていきます。

# AWS FIS (Fault Injection Simulator)
FISは、AWS Resilience Hub に含まれカオスエンジニアリングを導入するサービスで、ざっくりと言うと、「AWS で擬似的に障害を発生させる耐障害性テスト」のサービスです。
"カオスエンジニアリング" については、詳しく説明してる Qiita があるので、ページ下部の"参考"をご覧ください。
"カオス"と言っても、パッと想像する「混沌、混乱」ではなく、「カオス理論・力学、あるいは複雑系」のことです。複雑な「分散システムの振るまい」を指していると思います。

# シナリオライブラリ
AWS が事前にシナリオを用意してくれてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/71abfd2f-6509-c3b8-3a93-fff48639821f.png)

# ハンズオン
今回は、EC2 に負荷をかける"ストレステスト"を作成します。

## 事前準備

### IAM ロールの作成
1. ロールの作成画面
    - `IAM` -> `ロール`（左のメニューから） -> `ロールの作成`ボタン
1. エンティティの選択
    - `エンティティ` : AWS のサービス
    - `ユースケース` : EC2
1. 許可を追加
    - `許可ポリシー` : 「AmazonSSMManagedInstanceCore」で検索して選択
1. ロールの作成
    - `ロール名` : AmazonSSMManagedInstanceCore

### EC2 インスタンスの作成
1. EC2 インスタンスの作成画面
    - `EC2` -> `インスタンス`（左のメニューから） -> `インスタンスを起動`ボタン
1. アプリケーションおよび OS イメージ
    - `クイックスタート`タブ -> `Amazon Linux` -> `Amazon Linux 2023 AMI`
1. インスタンスタイプ 
    - `インスタンスタイプ` : t2.micro
1. 高度な詳細
    - `IAM インスタンスプロフィール` : AmazonSSMManagedInstanceCore
    - `タグ` : キー = **Name** 値 = **test-ec2**
    - `タグ` : キー = **Ec2StressMemory** 値 = **Allowed**

#### EC2 の接続テスト
"Session Manager" (SSM) で接続できることを確認
EC2 インスタンス -> `接続`ボタン（右上から） -> `セッションマネージャー`タブ -> `接続`ボタン

:::note info
SSM で接続エラーになる場合は、EC2 の IAM ロールが正しく設定されている事を確認
:::

## シナリオの選択
`EC2 ストレス：メモリ`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/cc3c0512-86d8-cc51-c836-91d8c5a078ca.png)

## テンプレートを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/194d7c6b-0470-e21c-151a-02f33d6da84c.png)

## アクションとターゲットを指定
既に"アクション"も"ターゲット"もテンプレートとして AWS が作成済み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/cab8033d-3821-ec3e-b779-9f4b97c1c7ed.png)

### ターゲットを編集
作成済みの"ターゲット"をクリックして修正
`リソースタグ`に キー : **Name** 値 : **test-ec2**　を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/2fc243c0-1f9a-f9e1-ac95-ef0eef3fbddd.png)

## サービスアクセスの設定
「AWSFaultInjectionSimulatorEC2Access」のポリシーが必要
私は既に作成済みでしたが、本当はここで"新しいロールを作成"になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/b9a08219-eb60-c7b2-7313-9e4002f7f351.png)

## オプションの設定
- 停止条件 : 特定の CloudWatch アラームがトリガーされた際に FIS の実行を停止する条件を指定できるらしい
- ログ : 指定することで S3 と CloudWatch にログ出力ができるらしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/cb7df38a-9cd5-f8e1-95d8-67922e5bf2df.png)

## 実験テンプレートを作成
内容を確認して、`実験テンプレートを作成`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/5d9f419e-7aec-b3a6-4447-45442a8c4ee6.png)

## 実験を開始
`実験テンプレート` -> 対象の実験（1 実験単位のキーは文字の羅列になってます） -> `実験を開始`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/eee079ec-ff24-b66a-8c06-198dce4946ed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/0469bbd4-c918-ca3b-1195-43e7bd321d9a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/9c151468-d796-9d58-17c6-4b6f08f3a38c.png)

### 実行前
実験スタート直前。CPU は 0 % 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/5fd5b5a6-9896-c97b-1bb9-6e77227955ad.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/f96feae1-48fe-bad7-a564-103287dcbf78.png)

### 実行中
CPU が 97 % まで上昇
"PID" が、3220 の「**stress-ng-vm**」が負荷をかけてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/158391da-90f3-2cce-edd3-db64dd208925.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/2b16ebd5-4faf-02c8-51e6-196d17114f38.png)

### 実行後（実験停止）
CPU が 0 % に戻りました。
FIS の`レポート`タブにアクション結果が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/d3903117-dfb0-ae74-dad9-e394fb61d537.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/352d3c04-c4ed-b7ce-ee9c-1a7bbdcb25c2.png)

# おわりに
はじめてさわったサービスでしたが、シナリオも用意されているのでサービスを利用するだけであれば、難しく無いと感じました。
ただ、"カオスエンジニアリング"が必要なほど、大きく複雑なシステムを理解して"テストケースを考え"、"テスト結果からの考察"するのは大変だなと感じました。

もう少し、理解を深めて「カオスエンジニアリング」(AWS FIS)の使いどころを考えたいと思います。

---
**参考（感謝）**
- [AWS Fault Injection Simulatorを使った障害試験を試してみる](https://qiita.com/sakai00kou/items/9908c1ec1c44c1799c11)
- [カオスエンジニアリングと聞いてカオスになった人必見](https://qiita.com/naokiiiii/items/de20997a70922c01f754)
- [AWS Systems Manager Session Managerを使ってみた](https://qiita.com/Kamibayashi_Mai/items/81cc2b82decb37f8007c)