スケール セット インスタンスは、インスタンス終了通知の受信をオプトインし、定義済みの遅延タイムアウトを終了操作に設定できます。 終了通知は、Azure Metadata Service – スケジュールされたイベントを通じて送信されます。これにより、再起動や再デプロイなどの影響を受ける操作の通知と遅延が提供されます。 このソリューションでは、スケジュールされたイベントの一覧に別のイベント (Terminate) を追加します。終了イベントの関連する遅延は、スケール セット モデルの構成でユーザーが指定した遅延制限に依存します。
適切なメタデータ サービス エンドポイントを呼び出してスケジュールされたイベントに登録した後、スケール セット インスタンスは、インスタンスが削除される前に、指定されたタイムアウトの有効期限が切れるのを待つ必要はありません。 Terminate 通知を受け取った後、インスタンスは、終了タイムアウトの有効期限が切れる前にいつでも削除することを選択できます。 スポット インスタンスで終了通知を有効にすることはできません。 スポット インスタンスの詳細については、仮想マシン スケール セットの Azure スポット仮想マシンに関するページを参照してください。
終了通知を有効にする
スケール セット インスタンスで終了通知を有効にする方法は複数あります。次の例で詳しく説明します。
Azure Portal
次の手順では、新しいスケール セットの作成時に終了通知を有効にします。
- 仮想マシン スケール セットに移動します。
- [+ 追加] を選択して、新しいスケール セットを作成します。
- [ 管理 ] タブに移動します。
- [インスタンス終了] セクションを見つけます。
- [インスタンスの終了通知] で、[オン] を選択します。
- 終了遅延 (分) の場合は、必要な既定のタイムアウトを設定します。
- 新しいスケール セットの作成が完了したら、[確認と作成] ボタンを選択します。
既存のスケール セットで終了通知を有効にすることもできます。
- 目的のスケール セットに移動します
- [構成] タブに移動する
- [インスタンス終了通知を有効にする] で、[オン] を選択します。
- 終了遅延 (分) の場合は、必要な既定のタイムアウトを設定します。
- [ 保存] ボタンを 選択します。
REST API
次の例では、スケール セット モデルで終了通知を有効にします。
PUT on `/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachineScaleSets/{vmScaleSetName}?api-version=2019-03-01`
{
"properties": {
"virtualMachineProfile": {
"scheduledEventsProfile": {
"terminateNotificationProfile": {
"notBeforeTimeout":"PT5M",
"enable":true
}
}
}
}
}
上記のブロックは、スケール セット内のすべてのインスタンスに対する終了操作のタイムアウト遅延を 5 分 ( PT5M で示されます) に指定します。 notBeforeTimeout フィールドは、ISO 8601 形式で 5 ~ 15 分の任意の値を取ることができます。 終了操作の既定のタイムアウトを変更するには、前述の terminateNotificationProfile で notBeforeTimeout プロパティを変更します。
スケール セット モデルで scheduledEventsProfile を有効にし、 notBeforeTimeout を設定した後、変更を反映するように個々のインスタンスを 最新のモデル に更新します。
注
スケール セット インスタンスでの終了通知は、API バージョン 2019-03-01 以降でのみ有効にすることができます
Azure PowerShell
新しいスケール セットを作成するときに、 New-AzVmssConfig コマンドレットを使用してスケール セットで終了通知を有効にすることができます。
このサンプル スクリプトでは、構成ファイルを使用したスケール セットと関連リソースの作成について説明します (完全な仮想マシン スケール セットを作成する)。 パラメーター TerminateScheduledEvents と TerminateScheduledEventNotBeforeTimeoutInMinutes をスケール セットを作成するための構成オブジェクトに追加することで、"終了の構成" 通知を提供できます。 次の例では、10 分の遅延タイムアウトで機能を有効にします。
重要
2023 年 11 月以降、PowerShell と Azure CLI を使用して作成された VM スケール セットは、オーケストレーション モードが指定されていない場合、既定でフレキシブル オーケストレーション モードになります。 この変更の詳細と実行する必要があるアクションについては、「VMSS PowerShell/CLI のお客様向けの重大な変更 - Microsoft Community Hub」を参照してください
New-AzVmssConfig `
-Location "VMSSLocation" `
-SkuCapacity 2 `
-OrchestrationMode "Flexible" `
-SkuName "Standard_DS2" `
-TerminateScheduledEvents $true `
-TerminateScheduledEventNotBeforeTimeoutInMinutes 10
既存のスケール セットで終了通知を有効にするには 、Update-AzVmss コマンドレットを使用します。
Update-AzVmss `
-ResourceGroupName "myResourceGroup" `
-VMScaleSetName "myScaleSet" `
-TerminateScheduledEvents $true `
-TerminateScheduledEventNotBeforeTimeoutInMinutes 15
上記の例では、既存のスケール セットで終了通知を有効にし、終了イベントに 15 分のタイムアウトを設定します。
スケール セット モデルでスケジュールされたイベントを有効にし、タイムアウトを設定したら、個々のインスタンスを 最新のモデル に更新して変更を反映します。
Azure CLI 2.0
次の例は、新しいスケール セットの作成時に終了通知を有効にするためのものです。
az group create --name <myResourceGroup> --location <VMSSLocation>
az vmss create \
--resource-group <myResourceGroup> \
--name <myVMScaleSet> \
--image Ubuntu2204 \
--admin-username <azureuser> \
--generate-ssh-keys \
--terminate-notification-time 10
上の例では、最初にリソース グループを作成し、次に 10 分間の既定のタイムアウトに対して終了通知を有効にして新しいスケール セットを作成します。
次の例は、既存のスケール セットで終了通知を有効にするためのものです。
az vmss update \
--resource-group <myResourceGroup> \
--name <myVMScaleSet> \
--enable-terminate-notification true \
--terminate-notification-time 10
終了通知を取得する
終了通知は、Azure メタデータ サービスである スケジュールされたイベントを通じて配信されます。 Azure メタデータ サービスは、VM 内からアクセスできる REST エンドポイントを使用して仮想マシンを実行する方法に関する情報を公開します。 この情報は、VM の外部に公開されないように、ルーティング不可能な IP を介して使用できます。
Scheduled Events は、ユーザーが初めてイベントを要求したときに、スケール セットに対して有効になります。 最初の呼び出しで最大 2 分の遅延応答が予想されます。 エンドポイントに定期的にクエリを実行して、今後のメンテナンス イベントと進行中のメンテナンス アクティビティの状態を検出します。
スケール セット インスタンスが 24 時間以内に要求を行わない場合、スケール セットのスケジュールされたイベント機能は無効になります。
エンドポイント検出
VNET 対応 VM の場合、メタデータ サービスはルーティング不可能な静的 IP (169.254.169.254) から使用できます。
Scheduled Events の最新バージョンのフル エンドポイントは次のとおりです。
http://169.254.169.254/metadata/scheduledevents?api-version=2019-01-01
クエリ応答
応答には、スケジュールされたイベントの配列が含まれています。 空の配列は、現在スケジュールされているイベントがないことを意味します。
スケジュールされたイベントがある場合は、応答にイベントの配列が含まれます。 "Terminate" イベントの場合、応答は次のようになります。
{
"DocumentIncarnation": {IncarnationID},
"Events": [
{
"EventId": {eventID},
"EventType": "Terminate",
"ResourceType": "VirtualMachine",
"Resources": [{resourceName}],
"EventStatus": "Scheduled",
"NotBefore": {timeInUTC},
}
]
}
DocumentIncarnation は ETag であり、イベント ペイロードが前回のクエリ以降に変更されたかどうかを簡単に調べることができます。
上記の各フィールドの詳細については、 Windows と Linux のスケジュールされたイベントに関するドキュメントを参照してください。
イベントに応答する
今後のイベントについて学習し、グレースフル シャットダウンのロジックを完了したら、EventId を使用してメタデータ サービスに POST 呼び出しを行うことで、未処理のイベントを承認できます。 POST 呼び出しは、VM の削除を続行できることを Azure に示します。
POST 要求本文で想定される json を次に示します。 要求には、StartRequests の一覧が含まれている必要があります。 各 StartRequest には、迅速化するイベントの EventId が含まれています。
{
"StartRequests" : [
{
"EventId": {EventId}
}
]
}
スケール セット内のすべての VM が、その VM のみに関連する EventID のみを承認していることを確認します。 VM は、 インスタンス メタデータを使用して独自の VM 名を取得できます。 この名前は "{scale-set-name}_{instance-id}" という形式になり、上記のクエリ応答の [リソース] セクションに表示されます。
Python のイベントに対してクエリを実行して応答するためのサンプル スクリプトを参照することもできます。
ヒントとベスト プラクティス
- 'delete' 操作でのみ通知を終了する – スケール セットで scheduledEventsProfile が有効になっている場合、すべての削除操作 (手動削除または自動スケール開始スケールイン) によって Terminate イベントが生成されます。 再起動、再イメージ化、再デプロイ、停止/割り当て解除などの他の操作では、Terminate イベントは生成されません。
- タイムアウトの待機は必須ではありません。イベントを受信した後、およびイベントの NotBefore 時間の有効期限が切れる前に、いつでも終了操作を開始できます。
- タイムアウト時の必須の削除 – イベントが生成された後にタイムアウト値を拡張する機能はありません。 タイムアウトが切れると、保留中の終了イベントが処理され、VM が削除されます。
- 変更可能なタイムアウト値 – インスタンスが削除される前に、スケール セット モデルの notBeforeTimeout プロパティを変更し、VM インスタンスを最新のモデルに更新することで、いつでもタイムアウト値を変更できます。
- 保留中のすべての削除を承認する – 承認されていないVM_1に保留中の削除があり、VM_2で別の終了イベントを承認した場合、VM_1の終了イベントが承認されるか、タイムアウトが経過するまで、VM_2は削除されません。 VM_1の終了イベントを承認すると、VM_1とVM_2の両方が削除されます。
- すべての同時削除を承認する – 上記の例を拡張します。VM_1とVM_2の NotBefore 時間が同じである場合は、両方の終了イベントを承認するか、タイムアウトの期限が切れる前にどちらの VM も削除しない必要があります。
トラブルシューティング
scheduledEventsProfile を有効にできない
"'VirtualMachineProfile' 型のオブジェクトでメンバー 'scheduledEventsProfile' が見つかりませんでした" というエラー メッセージが表示された 'BadRequest' エラーが発生した場合は、スケール セット操作に使用されている API バージョンを確認してください。 コンピューティング API バージョン 2019-03-01 以降が必要です。
Terminate イベントを取得できない
スケジュールされたイベントを使用して Terminate イベントを取得していない場合は、イベントの取得に使用される API バージョンを確認します。 Terminate イベントには、Metadata Service API バージョン 2019-01-01 以降が必要です。
http://169.254.169.254/metadata/scheduledevents?api-version=2019-01-01
正しくない NotBefore 時間で Terminate イベントを受け取る
スケール セット モデルで scheduledEventsProfile を有効にし、 notBeforeTimeout を設定した後、変更を反映するように個々のインスタンスを 最新のモデル に更新します。
次のステップ
Virtual Machine Scale Sets に自分のアプリケーションをデプロイする方法を学習します。