AWS Fault Injection ServiceでEKSクラスタにAZ障害を発生させてみる



AWSの障害シミュレーション機能であるFault Injection Service(以降FIS)に、先日AZ障害を想定したシナリオがリリースされました。

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/aws-fault-injection-service-two-requested-scenarios/

これまでFISの事は知っていたものの触ったは無かったのですが、AZ障害は業務でもよく話に出てきますので今後のテストで使えるかもと思い試してみました。
現在EKSの管理を業務で行っている事もあり、EKSの障害という想定で試してみました！

# FISの基礎知識

まずFISで使われるオブジェクトについて簡単に解説します。

<dl>
  <dt>実験</dt>
  <dd>障害テスト自体を指します</dd>
  <dt>実験テンプレート</dt>
  <dd>どのリソースにどの様な障害を発生させるか等の仕様を定義したオブジェクトです</dd>
  <dt>シナリオライブラリ</dt>
  <dd>EC2インスタンス障害やEKS Pod削除等、AWSが用意しているプリセットの実験テンプレートです</dd>
</dl>


障害テスト実施までの流れは以下になります。

1. **実験テンプレートを作成する**  
2. **実験を開始する**

実験テンプレートは1から自分で作成も可能ですし、シナリオライブラリから作成する事も可能です。
今回は後者のシナリオライブラリを利用してテンプレート作成しました。


# シナリオ1.EKSワーカーノード単一障害

まずはじめに、EKSワーカーノード(EC2)の単一障害のシナリオを作って実験してみます。

## 実験テンプレートを作成

FIS画面の左側にある`シナリオライブラリ`をクリックします。

![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/c1aa66ff-29ac-6965-727f-ef8b0684b477.png)

AWSが用意している障害シナリオが一覧で表示されます。
`EC2ストレス:インスタンス障害`にチェックを付けて、`Create template with scenario`ボタンをクリックします。

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-15_19-42-18_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/66e26801-e8bc-ca7e-240e-c3c47d9becdb.png)

すると実験テンプレート作成画面に移ります。

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-15_20-23-59_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/50b012d3-ad1c-40aa-76de-730db3e57a9e.png)

デフォルトの内容からほとんど修正する必要は無いのですが、リソースタグだけ修正します。

というのも`EC2ストレス:インスタンス障害`は障害を発生させる対象のEC2インスタンスを以下のインスタンスタグで識別する様になっています。

| キー| 値 |
|:-----------|:------------|
| Ec2InstanceFailure       | Allowed       |


もちろん対象EC2インスタンスにこのリソースタグを付与するでも良いのですが、今回は既に付与されている以下のリソースタグを指定する様に実験テンプレートの方を修正します。

| キー| 値 |
|:-----------|:------------|
| eks:nodegroup-name       | my-eks-nodegroup      |


ターゲットとして登録されている`TaggedInstances`をクリックします。

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-15_20-25-37_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/cd72865c-9b23-34a6-c50f-bcbdafa967b2.png)

`ターゲットを編集`ポップアップが表示されます。
上述のリソースタグで修正して`保存`ボタンをクリックします。

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-15_20-26-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/e63d91bc-dc34-d3a8-cb60-c4bf842c8c9c.png)

実験テンプレートの名前は`Name`タグで付ける事ができます。
ここまで設定したら`実験テンプレートを作成`ボタンをクリックします。これで実験テンプレート作成完了です。結構簡単ですね！

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-15_20-27-55_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/4c092dec-0209-360c-25dd-e1e63a778bd2.png)

## 実験開始！

作成した実験テンプレートを使って早速実験してみます。
左側の`実験テンプレート`を選択して、今回作成した実験テンプレートを選択し、`実験を開始`ボタンをクリックします。

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-15_20-28-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/127dd58c-f21e-406c-e461-fe5a4a38f550.png)

すると`実験を開始`画面が表示されます。`実験を開始`ボタンをクリックします。

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-15_20-30-4_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/0b4a49c1-79fc-3089-08f5-42686d26c32b.png)

今度は`実験を開始`ポップアップが表示されます。障害を発生させてサービスに影響を与えてしまうかもしれない事もあり、本当に実行するの？と何回も聞かれますね。。。
今回は検証環境ですので躊躇無く進めます。

フィールドに`開始`の文字を記載した後`実験を開始`ボタンをクリックします。
これでやっと実験開始です。

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-15_20-30-20_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/79313fd2-ec02-1a33-5c28-fe5c22ca4f77.png)

実験が開始されました！実験テンプレート内で設定されたアクションである`StopAction`が`Running`になっています。

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-15_20-31-56_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/84fec56d-c115-b60f-0bc4-9b5692a040f8.png)

EKSワーカーノードの状態を見てみます。おぉ、ちゃんとワーカーノードが停止になっていますね！

![SnapCrab_my-eks  クラスター  Elastic Kubernetes Service  ap-northeast-1 - Google Chrome_2024-3-15_20-33-6_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/550877ff-7753-b9d5-b4d2-8f6225975851.png)

しばらくしたら、ワーカーノードが1台起動してきました。EKSクラスタのノードグループがちゃんと仕事をしています。実験成功です！

![SnapCrab_my-eks  クラスター  Elastic Kubernetes Service  ap-northeast-1 - Google Chrome_2024-3-15_20-33-59_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/275bb2ea-635d-9a13-e97c-1300461f0542.png)

# シナリオ2.AZ障害

ではいよいよ本題のAZ障害を発生させてみます。
といっても流れはEC2障害とほぼ変らずです。

## 実験テンプレートを作成

シナリオライブラリから今回は`AZの可用性:電源の中断`にチェックを入れて`Create template with scenario`ボタンをクリックします。

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-15_20-41-36_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/d40fd75e-2aa8-7858-52ea-a41628bb981e.png)

実験テンプレート作成画面に移りますが、先程のEC2障害と比較してたくさんのアクションとターゲットが設定されています。
AZ障害時に発生するであろう複数リソースの障害を同時に発生させるシナリオになっています。
便利ですね～

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-18_16-19-38_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/746f6e34-9a6c-7c54-3818-a458b7fc737d.png)
![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-18_16-16-18_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/18009066-b3d9-dbf2-5979-efb4ec40874f.png)
![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-18_16-16-29_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/1638862e-2f9a-9b51-1ee8-28a5b0a11fef.png)




デフォルトですと各ターゲットのリソースタグには以下が付与されていました。

| キー| 値 |
|:-----------|:------------|
| AzImpairmentPower       | IceAsg      |

                   
障害対象のリソースとこのタグを合わせる必要がありますので、今回はEC2インスタンスとAutoScalingGroupのターゲットで以下に変更しました。

| キー| 値 |
|:-----------|:------------|
| eks:nodegroup-name       | my-eks-nodegroup      |


![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-18_16-14-54_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/6203d83d-ca8d-bfe2-f5dc-5bce9e88b7b2.png)

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-18_16-15-19_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/5e83ff11-b9a9-d9df-5370-6596b2cddeee.png)


また属性パスで以下を設定が設定されていましたので、デフォルトでは`ap-northeast-1a`が停止になる様です。
これを設定変更すれば障害対象のAZを指定できますね。

| キー| 値 |
|:-----------|:------------|
| Placement.AvailabilityZone       | ap-northeast-1a      |


![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-18_16-27-26_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/95ad4da1-1411-61cf-2cdc-7d144fa14480.png)


後はEC2障害と同様の際と同様に`実験テンプレートを作成`ボタンをクリックして実験テンプレートを作成します。

## 実験開始！

いよいよAZ障害発生させます。
実験開始の流れはEC2障害と同じなので割愛しますね。
実験テンプレート内に設定された複数のアクションが同時に`Running`になっています。
RDSやElasticache等は今回作成していないので`Skipped`になっています。

![SnapCrab_AWS FIS  ap-northeast-1 - Google Chrome_2024-3-15_21-10-30_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/31f4341e-3530-fe0a-b014-700a023ba6a8.png)

`ap-northeast-1a`で起動していたワーカーノードが2台落ちて、、


![SnapCrab_my-eks  クラスター  Elastic Kubernetes Service  ap-northeast-1 - Google Chrome_2024-3-15_21-10-45_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/bf1e2bad-db9b-04e7-b557-2c75e10fe354.png)


代りに`ap-northeast-1c`で2台ワーカーノードが自動で起動してきました。
こちらも実験成功です！

![SnapCrab_インスタンス  EC2  ap-northeast-1 - Google Chrome_2024-3-15_21-12-58_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1905292/f8fe5013-4b3f-0892-9ff6-e9300835134b.png)


# おわりに 

今回はFISを用いてEKSクラスタのAZ障害のシミュレーションを実施してみました。
これまでAZ障害は当然基盤構成で考慮はしないといけないものの、中々テストが難しいと業務で常々思っていましたが、FISを使う事でそれがお手軽に行えましたので感動しています！
業務でも使っていきたいなと思いました！