「サーバーレスアーキテクチャへのChaos Engineeringの原則適用」のセッションで紹介されていたChaos Lambdaを試してみた #reinvent

こんにちは、shoitoです。
re:Invent 2018も終わり無事に日本に帰国しました。

今回はサーバーレスアーキテクチャへのChaos Engineeringの原則適用(DVC305)のセッション内で紹介されていたChaos Lambdaを試してみました。

セッションのスライドはこちらです。

なお、弊社阿部によるセッションレポートがこちらです。

[レポート]サーバーレスアーキテクチャへのChaos Engineeringの原則適用について #reinvent #DVC305

Chaos Lambdaって何?

Chaos Lambda - a lightweight serverless chaos monkey for AWS https://artillery.io/chaos-lambda/

Chaos LambdaはNetflixのChaos MonkeyのLambdaによるサーバレス実装であり、Artillery.ioにより開発されたOSSです。
簡単に紹介すると、EC2インスタンスやECSタスクで構成されたAWSベースシステムの可用性や耐障害性を実験するためのツールです。

CloudWatchイベントによりスケジューリングされたタイミングでEC2インスタンスのTerminateがランダムに実行されます。
もちろん、Terminate対象はタグやセキュリティグループで指定できますし、デフォルトでは全てが対象外なので、Lambdaファンクションのデプロイ自体は安心して行えます。

Chaos Lambdaを試してみる

  1. CLIツールをnpmでインストールします。
    $ npm install -g chaos-lambda
    
  2. Lambdaファンクション用のIAMロールを作成します。このロールはEC2インスタンスのTerminateを実行するため AmazonEC2FullAccess ポリシーを付与します。

  3. Chaos LambdaのLambdaファンクションをデプロイします。 $lambda-role-arn の部分は2.で作成したロールのARNで置き換えてください。 またAWS_PROFILE=chaos-test AWS_REGION=ap-northeast-1 というように環境変数でプロファイルとリージョンを指定可能です。 リージョンを指定しないとデフォルトのeu-west-1として動きます。

    $ chaos-lambda deploy -r $lambda-role-arn
    

    例として、以下のようなコマンドになります。

    AWS_PROFILE=chaos-test AWS_REGION=ap-northeast-1 chaos-lambda deploy -r arn:aws:iam::1234567890:role/chaos-lambda-role
    

    正常にデプロイが終わるとchaos_lambda_config.jsonが生成され、その中にLambdaファンクションとLambdaロールのARNが保存されています。

    $ cat chaos_lambda_config.json
    {
        "FunctionArn": "arn:aws:lambda:ap-northeast-1:1234567890:function:chaosLambda:8",
        "LambdaRoleArn": "arn:aws:iam::1234567890:role/chaos-lambda-role"
    }
    
  4. EC2インスタンスのTerminate頻度を-cオプションで指定する設定ファイルに記載します。 以下では、60分に1回Lambdaファンクションが実行されます。Terminate対象はchaos_monkey:trueのタグが設定されたEC2インスタンスです。

    $ cat Chaosfile.json
    {
      "interval": "60",
      "enableForTags": [
        {
            "key": "chaos_monkey",
            "value": "true"
        }
      ]
    }
    

    -cオプションで設定ファイルを指定し、chaos-lambda deployコマンドを再度実施します。

    $ chaos-lambda deploy -c Chaosfile.json
    

    例として、以下のようなコマンドになります。

    AWS_PROFILE=chaos-test AWS_REGION=ap-northeast-1 chaos-lambda deploy -c Chaosfile.json
    

これでデプロイは完了です。
デプロイ内容を確認してみましょう。

まずはLambdaファンクションです。chaosLambdaという名前で作られています。

CloudWatch Eventsルールですがchaos_lambda_scheduleという名前でChaosfile.jsonの設定内容が反映され作られています。

最後に、Terminate対象のEC2インスタンスを用意します。
一つのインスタンスがランダムでTerminateされても、サービスを提供し続けられるようにAuto Scalingグループの設定をします。
Chaos Lambdaの対象とするため、このグループのインスタンスにはChaosfile.jsonenableForTagsで指定したchaos_monkey:trueのタグがEC2インスタンスの起動時に付与されるようにします。

しばらく様子を見ていると、Lambdaファンクションが実行され、EC2インスタンスがTerminateされ、Auto Scalingにより新たなインスタンスが起動する様子を伺えます。

Chaos Lambdaにより、EC2インスタンスがTerminateされていく様子

Auto Scalingにより。ECインスタンスが新たに作られる様子

Chaos Lambdaがサポートされるリージョン

- US East (Northern Virginia)
- US West (Oregon)
- Europe (Ireland)
- Asia Pacific (Tokyo)

ライセンス

さいごに

Applying Principles of Chaos Engineering to Serverless (DVC305)のセッションで紹介されていたChaos Lambdaを紹介し、EC2インスタンスの2台構成の環境で試してみました。
EC2インスタンス以外にも、Chaos Engineeringの実験をすべきレイヤーは多々あるので、他のプラクティスやツールを今後追っていきます。