CodeZine(コードジン)

特集ページ一覧

PaaSでカオスエンジニアリング~Azure Web Appsにカオス挿入してみよう

クラウドネイティブ時代の実践カオスエンジニアリング 第4回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2021/10/13 11:00

目次

Web Appsに対する実験

実験の準備

 前回同様、今回も第1回の「カオスエンジニアリングのプロセス」に則り、実験を計画します。

# 項目 内容
1 定常状態 トップページへのHTTPリクエストは東日本のWeb Appにルーティングされ、そのレスポンスが200である
2 仮説 東日本のWeb Appを停止した場合、トップページへのHTTPリクエストは西日本のWeb Appにルーティングされ、そのレスポンスが200である
3 影響範囲の限定方法 停止する東日本のWeb Appを指定する
4 異常終了時の復旧方法 停止した東日本のWeb Appを起動する

 この条件を反映したChaos Toolkit用実験ファイルは以下の通りです。

{
  "version": "1.0.0",
  "title": "chaostoolkit-azure",
  "description": "N/A",
  "tags": [
    "azure",
    "webapps"
  ],
  "configuration": {
    "azure_subscription_id": "<SUBSCRIPtiON_ID>"
  },
  "secrets": {
    "azure": {
      "client_id": "<CLIENT_ID>",
      "client_secret": "<CLIENT_SECRET>",
      "tenant_id": "<TENAMT_ID>",
      "azure_cloud": "AZURE_PUBLIC_CLOUD"
    }
  },
  "steady-state-hypothesis": {
    "title": "Services are all available and healthy",
    "probes": [
      {
        "type": "probe",
        "name": "service-must-still-respond",
        "tolerance": 200,
        "provider": {
          "type": "http",
          "verify_tls": false,
          "url": "<URL_TRAFFIC_MANAGER>"
        }
      }
    ]
  },
  "method": [
    {
      "name": "stop-webapp",
      "type": "action",
      "provider": {
        "type": "python",
        "module": "chaosazure.webapp.actions",
        "func": "stop_webapp",
        "arguments": {
          "filter": "where name=='<NAME_WEBAPP_JAPANEAST>'"
        },
        "secrets": [
          "azure"
        ],
        "config": [
          "azure_subscription_id"
        ]
      },
      "pauses": {
        "after": 60
      }
    },
    {
      "name": "start-webapp",
      "type": "action",
      "provider": {
        "type": "python",
        "module": "chaosazure.webapp.actions",
        "func": "start_webapp",
        "arguments": {
          "filter": "where name=='<NAME_WEBAPP_JAPANEAST>'"
        },
        "secrets": [
          "azure"
        ],
        "config": [
          "azure_subscription_id"
        ]
      }
    }
  ],
  "rollbacks": [
    {
      "name": "stop-webapp",
      "type": "action",
      "provider": {
        "type": "python",
        "module": "chaosazure.webapp.actions",
        "func": "stop_webapp",
        "arguments": {
          "filter": "where name=='<NAME_WEBAPP_JAPANEAST>'"
        },
        "secrets": [
          "azure"
        ],
        "config": [
          "azure_subscription_id"
        ]
      },
      "pauses": {
        "after": 10
      }
    },
    {
      "name": "start-webapp",
      "type": "action",
      "provider": {
        "type": "python",
        "module": "chaosazure.webapp.actions",
        "func": "start_webapp",
        "arguments": {
          "filter": "where name=='<NAME_WEBAPP_JAPANEAST>'"
        },
        "secrets": [
          "azure"
        ],
        "config": [
          "azure_subscription_id"
        ]
      }
    }
  ]
}

 実験ファイル作成のポイントは以下のとおりです。

1. steady-state-hypothesis

 定常状態の定義です。今回は、東西いずれかのWeb Appで名前解決されるTraffic ManagerのURLに対するリクエストで、HTTPステータスコードが200のレスポンスが返却されることを想定しています。

2. method

 今回は、filterでWeb App名を指定して、東日本のWeb Appを止めるカオスを挿入します。

3. rollbacks

 定常状態を満たさなくなった時には、対象のWeb Appを再起動します。なおWeb Appを再起動するREST APIは停止中のWeb Appに対しては動作しないため、一度明示的に停止をして、その後改めて開始する構成になっています。

実験の実施

 上記のJSONをexperiment.jsonとして保存したら、下記コマンドを実行して実験を開始します。

chaos run ./experiment.json --hypothesis-strategy continously --hypothesis-frequency=20 --rollback-strategy=deviated

 オプションは第3回で紹介したものと同様のものを使用します。

 なおchaos --verbose run ...のように、--verboseオプションを挿入することで、より詳細なログを確認することが可能です。

 コマンド実行後に下記のメッセージが表示されれば、東日本のWeb Appを一時停止する、というカオスを挿入されても、Traffic Managerにより西日本のWeb Appにリクエストがルーティングされ、実験中を通して問題なくHTTPステータスコードとして200 OKを返却されており、実験は成功となります。

Experiment ended with status: completed

 一方で、steady-state-hypothesis内で指定している定常状態のチェックのURLを、カオス挿入にて停止する東日本のWeb AppのURLにした場合、カオス挿入によりHTTP 403エラーが返却される状態になり定常状態を満たさないため、下記メッセージが表示され、実験は失敗となります。

Experiment ended with status: deviated

 また今回の実験では、東日本のWeb Appを停止したままとしており、実験が失敗した時に限りrollbacksで指定したactionにより状態をロールバックしますが、コマンドのオプション--rollback-strategy=deviatedを省略することで、実験の成否にかかわらず、東日本のWeb Appを復帰させることも可能です。

まとめ

 今回は、Azure Web Appsを使用したシステムに対するカオスの挿入を紹介しました。Traffic Managerを併用して地理的分散を構成したシステムに対し、一部のWeb Appにカオスを挿入しても、定常状態が維持できることを見ていただけたと思います。

次回予告

 次回は、Azure Kubernates Serviceに対するChaos Toolkitによるカオスの挿入方法について紹介します。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:クラウドネイティブ時代の実践カオスエンジニアリング

著者プロフィール

  • 堀川 裕文(ホリカワ ヒロフミ)

     国内メーカーでの研究所/新規事業開発部門を経て Microsoft へ入社し、Azure テクニカル サポートを 3 年間担当。その後パートナー事業部に異動し、プリセールス、Azure 上でのアプリケーション開発支援を担当

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5