仮想マシン スケール セットを変更する

注意

このドキュメントで示されている手順の多くは、均一オーケストレーション モードを使用する Virtual Machine Scale Sets に適用されます。 新しいワークロードにはフレキシブル オーケストレーションを使用することをお勧めします。 詳細については、「Azure の仮想マシン スケール セットのオーケストレーション モード」を参照してください。

アプリケーションのライフサイクルを通して、仮想マシン スケール セットを変更したり更新したりすることが必要になる場合があります。 スケール セットの構成を更新したりアプリケーションの構成を変更したりする際の方法が、こうした更新の対象になることもあります。 この記事では、REST API、Azure PowerShell、Azure CLI を使って、既存のスケール セットに変更を加える方法を説明します。

基本的な概念

スケール セット モデル

スケール セットには、スケール セット全体の "望ましい" 状態をキャプチャする "スケール セット モデル" があります。 スケール セット モデルは、次の方法で照会することができます。

  • REST API (compute/virtualmachinescalesets/get)

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet?api-version={apiVersion}
    
  • Azure PowerShell (Get-AzVmss)

    Get-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet"
    
  • Azure CLI (az vmss show)

    az vmss show --resource-group myResourceGroup --name myScaleSet
    
  • その他、resources.azure.com や言語固有の Azure SDK を使う方法もあります。

出力の正確な表示は、コマンドに指定したオプションによって異なります。 次の例は、Azure CLI から得たサンプル出力の抜粋です。

az vmss show --resource-group myResourceGroup --name myScaleSet
{
  "location": "westus",
  "overprovision": true,
  "plan": null,
  "singlePlacementGroup": true,
  "sku": {
    "additionalProperties": {},
    "capacity": 1,
    "name": "Standard_D2_v2",
    "tier": "Standard"
  },
}

これらのプロパティはスケール セット全体に適用されます。

スケール セットのインスタンス ビュー

スケール セットには、スケール セット全体の現在の "ランタイム" 状態をキャプチャする "スケール セットのインスタンス ビュー" もあります。 スケール セットのインスタンス ビューのクエリを実行するには、以下を使用できます。

  • REST API (compute/virtualmachinescalesets/getinstanceview)

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/instanceView?api-version={apiVersion}
    
  • Azure PowerShell (Get-AzVmss)

    Get-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -InstanceView
    
  • Azure CLI (az vmss get-instance-view)

    az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet
    
  • その他、resources.azure.com や言語固有の Azure SDK を使う方法もあります

出力の正確な表示は、コマンドに指定したオプションによって異なります。 次の例は、Azure CLI から得たサンプル出力の抜粋です。

$ az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet
{
  "statuses": [
    {
      "additionalProperties": {},
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": null,
      "time": "{time}"
    }
  ],
  "virtualMachine": {
    "additionalProperties": {},
    "statusesSummary": [
      {
        "additionalProperties": {},
        "code": "ProvisioningState/succeeded",
        "count": 1
      }
    ]
  }
}

これらのプロパティは、スケールセット内の VM の現在のランタイム状態の概要を示します (スケール セットに適用された拡張機能の状態など)。

スケール セットの VM モデル ビュー

スケール セットにモデル ビューがあるのと同様に、スケール セット内の各 VM インスタンスには独自のモデル ビューがあります。 スケール セットで特定の VM インスタンスに関してモデル ビューにクエリを実行するには、以下を使用できます。

  • REST API (compute/virtualmachinescalesetvms/get)

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/virtualmachines/instanceId?api-version={apiVersion}
    
  • Azure PowerShell (Get-AzVmssVm)

    Get-AzVmssVm -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -InstanceId instanceId
    
  • Azure CLI (az vmss show)

    az vmss show --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
    
  • その他、resources.azure.comAzure SDK を使う方法もあります。

出力の正確な表示は、コマンドに指定したオプションによって異なります。 次の例は、Azure CLI から得たサンプル出力の抜粋です。

$ az vmss show --resource-group myResourceGroup --name myScaleSet
{
  "location": "westus",
  "name": "{name}",
  "sku": {
    "name": "Standard_D2_v2",
    "tier": "Standard"
  },
}

これらのプロパティは、スケール セット全体の構成ではなく、スケール セット内の VM インスタンスの構成を示しています。 たとえば、スケール セット モデルにはプロパティとして overprovision がありますが、スケール セット内の VM インスタンスのモデルにはありません。 この違いは、オーバープロビジョニングがスケール セット内の個々の VM インスタンスではなくスケール セット全体のプロパティであることが原因です (オーバープロビジョニングについて詳しくは、「スケール セットの設計上の考慮事項」をご覧ください)。

スケール セットの VM インスタンス ビュー

スケール セットにインスタンス ビューがあるのと同様に、スケール セット内の各 VM インスタンスには独自のインスタンス ビューがあります。 スケール セット内の特定の VM インスタンスに関してインスタンス ビューにクエリを実行するには、以下を使用できます。

  • REST API (compute/virtualmachinescalesetvms/getinstanceview)

    GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/virtualmachines/instanceId/instanceView?api-version={apiVersion}
    
  • Azure PowerShell (Get-AzVmssVm)

    Get-AzVmssVm -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -InstanceId instanceId -InstanceView
    
  • Azure CLI (az vmss get-instance-view)

    az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
    
  • その他、resources.azure.comAzure SDK を使う方法もあります

出力の正確な表示は、コマンドに指定したオプションによって異なります。 次の例は、Azure CLI から得たサンプル出力の抜粋です。

$ az vmss get-instance-view --resource-group myResourceGroup --name myScaleSet --instance-id instanceId
{
  "additionalProperties": {
    "osName": "ubuntu",
    "osVersion": "16.04"
  },
  "disks": [
    {
      "name": "{name}",
      "statuses": [
        {
          "additionalProperties": {},
          "code": "ProvisioningState/succeeded",
          "displayStatus": "Provisioning succeeded",
          "time": "{time}"
        }
      ]
    }
  ],
  "statuses": [
    {
      "additionalProperties": {},
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "time": "{time}"
    },
    {
      "additionalProperties": {},
      "code": "PowerState/running",
      "displayStatus": "VM running"
    }
  ],
  "vmAgent": {
    "statuses": [
      {
        "additionalProperties": {},
        "code": "ProvisioningState/succeeded",
        "displayStatus": "Ready",
        "level": "Info",
        "message": "Guest Agent is running",
        "time": "{time}"
      }
    ],
    "vmAgentVersion": "{version}"
  },
}

これらのプロパティは、スケール セット内の VM インスタンスの現在のランタイム状態を示しています。これには、スケール セットに適用された拡張機能が含まれます。

グローバル スケール セットのプロパティの更新方法

グローバル スケール セットのプロパティを更新するには、スケール セット モデルのプロパティを更新する必要があります。 この更新は以下を使用して実行できます。

  • REST API (compute/virtualmachinescalesets/createorupdate)

    PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet?api-version={apiVersion}
    
  • REST API からプロパティを使用して Resource Manager テンプレートをデプロイすることで、グローバル スケール セットのプロパティを更新することもできます。

  • Azure PowerShell (Update-AzVmss)

    Update-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -VirtualMachineScaleSet {scaleSetConfigPowershellObject}
    
  • Azure CLI (az vmss update)

    • プロパティを変更する:

      az vmss update --set {propertyPath}={value}
      
    • スケール セットのリスト プロパティにオブジェクトを追加する:

      az vmss update --add {propertyPath} {JSONObjectToAdd}
      
    • スケール セットのリスト プロパティからオブジェクトを削除する:

      az vmss update --remove {propertyPath} {indexToRemove}
      
    • az vmss create コマンドを使用してスケール セットを既にデプロイした場合は、az vmss create コマンドをもう一度実行してスケール セットを更新できます。 変更するプロパティを除き、az vmss create コマンドのすべてのプロパティが以前と同じであることを確認してください。

  • その他、resources.azure.comAzure SDK を使う方法もあります。

スケール セット モデルを更新すると、スケール セットに作成された新しい VM に新しい構成が適用されます。 ただし、スケール セット内の既存の VM のモデルは、最新の全体的なスケール セット モデルで最新の状態にされている必要があります。 各 VM のモデルでは、latestModelApplied というブール型のプロパティがあります。このプロパティは、VM が最新の全体的なスケール セット モデルで最新の状態にされているかどうかを示します (true は VM が最新のモデルで最新の状態になっていることを意味します)。

変更に制限のあるプロパティ

作成時のプロパティ

一部のプロパティは、スケール セットの作成時にのみ設定できます。 たとえば、マネージド OS ディスクのストレージ アカウントの種類や障害ドメインなどがあります。

現在の値に基づいてのみ変更できるプロパティ

一部のプロパティは、現在の値に基づく例外付きで変更できます。 これには次のようなプロパティがあります。

  • singlePlacementGroup
  • サブネット
  • imageReferenceSku
  • imageReferenceOffer
  • Availability Zones (プレビュー)

例 1

別の OS バージョンを使用するようにスケール セットを更新するには、更新されたすべてのプロパティを 1 回の呼び出しで設定する必要があります。 この例では、Unbuntu Server 20.04 から 22.04 に変更しています。

az vmss update \
--resource-group myResourceGroup \
--name myScaleSet \
--set virtualMachineProfile.storageProfile.imageReference.offer=0001-com-ubuntu-server-jammy \
--set virtualMachineProfile.storageProfile.imageReference.publisher=Canonical \
--set virtualMachineProfile.storageProfile.imageReference.sku=22_04-lts-gen2 \
--set virtualMachineProfile.storageProfile.imageReference.version=latest

例 2

別の OS バージョンを使用するようにスケール セットを更新するには、更新されたすべてのプロパティを 1 回の呼び出しで設定する必要があります。 この例では、Windows Server 2016 から Windows Server 2019 に変更しています。

$VMSS = Get-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet"

Set-AzVmssStorageProfile $vmss `
    -OsDiskCreateOption "FromImage" `
    -ImageReferencePublisher "MicrosoftWindowsServer" `
    -ImageReferenceOffer "WindowsServer" `
    -ImageReferenceSku "2019-datacenter" `
    -ImageReferenceVersion "latest"

Update-AzVmss -ResourceGroupName "myResourceGroup" -Name "myScaleSet" -VirtualMachineScaleSet $VMSS

変更するために割り当て解除が必要なプロパティ

一部のプロパティは、スケール セット内の VM の割り当てが解除されている場合に、特定の値にのみ変更できます。 これには次のようなプロパティがあります。

  • SKU 名 - スケール セットが現在存在するハードウェアで新しい VM SKU がサポートされていない場合は、SKU 名を変更する前にスケール セット内の VM の割り当てを解除する必要があります。 詳細については、Azure VM のサイズを変更する方法に関するページを参照してください。

VM 固有の更新

特定の変更は、グローバル スケール セットのプロパティではなく特定の VM に適用できます。 現在サポートされている唯一の VM 固有の更新は、スケール セット内の VM との間でのデータ ディスクのアタッチ/デタッチです。 この機能はプレビュー段階にあります。 詳しくは、プレビュー ドキュメントをご覧ください。

シナリオ

アプリケーションの更新

拡張機能を通じてアプリケーションがスケール セットにデプロイされている場合、拡張機能の構成を更新すると、アップグレード ポリシーに従ってアプリケーションが更新されます。 たとえば、カスタム スクリプト拡張機能で実行するスクリプトの新しいバージョンがある場合は、新しいスクリプトを指すように fileUris プロパティを更新できます。 場合によっては、拡張機能の構成が変更されていない場合でも、強制的に更新したいことがあります (たとえば、スクリプトの URI を変更せずにスクリプトを更新した場合など)。 このような場合は、強制的に更新するように forceUpdateTag を変更することができます。 Azure プラットフォームはこのプロパティを解釈しません。 その値を変更しても、拡張機能の動作は変わりません。 変更しても、拡張機能が強制的に再実行されるだけです。 forceUpdateTag について詳しくは、拡張機能の REST API ドキュメントをご覧ください。 forceUpdateTag はカスタム スクリプト拡張機能だけでなく、すべての拡張機能で使用できることに注意してください。

カスタム イメージを使用してアプリケーションをデプロイするのも一般的です。 このシナリオについては、次のセクションで説明します。

OS の更新

Azure プラットフォーム イメージを使用している場合は、imageReference を変更してイメージを更新することができます (詳しくは、REST API のドキュメントをご覧ください)。

Note

プラットフォーム イメージでは、イメージ参照バージョンに "最新" を指定することが一般的です。 作成、スケール アウト、再イメージ化を行うと、VM が使用可能な最新バージョンで作成されます。 ただし、新しいイメージ バージョンがリリースされたときに OS イメージが自動的に更新されることは意味しません。 別の機能によって、OS の自動更新が提供されます。 詳しくは、OS アップグレードのドキュメントをご覧ください。

カスタム イメージを使用している場合は、imageReference ID を更新してイメージを更新することができます (詳しくは、REST API のドキュメントをご覧ください)。

スケール セットの OS イメージの更新

古いバージョンの Ubuntu LTS 16.04 を実行するスケール セットがあるとします。 新しいバージョンの Ubuntu LTS 16.04 (バージョン 16.04.201801090 など) に更新する必要があります。 イメージ参照バージョン プロパティは一覧に含まれないため、次のいずれかのコマンドでこれらのプロパティを直接変更できます。

  • Azure PowerShell (Update-AzVmss)

    Update-AzVmss -ResourceGroupName "myResourceGroup" -VMScaleSetName "myScaleSet" -ImageReferenceVersion 16.04.201801090
    
  • Azure CLI (az vmss update)

    az vmss update --resource-group myResourceGroup --name myScaleSet --set virtualMachineProfile.storageProfile.imageReference.version=16.04.201801090
    

または、スケール セットで使用されるイメージを変更したい場合があります。 たとえば、スケール セットで使用されるカスタム イメージを更新または変更したいような場合です。 イメージ参照 ID プロパティを更新することにより、スケール セットで使用されるイメージを変更できます。 イメージ参照 ID プロパティは一覧に含まれないため、次のいずれかのコマンドでこのプロパティを直接変更できます。

  • Azure PowerShell (Update-AzVmss)

    Update-AzVmss `
        -ResourceGroupName "myResourceGroup" `
        -VMScaleSetName "myScaleSet" `
        -ImageReferenceId /subscriptions/{subscriptionID}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myNewImage
    
  • Azure CLI (az vmss update)

    az vmss update \
        --resource-group myResourceGroup \
        --name myScaleSet \
        --set virtualMachineProfile.storageProfile.imageReference.id=/subscriptions/{subscriptionID}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/images/myNewImage
    

スケール セットのロード バランサーの更新

Azure Load Balancer を使用するスケール セットがあり、Azure Load Balancer を Azure Application Gateway で置換するとします。 スケール セットのロード バランサーと Application Gateway のプロパティは一覧に含まれるため、プロパティを直接変更する代わりに一覧の要素を削除または追加するコマンドを使用できます。

  • Azure PowerShell:

    # Get the current model of the scale set and store it in a local PowerShell object named $vmss
    $vmss=Get-AzVmss -ResourceGroupName "myResourceGroup" -Name "myScaleSet"
    
    # Create a local PowerShell object for the new desired IP configuration, which includes the reference to the application gateway
    $ipconf = New-AzVmssIPConfig -ApplicationGatewayBackendAddressPoolsId /subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/{applicationGatewayBackendAddressPoolName} -SubnetId $vmss.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations[0].IpConfigurations[0].Subnet.Id -Name $vmss.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations[0].IpConfigurations[0].Name
    
    # Replace the existing IP configuration in the local PowerShell object (which contains the references to the current Azure Load Balancer) with the new IP configuration
    $vmss.VirtualMachineProfile.NetworkProfile.NetworkInterfaceConfigurations[0].IpConfigurations[0] = $ipconf
    
    # Update the model of the scale set with the new configuration in the local PowerShell object
    Update-AzVmss -ResourceGroupName "myResourceGroup" -Name "myScaleSet" -virtualMachineScaleSet $vmss
    
  • Azure CLI:

    # Remove the load balancer backend pool from the scale set model
    az vmss update --resource-group myResourceGroup --name myScaleSet --remove virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].loadBalancerBackendAddressPools 0
    
    # Remove the load balancer backend pool from the scale set model; only necessary if you have NAT pools configured on the scale set
    az vmss update --resource-group myResourceGroup --name myScaleSet --remove virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].loadBalancerInboundNatPools 0
    
    # Add the application gateway backend pool to the scale set model
    az vmss update --resource-group myResourceGroup --name myScaleSet --add virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].ipConfigurations[0].ApplicationGatewayBackendAddressPools '{"id": "/subscriptions/{subscriptionId}/resourceGroups/myResourceGroup/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/{applicationGatewayBackendPoolName}"}'
    

注意

これらのコマンドでは、スケール セットの IP 構成とロード バランサーが 1 つだけであると想定されます。 複数ある場合は、0 以外のリスト インデックスを使用する必要があります。

次のステップ

スケール セットに関する一般的な管理タスクは、Azure CLI または Azure PowerShell を使用して実行することもできます。