Azure 仮想マシンスケールセットのインスタンス保護は、スケールイン(負荷減に伴う仮想マシン数減)やアップグレードなどのメンテナンスから保護する機能です。保護には2種類あり、「スケールインから保護する」を設定するとスケールインの対象外になり、「スケール セット アクションから保護する」を設定するとスケールインの対象外になるだけでなくアップグレード等の作業からも対象外になります。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
事前設定
以下、リソースグループを作成します。
az group create --name MyResourceGroup --location japaneast
仮想マシンスケールセットを作成します。初期状態では9台の構成とします。
az vmss create \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --image UbuntuLTS \ --vm-sku Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --zones 1 2 3 \ --instance-count 9
インスタンス保護の概要
インスタンス保護は、仮想マシンの削除から守る方法です。インスタンス保護には「スケールインから保護する」「スケール セット アクションから保護する」の2通りの設定があります。以下に公式ドキュメント「Azure 仮想マシン スケール セット インスタンスのインスタンス保護」の引用を記します。
「スケールインから保護する」の挙動は以下の通りです。
- スケール セット インスタンスの protectFromScaleIn プロパティを使用して有効になります
- 自動スケーリングで開始されたスケールインからインスタンスを保護します
- スケール セットで開始された操作 (アップグレード、再イメージ化、割り当て解除など) はブロックされません
- ユーザーが開始したインスタンス操作 (インスタンスの削除を含む) はブロックされません
「スケール セット アクションから保護する」の挙動は以下の通りです。
- スケール セット インスタンスの protectFromScaleSetActions プロパティを使用して有効になります
- 自動スケーリングで開始されたスケールインからインスタンスを保護します
- スケール セットで開始された操作 (アップグレード、再イメージ化、割り当て解除など) からインスタンスを保護します
- ユーザーが開始したインスタンス操作 (インスタンスの削除を含む) はブロックされません
インスタンス保護の設定
スケールインから保護する
スケールインから保護するには以下のようにprotect-from-scale-inにtrueを指定します。
az vmss update \ --resource-group <リソースグループ名> \ --name <仮想マシンスケールセット名> \ --instance-id <インスタンスID> \ --protect-from-scale-in true
動作確認のため、ゾーン1に属する仮想マシンに対して「スケールインから保護する」を設定します。
INSTANCE_IDS=$(az vmss list-instances \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --query "[? zones[0]=='1'].instanceId" \ --output tsv ) echo ${INSTANCE_IDS} | while read id do az vmss update \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --instance-id ${id} \ --protect-from-scale-in true done
インスタンス保護をポータルから確認するならば、「すべてのサービス」から「コンピューティング」「Virtual Machine Scale Sets」「仮想マシンスケールセット名(MyScaleSet01)」「インスタンス」の順に画面遷移します。
CLIならば、以下のようなshowコマンドを使用します。
$ az vmss list-instances \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --query "[? zones[0]=='1'].protectionPolicy" [ { "protectFromScaleIn": true, "protectFromScaleSetActions": false }, { "protectFromScaleIn": true, "protectFromScaleSetActions": false }, { "protectFromScaleIn": true, "protectFromScaleSetActions": false } ]
スケール セット アクションから保護する
スケール セット アクションから保護するには以下のようにprotect-from-scale-set-actionsにtrueを指定します。
az vmss update \ --resource-group <リソースグループ名> \ --name <仮想マシンスケールセット名> \ --instance-id <インスタンスID> \ --protect-from-scale-set-actions true
動作確認のため、ゾーン1に属する仮想マシンに対して「スケールインから保護する」を設定します。
INSTANCE_IDS=$(az vmss list-instances \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --query "[? zones[0]=='2'].instanceId" \ --output tsv ) echo ${INSTANCE_IDS} | while read id do az vmss update \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --instance-id ${id} \ --protect-from-scale-set-actions true done
インスタンス保護をポータルから確認するならば、「すべてのサービス」から「コンピューティング」「Virtual Machine Scale Sets」「仮想マシンスケールセット名(MyScaleSet01)」「インスタンス」の順に画面遷移します。
CLIならば、以下のようなshowコマンドを使用します。
$ az vmss list-instances \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --query "[? zones[0]=='2'].protectionPolicy" [ { "protectFromScaleIn": true, "protectFromScaleSetActions": true }, { "protectFromScaleIn": true, "protectFromScaleSetActions": true }, { "protectFromScaleIn": true, "protectFromScaleSetActions": true } ]
インスタンス保護の動作確認
スケールイン
「スケールインから保護する」または「スケール セット アクションから保護する」のいずれかの保護が設定されている仮想マシンは、スケールインの対象外になります。これを動作確認してみましょう。
まずは現在の仮想マシンの一覧を把握します。
$ az vmss list-instances \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --query "[].{instanceId:instanceId, name:name, zone:zones[0] }" \ --output table InstanceId Name Zone ------------ --------------- ------ 0 MyScaleSet01_0 1 2 MyScaleSet01_2 2 3 MyScaleSet01_3 3 4 MyScaleSet01_4 1 5 MyScaleSet01_5 2 8 MyScaleSet01_8 2 9 MyScaleSet01_9 3 10 MyScaleSet01_10 3 11 MyScaleSet01_11 1
仮想マシンを9台から6台へ減らすスケールインのルールを設定します。
az monitor autoscale create \ --resource-group MyResourceGroup \ --resource-type Microsoft.Compute/virtualMachineScaleSets \ --resource MyScaleSet01 \ --name Autoscale01 \ --min-count 6 \ --max-count 9 \ --count 6 az monitor autoscale rule create \ --resource-group MyResourceGroup \ --autoscale-name Autoscale01 \ --condition "Percentage CPU < 20 avg 1m" \ --cooldown 1 \ --scale in 1
「スケールインから保護する」も「スケール セット アクションから保護する」も設定されていない仮想マシンがスケールインの対象になります。可用性ゾーン1に対して「スケールインから保護する」を、可用性ゾーン2に対して「スケール セット アクションから保護する」を設定していますので、削除されるのは可用性ゾーン3のみになります。
しばらく待ってから仮想マシン一覧を確認すると、可用性ゾーン3の仮想マシンが削除され、可用性ゾーン1と2のみに仮想マシンが配置されている事が分かります。
$ az vmss list-instances \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --query "[].{instanceId:instanceId, name:name, zone:zones[0] }" \ --output table InstanceId Name Zone ------------ --------------- ------ 0 MyScaleSet01_0 1 2 MyScaleSet01_2 2 4 MyScaleSet01_4 1 5 MyScaleSet01_5 2 8 MyScaleSet01_8 2 11 MyScaleSet01_11 1
スケール セット アクション
「スケール セット アクションから保護する」が設定されている仮想マシンは、仮想マシンスケールセットからの操作(アップグレード、再イメージ化、割り当て解除など)から保護されます。
新バージョンのアプリケーションデプロイから保護するか否かが実践で多く見られるシナリオかと思いますが、アプリケーションの準備が手間なので、このページでは簡単に動作確認できるvm-skuの変更を例に挙げて説明します。動作確認のためvm-skuを「Standard_B1s」から「Standard_DS1_v2」に変更します。
az vmss update \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --vm-sku Standard_DS1_v2
仮想マシンスケールセットのアップグレードポリシーをデフォルト設定の「手動」から「自動」に変更します。
az vmss update \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --set upgradePolicy.mode=Automatic
仮想マシンのskuを確認します。すると、「スケール セット アクションから保護する」が設定された可用性ゾーン2の仮想マシン群はアップグレードされていない事が分かります。
$ az vmss list-instances \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --query "[].{name:name, zone:zones[0], sku:sku.name }" \ --output table Name Zone Sku --------------- ------ --------------- MyScaleSet01_0 1 Standard_DS1_v2 MyScaleSet01_2 2 Standard_B1s MyScaleSet01_4 1 Standard_DS1_v2 MyScaleSet01_5 2 Standard_B1s MyScaleSet01_8 2 Standard_B1s MyScaleSet01_11 1 Standard_DS1_v2
補足
リソースの競合
Azureの公式マニュアルを見ると、以下のように引数idsに複数の仮想マシンを指定した操作例が示されています。更新対象のリソースによっては処理が競合してうまくいかない事もありますので、注意ください。競合した時は競合した旨の警告メッセージが明記さています。
「@-」はパイプで渡された入力が格納された値が格納されています。
az vmss list-instances \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --query "[? zones[0]=='1'].id" \ --output tsv | \ az vmss update \ --ids @- \ --protect-from-scale-in true
今回の操作では競合する可能性がありますので、このサイトでは時間はかかるものの確実に1台ずつ更新する以下のような操作例を示しています。
INSTANCE_IDS=$(az vmss list-instances \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --query "[? zones[0]=='2'].instanceId" \ --output tsv ) echo ${INSTANCE_IDS} | while read id do az vmss update \ --resource-group MyResourceGroup \ --name MyScaleSet01 \ --instance-id ${id} \ --protect-from-scale-set-actions true done