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