AWS Fault Injection Simulatorを使って障害を発生させる

エキサイト株式会社のみーです。

今年の3月より利用可能となったAWS Fault Injection Simulator、FISを使ってフォールトインジェクション実験をしてみました。

aws.amazon.com

いわゆるカオスエンジニアリングです。フォールトインジェクション実験をするツールとしてはNetfilxのChaos Monkeyなどが有名ですが、FISを利用することでマネージドに実施できるようになりました。

さて、CFnオタクなのでテンプレートを書いてみたのですが、書き方に少しハマってしまいました。AWS CLIで実行するときも同様にハマる可能性があるため、備忘録として残しておこうと思います。

最終的なCFnテンプレート

試行錯誤の結果、以下のようになりました。RDSインスタンスを再起動させて、強制的にフェイルオーバーを発生させるという実験内容です。

Resources:
  FISExperimentTemplate:
    Type: AWS::FIS::ExperimentTemplate
    Properties:
      Description: "RDS failover experiment"
      RoleArn: !GetAtt IAMRole.Arn
      Actions:
        RebootInstance:
          ActionId: aws:rds:reboot-db-instances
          Parameters:
            forceFailover: true
          Targets:
            DBInstances: MyInstances
      Targets:
        MyInstances:
          ResourceType: aws:rds:db
          ResourceArns:
            - arn:aws:rds:ap-northeast-1:123456789012:db:hoge-piyo
          SelectionMode: ALL
      StopConditions:
        - Source: none
      Tags:
        Env: !Ref Env

ここに至るまで、1時間くらい悩みました。

書き方がよくわからない

最初はActionsの書き方(特にTargets)がわからず、公式サンプルを参考に以下のように書いていました。

Actions:
  RebootInstance:
    ActionId: aws:rds:reboot-db-instances
    Parameters:
      forceFailover: true
    Targets:
      Instances: MyInstances

すると怒られちゃうわけ。

Resource handler returned message: "Unexpected target "Instances" found in action "RebootInstance".

なるほどわからんInstances というキーがダメなのか、MyInstances というバリューがダメなのか、よくわからん。
っで、一旦諦めてマネコンから作ってみたのですが、そこで原因判明。

f:id:ex-mii:20210520010640p:plain

↑の赤枠内が、先ほどのActionsで指定するTargetsの Key/Value ということ。TargetのResourceTypeによって特定のキーを書く必要があるっぽい。
公式サンプルを見てみると、TargetのResourceTypeがEC2の場合には Instances と書かれていました。なるほど、だからエラーになっていたのか。

docs.aws.amazon.com

他にも少し癖がありますので、公式サンプルにはしっかりと目を通しておきましょう。

おわりに

今回の RDSインスタンスでフェイルオーバーを発生させる という実験はRDSのマネコンからも試すことができます。EC2の停止実験なども同じ、マネコンからポチポチできますね。あれ、FISいらなくね?と思いませんか?

いえいえ。そうではなくて、あくまでもカオスエンジニアリングの一環として、継続的に実験を実行していくことがFISを利用する目的だと考えます。

システムが複雑になり、内部実装がブラックボックスになって・・・そんな中で重大な障害が発生すると現場はてんやわんやです。きっと誰もが1度は経験したことあるはず。
そうならないためにも日々小さな障害を意図的に発生し続けて、「サービスを停止させない」から「障害が発生しても自動で復旧する」へと意識を変えていく必要があるのかなと思いました。

FISはそのための手段の1つ。FISを活用して、より強いシステムやアプリケーションを育てていきたいものですね。