見てたってバグなんかわかりゃしないよ！ AWS FIS で障害の注入

_見てたってバグなんかわかりゃしないよ_

というわけで実際に障害を起こして試してみようというカオスエンジニアリングのサービス AWS FIS について.

## 目次

1. はじめに
2. 検証用 EC2 インスタンスの作成
3. SSM ドキュメントの作成
4. FIS テンプレートの作成
5. FIS 実験の起動


## はじめに

今回作る構成はこちら

![AWS-FIS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237714/7214d689-0d9b-9683-b6b6-188e378e7e34.png)


リソースの詳細について

1. EC2 関連
    + EC2 インスタンス
        + SSM からドキュメントで定義された内容を実行するために ssm-agent をインストールしておきます.
    + IAM Role
        + EC2 から SSM を利用するための AmazonEC2RoleforSSM ポリシを設定します.
1. System manager 関連
    + SSM ドキュメント
        + FIS から実行する SSM ドキュメント.
1. FIS 関連
    + 実験テンプレート
      + Action
          + 起こす障害を定義します。今回は独自の SSM ドキュメントを作成して設定します.
      + Target
          + 障害を起こす対象を定義します。今回は EC2 インスタンスを作成して利用します.
      + 停止条件
          + 障害の発生を停止する CloudWatchAlarm を設定します. 
      + IAM Role
          + FIS 用の障害発生に必要な権限をもたせた IAM Role .

では、順番に見ていきましょう.


## 検証用 EC2 インスタンスの作成

インスタンスに付与する IAM Role を作成します.

1. マネジメントコンソールにログイン
2. IAM を検索して IAM の画面を表示する
3. 左メニューのロールを選択
4. ロールを作成ボタンからロール作成画面を表示
5. 一般的なユースケースに EC2 を選択して次のステップ
6. ポリシーのフィルタから `AmazonEC2RoleforSSM` を検索
7. チェックを入れて次のステップ
9. ロール名に `ec2-fis-test-role` を入力してロールの作成

先ほどの IAM Role を適用して EC2 インスタンスを作成します.
基本的に無料枠やデフォルトの設定で大丈夫ですが2点ほど注意があります
1. **ステップ 3: インスタンスの詳細の設定** で IAM ロールに `ec2-fis-test-role` を設定してください.
1. `Name` タグに `fis-test-inst` を設定します.

インスタンスが実行中になれば EC2 インスタンスの作成完了です.
後の行程でインスタンス ID を使用するので控えておきます.


## SSM ドキュメントの作成

FIS から起動する SSM ドキュメントを作成します.

1. SSM を検索して SystemsManager の画面を表示します
2. 左メニューの 共有リソース ドキュメントから SSM ドキュメントの画面を表示します
3. Create document から　Command or Session でドキュメントの作成画面を表示します
4. 名前に `fis-test-doc` を入力します
5. ターゲットタイプに `/AWS::EC2::Instance` を入力します
6. ドキュメントタイプに `コマンドドキュメント` を入力します
7. コンテンツに YAML を選択して以下の内容を入力してドキュメントの作成を選択します

```yml
---
schemaVersion: "2.2"
description: "fis test ssm document"
parameters:
  Message:
    type: "String"
    description: "test message"
    default: "This is a test message"
mainSteps:
- action: "aws:runShellScript"
  name: "testSsmDocument"
  inputs:
    runCommand:
    - "echo Message"   
```

これで SSM ドキュメントが作成できました.


## FIS テンプレートの作成

FIS で使用する IAM Role を作成します.

1. IAM を検索して IAM の画面を表示する
2. 左メニューのロールを選択
3. ロールを作成ボタンからロール作成画面を表示
4. 一般的なユースケースに EC2 を選択して次のステップ
    + ※ ここは FIS を選択したいのですが、選べないので一旦 EC2 を指定します.
5. ポリシーのフィルタから `PowerUserAccess` を検索
6. チェックを入れて次のステップ
    + ※ 今回は簡単化のため `PowerUserAccess` を選択してしまいます
    + 実際に利用する場合は必要に応じて最小権限を付与して下さい
7. 必要に応じてタグを設定して次のステップ
8. ロール名に `fis-test-role` を入力してロールの作成

このままでは FIS からこのロールを参照できないので信頼関係の設定を追加します.

1. ロールの画面から `fis-test-role` でフィルタします
2. ロール名を選択して詳細画面を表示します
3. 信頼関係タブから信頼関係の編集で編集画面を表示します
4. 以下のように書き換えて信頼ポリシーの更新で更新します

```diff
 {
   "Version": "2012-10-17",
   "Statement": [
     {
       "Effect": "Allow",
       "Principal": {
-        "Service": "ec2.amazonaws.com"
+        "Service": "fis.amazonaws.com"
       },
       "Action": "sts:AssumeRole"
     }
   ]
 }
```


これで準備ができましたので FIS テンプレートの作成に入ります.

1. FIS を検索して Fault Injection Simulator の画面を表示します
2. 左メニューの実験テンプレートから実験テンプレートの画面を表示します
3. 実験テンプレートを作成から作成画面を表示します
4. 基本情報
    1. 説明に `FIS test template` を入力
    1. 名前に `fis-test-template` を入力
    1. IAM ロールに `fis-test-role` を選択
5. アクション
    1. アクションを追加
    2. 名前に `fis-test-action` を入力
    3. アクションタイプに `aws:ssm:send-command` を選択
    4. documentArn に `arn:aws:ssm:ap-northeast-1:<自分のアカウントID>:document/fis-test-doc` を入力
        + arn のフォーマットは [こちら](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/security_iam_service-with-iam.html)
    5. duration に `分` と `2` あたりを設定しておきましょう
    6. 保存ボタンで確定します
6. ターゲット
    1. `Instances-Target-1` の編集ボタンからターゲットの設定をします
    2. リソース ID に `fis-test-inst` のインスタンス ID を設定して保存します
7. 停止条件は今回は設定せず実験テンプレートを作成

これでテンプレートが作成できました.
次に障害を発生させてみましょう.


## FIS 実験の起動

作成した実験テンプレートから実験を開始しましょう.

1. 実験テンプレートの詳細のアクションから開始を選択します
2. `Name` タグに `fis-test-ex1` を設定し実験を開始します
3. 状態が `Completed` になれば成功です


今回は独自の SSM ドキュメントを定義して FIS から起動する手順を確認してみました.
(障害は起こしてないわけですが・・・)
これでカオスエンジニアリングを始めてみましょう！