SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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

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によるカオスの挿入方法について紹介します。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
クラウドネイティブ時代の実践カオスエンジニアリング連載記事一覧

もっと読む

この記事の著者

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/14859 2021/10/13 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー