カオスエンジニアリングのためのオープンAPIである Chaos Toolkitについて

2019.12.11

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

こんにちは、森です

以前、Gremlinというカオスエンジニアリングの実験を行えるサービスをご紹介しました。

最近、他のカオスエンジニアリングの実験をするツールを調べる機会がありましたので、今回は Chaos Toolkit というのをご紹介したいと思います。

カオスエンジニアリングについては Chaos Engineering: the history, principles, and practice あたりを読めば理解に役立つと思います。

Chaos Toolkit とは

カオスエンジニアリングの実験を自動化するための無料でオープンなコミュニティ主導のツールキットとAPIを提供するプロジェクトです。 以下のような特徴があります。

  • Open APIを定義して、Chaos Engineeringの実験を表現
  • Open APIを介して任意のシステムに対して自由に拡張可能(AWS、Google Cloud Engine、Microsoft Azure、Cloud Foundry、Humio、Prometheus、Gremlinなどのドライバー)
  • お気に入りのCI/CDパイプラインに組み込むことが可能
  • Apache 2ライセンスを持つオープンソースで,ロックインがなく、コミュニティによって強化されている

2つの大きな目的を持っています。

  • 簡単に独自のカオスエンジニアリングの実験を構築する方法を目指す
  • Open APIを提供することにより、カオスエンジニアリングの実験を指定するベンダーと技術に依存しない方法を定義する

この図がわかりやすいと思います。

null from https://docs.chaostoolkit.org/

Chaos Toolkitを介して外部ベンダーのリソースにアクセスし、我々のシステムに対して実験を行えるという図ですね。

Toolkit自体はコマンドラインツールです。

インストール方法

ToolkitはPython3で実装されており、実行するには動作するPythonインストールが必要です。 Python 3.5+を公式にサポートしています

1. Python3のインストール

# mac os
brew install python3

# Debian/Ubuntu
sudo apt-get install python3 python3-venv

# CentOS
sudo yum -y install https://centos7.iuscommunity.org/ius-release.rpm
sudo yum -y install python35u

2. 仮想環境の作成

Python仮想環境を作り、そこにToolkitをインストールすることを推奨しているので、作りましょう/

python3 -m venv ~/.venvs/chaostk

3. Toolkitのコマンドラインをインストール

仮想環境をアクティブ化してからインストールします。

# 仮想環境をアクティブ化
source  ~/.venvs/chaostk/bin/activate
(chaostk) $ pip install chaostoolkit
(chaostk) $ chaos --version

実験の使用例

Chaos Toolkitを十分に活用するには様々な拡張機能をインストールする必要とありますが、拡張機能に関しては次回以降に試そうと思います。ここではchaosコマンドラインとそのコアライブラリをインストールした状態で簡単な実験サンプルを行います。

Chaos Toolkitは、JSON形式の記述ファイルで定義され、JSONでエンコードされた実験(YAMLもサポートされています)を実行し、そのステップを順番に実行します.

ファイルの仕様: https://docs.chaostoolkit.org/reference/api/experiment/

Experimentファイル

Experiment 実験の要素、順序を定義するファイルです。

要素

  • Steady State Hypothesis
    • Method要素が適用される前のシステムの状態を示します(定常状態)
  • Contributions
    • 実験の対象となるシステムプロパティと、それらがどれだけ貢献したかを示します(関係者が関心を持つ側面を指す)。"high", "medium", "low" or "none"で示します。
      • reliability : 信頼性
      • security : セキュリティ
      • scalability : 拡張性
  • Method
    • 適用するProbおよびAction要素のシーケンスを記述します。 Methodは、実験の最上位のmethodプロパティで宣言されます。
  • Probe
    • 実験中にシステムから情報を収集する
  • Action
    • 実験中にシステムに対して操作を実行する
  • Rollbacks
    • システムを初期状態に戻そうとする一連のアクションを宣言する
  • Secrets
    • Probe,Actionに対して安全に渡す必要がある値を宣言する
  • Configuration
    • ActionおよびProbeにランタイム値を提供する(キーバリューの形式)

サンプルjson

{
    "version": "1.0.0",
    "title": "Moving a file from under our feet is forgivable",
    "description": "Our application should re-create a file that was removed",
    "contributions": {
        "reliability": "high",
        "availability": "high"
    },
    "steady-state-hypothesis": {
        "title": "The file must be around first",
        "probes": [
            {
                "type": "probe",
                "name": "file-must-exist",
                "tolerance": true,
                "provider": {
                    "type": "python",
                    "module": "os.path",
                    "func": "exists",
                    "arguments": {
                        "path": "some/file"
                    }
                }
            }
        ]
    },
    "method": [
        {
            "type": "action",
            "name": "file-be-gone",
            "provider": {
                "type": "python",
                "module": "os",
                "func": "remove",
                "arguments": {
                    "path": "some/file"
                }
            },
            "pauses": {
                "after": 5
            }
        },
        {
            "ref": "file-must-exist"
        }
    ]
}

実行例

Experimentファイルを作成したら、以下のコマンドで実行します

(chaostk) $ chaos run {Path to experiment.json}

次回予告

今回はツールの概要、インストール方法、実行例のみをご紹介した形です。

次回からはサンプルファイルを実際に実行し、結果を生成していきたいと思います。

それでは。