実験テンプレートの作成
FISではまず実験テンプレートを作成する必要があります。実験テンプレートでは、はじめにどのようなカオスを挿入するかを「アクション」として定義します。FISが挿入できるカオスはAWS FIS アクションリファレンスをご確認ください。
今回はEC2の停止/削除である「aws:ec2:terminate-instances」を利用します。「aws:ec2:terminate-instances」はインスタンスが削除され、実験前の状態に戻すことができないのですが、aws:ec2:stop-instances(EC2の停止)のように実験前の状態に戻すことが可能なアクションを選択した場合は、ロールバックアクション(aws:ec2:stop-instancesの場合はEC2の起動)を設定することが必須となります。カオスエンジニアリングの知識がなくともこうした心遣いがあるおかげで安心して実験を作ることができます(「影響範囲の限定」観点のポイント)。
このままだとすぐに実験が終了してしまうため、30分異常がないかを待機する「aws:fis:wait」というアクションも追加します。

その後、カオス挿入対象となるターゲットを指定します。指定する方法はリソースID、リソースタグ、属性によるフィルターの3種類から選択可能です。AWS内で一意となるリソースIDを利用することが、ターゲット指定のもっとも厳密な方法となります。
しかし本システムのようにAuto Scaling Groupを利用したシステムだと、頻繁にインスタンスの入れ替わりが発生する可能性があり、リソースIDの指定が難しい場合があるかと思います。そうした場合は、リソースタグや属性によるフィルタリングを利用します。これらの方法を選択した場合は、条件にマッチした対象のうち、カオスを挿入する数や割合を指定できます。これにより、誤って想定以上の数のカオスを挿入することを防ぎます(「影響範囲の限定」観点のポイント)。
今回はリソースタグでキー名が「aws:autoscaling:groupName」、値が「fis-nginx」のリソースのうち、1つにカオスを挿入(EC2の停止)が行われるように設定します。

次に、この実験を行う際に利用するIAMロールの指定をします。他のAWSサービスだと必要な権限を持つIAMロールを自動生成する機能を持つことが多いですが、誤った実験を防ぐためにか、明示的に既存のIAMロールを指定する仕様となっています。利便性は落ちますが、こうすることで意図しない操作を防ぐことができると感じています(「影響範囲の限定」観点のポイント)。

さらに、停止条件を指定します。これは前述の通り、CloudWatch synthetic monitoringのアラームを2つ指定します。これにより指定した2つのアラームが発生しなければ、定常状態であると定義したことになります。このアラームは最大5つ指定することが可能です。CloudWatchアラームとして定義できるものであればなんでも指定できるため、さまざまな観点で定常状態を定義できます(「定常状態の定義」観点のポイント)。

最後に、実験のログの出力先を指定します。S3とCloudWatch Logsが選択可能です。後から実験結果を確認できるようにするため、この設定はしておくべきです。利便性観点では簡単に検索ができるCloudWatch Logsが有利で、コスト観点ではS3が有利です。今回の実験ではCloudWatch Logsに出力するように指定しました(「実験管理の負荷」観点のポイント)。

実験テンプレートはCloudFormationで表現することも可能ですし、JSONとしてエクスポート/インポートすることも可能です。コードとして扱うことが可能なため、複製や他のAWSアカウントとの共有も簡単に実現できます(「実験管理の負荷」観点のポイント)。
もちろん他のAWSサービスと同じくIAMによるアクセス制御も可能ですので、他のAWS利用者との共有も可能です(「実験管理の負荷」観点のポイント)。
