SHOEISHA iD

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

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

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

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

カオスエンジニアリングで急なVMの停止に備えよう~Azure 仮想マシン スケール セット(VMSS)にカオス挿入

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


VMSSに対する実験

実験の準備

 第1回の記事の「カオスエンジニアリングのプロセス」に則り、実験を計画します。一般的に、最低でも下記について検討が必要になります。

  1. 定常状態の定義
  2. 実験実施時の仮説(実験の内容)
  3. 影響範囲の限定方法
  4. 異常終了時の復旧方法

 今回のシステムではそれぞれの項目に対して以下のように決定したとします。

# 項目 内容
1 定常状態 トップページへのhttpリクエストのレスポンスが200である
2 仮説 VMSS内のVMが1台停止したとしてても定常状態を維持する(1台停止後、5分間待機する)
3 影響範囲の限定方法 停止するVMを指定する
4 異常終了時の復旧方法 停止したVMSS内のVMを起動する

 上記の条件での実験をChaos Toolkitで実現する場合、下記の実験ファイル(experiment.json)を作成します。

{
	"version": "1.0.0",
	"title": "...",
	"description": "...",
	"tags": [
		"azure",
		"VMSS"
	],
	"configuration": {
		"azure_subscription_id": "xxxx"
	},
	"secrets": {
		"azure": {
			"client_id": "xxxx",
			"client_secret": "xxxx",
			"tenant_id": "xxxx"
		}
	},
	"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": "https://xxxx"
				}
			}
		]
	},
	"method": [
		{
			"name": "stop-vmss",
			"type": "action",
			"provider": {
				"type": "python",
				"module": "chaosazure.vmss.actions",
				"func": "stop_vmss",
				"arguments": {
					"filter": "where resourceGroup=='your resource group name' and name=='your vmss name'",
					"instance_criteria": [ {"name": "your vmss instance name"} ]
				},
				"secrets": [
					"azure"
				],
				"config": [
					"azure_subscription_id"
				]
			},
			"pauses": {
				"after": 300
			}
		}
	],
	"rollbacks": [
		{
			"name": "restart-vmss",
			"type": "action",
			"provider": {
				"type": "python",
				"module": "chaosazure.vmss.actions",
				"func": "restart_vmss",
				"arguments": {
					"filter": "where resourceGroup=='your resource group name' and name=='your vmss name'",
					"instance_criteria": [ {"name": "your vmss instance name"} ]
				},
				"secrets": [
					"azure"
				],
				"config": [
					"azure_subscription_id"
				]
			}
		}
	]
}

 実験ファイルの作成にあたり、気をつけるポイントは以下のとおりです。

1. steady-state-hypothesis

 steady-state-hypothesisでは、定常状態の定義を行います。今回のシステムではロードバランサーのエンドポイントへのリクエストでHTTPステータスコードが200で返ってくるとしています。現時点ではChaos ToolkitのビルトインでサポートされているHTTPレスポンスの確認はHTTP HeaderやBodyの情報だけとなっており、レスポンスタイム(1秒以内など)を指標とした定常状態の定義はできません。

2. method

 methodには、カオスとして挿入したいアクションを設定します。chaosazureに用意されているActionでは、filterやinstance_criteriaを利用して、カオスの対象を細かく指定することが可能です。指定しない場合はランダムに対象を選択されてしまうため、想定外の事象が起きる確率を下げるためにも、これらを指定します。

3. rollbacks

 rollbacksでは、定常状態を満たさなくなった場合に復旧させる処理を記載します。実験の実行時にrollback-strategyオプションを利用することで、どのような条件の時に記載した処理を実行するかを指定が可能です。

実験の実施

 執筆時点でのchaosazure version 0.10.0は、AzureのVMSSのAPIの仕様変更を反映できておらず、そのままでは実行時に下記エラーが発生します。

failed: AttributeError: 'ItemPaged' object has no attribute 'advance_page'

 そのため、chaosazure/vmss/fetcher.pyの修正を行う必要があります。

 68行目~76行目をコメントアウトし、以下のコードを追加します。

    for item in pages:
        vmss_instances.append(item)    

 上記の修正が完了したら、下記コマンドで実験を行います。

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

 コマンドのオプションについて、以下のような設定が可能です。

1. hypothesis-strategy

 定期的に定常状態を満たすかを確認したいため、「continously」を指定します。その他のオプションは下記をご参照ください。

2. hypothesis-frequency

 定常状態をチェックする間隔を指定します。Azure Loadbalancerはデフォルトで作成した場合、5秒間隔/2回連続で正常性チェックに失敗するとバックエンドのVMが異常状態と判断します。それよりも短い間隔で定常状態のチェックを行うと、異常状態VMへ通信が届いてしまい、Chaos Toolkitでの正常状態チェックに失敗し、実験が異常終了してしまうため、余裕を持って20秒間隔を指定しています。

3. rollback-strategy

 実験時に定常状態を満たさなくなった場合に限り、ロールバックを実行する「deviated」を指定します。

 下記のように表示されれば、実験は成功です。定常状態をチェックするタイミングによっては実験に失敗することもあるかと思いますので、その場合は何度か実験を試行してください。

Experiment ended with status: completed

次回予告

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

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

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

もっと読む

この記事の著者

奥村 康晃(株式会社NTTデータ)(オクムラ ヤスアキ)

 NTTデータ入社以来、クラウドサービスのAPIを連携させることで効率的な管理を可能とするクラウド管理プラットフォームの開発に従事。現在では、クラウド導入の技術コンサルや組織での技術戦略立案にも携わる。

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/14858 2021/10/09 02:56

イベント

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

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

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

メールバックナンバー