AWS Fault Injection Simulator (FIS) リソースフィルタを使って特定AZのEC2インスタンスを停止させてみる

2022.06.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

AWS Fault Injection Simulator (FIS) を使って、特定AZの障害を想定したテスト何か行う方法がないのかを模索しています。
AWS FISにはリソースフィルタという機能でリソースを絞りこむことが出来ます。
そして、このリソースフィルタでは特定AZのリソースという形で絞り込むことが出来ます。

本日はこの機能を使って、特定AZの仮想マシンを停止させてみました。

仮想マシンを用意

複数の仮想マシンを用意します。
以下へCloudFormationテンプレートを用意しておきました。

東京リージョンの3つのAZにプライベートサブネットを作成し、各サブネットに2台づつ Amazon Linux 2 インスタンスを計6台作成します。

実験テンプレートのターゲットでリソースフィルターを使う

リソースフィルターは実験テンプレートのターゲットで指定を行います。
ターゲットメソッドで「リソースタグ、フィルター、パラメータ」を指定し、リソースフィルターオプションで属性パスと値を指定します。
値はカンマ区切りで複数指定することが可能です。

割と大事なポイントかなと思いますが、リソースタグは1つ以上必要になっています。
つまり、リソースフィルターのみでターゲットをフィルタリングすることは出来ないのでご注意ください。

ここではCloudFormationのスタック名を指定し、ap-northeast-1aap-northeast-1cをフィルターに指定しています。
実験を開始してみましょう。

ap-northeast-1d以外のインスタンスで停止されました。

複数のリソースフィルターを指定

リソースフィルターは複数指定することが出来ます。
ここでは、対象アベイラビリティゾーンを変更(ap-northeast-1cのみ除外)に加えて、インスタンスの状態もフィルタに追加して、インスタンス終了アクションを行ってみます。

結果は...

アベイラビリティゾーンがap-northeast-1c以外で、かつインスタンスの状態が停止状態のもののみ終了されました。
AND条件のようです。

同じ属性パスを2つ以上指定した場合はどうなるでしょうか。

AND条件なので、実験開始時にターゲット無しのエラーとなりました。

リソースタグを複数指定

先程はフィルターを複数指定しましたが、リソースタグでも複数指定出来そうです。
ここでは同じテンプレートを使ってスタックをもう1セット作成し、複数スタックを指定してみます。

リソースタグは同じキー名で異なる値のものを2つ指定し、リソースフィルターはAZ指定のみです。
どうなるでしょうか。

スタックfugafuga2の対象AZのインスタンスのみがアクションの対象となりました。
これはいったいどういうことでしょうかね。

実験テンプレートのターゲットを再度確認してみると、リソースタグがひとつになっていました。
同じキー名を複数指定すると、実験テンプレート更新後にひとつのみに更新されるようです。

タグは前方一致ではないしワイルドカードなども使えない

複数のスタック名をターゲットにしたかったので、色々と試してみました。
まず、タグ値は完全一致でした。

そして、ワイルドカードのような記号をいくつか指定してみましたが、これらは実験テンプレート更新時に無効な文字として判断され、実験テンプレート煮含めることが出来ませんでした。

複数タグを指定したい場合はターゲットもアクションも複数用意、実行タイミングは一緒でもOK

今回のように複数タグを指定したい場合は、各タグを対象としたターゲットを複数用意すれば実行が出来ます。
アクションごとに指定出来るターゲットはひとつなので、アクションも複数用意することになります。

複数アクションで実行タイミングをあわせることも出来ますし、ウェイトアクションを挟んで少しずらすことも出来ます。

今回であれば上記のような形となります。
実行してみましょう。

期待どおり、ap-northeast-1d以外のインスタンスがスタックを跨いで停止されました。

さいごに

本日はAWS Fault Injection Simulator を使ってアベイラビリティゾーンを指定した障害を発生させてみました。
障害といってもインスタンスを停止させているだけですが、EC2の台数が多かったりする場合のテストや障害テストにシナリオをもたせる場合などには便利だと思います。FIS自体が思ったより使いやすいです。

次回はRDSや、あるいはEC2の停止ではなくてSSMドキュメントを使った障害発生なども試してみたいと思います。