🔧

Azure VMを可用性セットから外す

2023/04/05に公開

可用性セットのVMをDedicated hostに移行する際など、可用性セットからVMを外したくなった場合の手順

何をしなければいけないか

可用性セットからVMを外すことはできずVMを再作成する必要があります。
(作成後のVMを後から可用性セットに追加することもできません。)

方法

https://learn.microsoft.com/ja-jp/azure/virtual-machines/windows/change-availability-set
このドキュメントにあるPowershell を少しカスタマイズして実施します。

スクリプトではVMのCPU・メモリ部分のみを削除して、ディスクとNICは既存のリソースを新しいVMにアタッチすることで、データに対する影響やネットワーク設定に対する影響を最小限にとどめています。

# Set variables
$resourceGroup = "myrg"
$vmName = "myVM"

# Get the details of the VM to be moved to the dedicated host
$originalVM = Get-AzVM `
    -ResourceGroupName $resourceGroup `
    -Name $vmName
 
# Remove the original VM
Remove-AzVM -ResourceGroupName $resourceGroup -Name $vmName

# Create the basic configuration for the replacement VM.
$newVM = New-AzVMConfig `
    -VMName $originalVM.Name `
    -VMSize $originalVM.HardwareProfile.VmSize `
    -Tags $originalVM.Tags
    
# For a Linux VM, change the last parameter from -Windows to -Linux
if($originalVM.StorageProfile.OSdisk.OsType -eq "Windows"){
    Set-AzVMOSDisk `
        -VM $newVM -CreateOption Attach `
        -ManagedDiskId $originalVM.StorageProfile.OsDisk.ManagedDisk.Id `
        -Name $originalVM.StorageProfile.OsDisk.Name `
        -Windows
}else{
    Set-AzVMOSDisk `
        -VM $newVM -CreateOption Attach `
        -ManagedDiskId $originalVM.StorageProfile.OsDisk.ManagedDisk.Id `
        -Name $originalVM.StorageProfile.OsDisk.Name `
        -Linux
}

# Add Data Disks
foreach ($disk in $originalVM.StorageProfile.DataDisks) { 
    Add-AzVMDataDisk -VM $newVM `
        -Name $disk.Name `
        -ManagedDiskId $disk.ManagedDisk.Id `
        -Caching $disk.Caching `
        -Lun $disk.Lun `
        -DiskSizeInGB $disk.DiskSizeGB `
        -CreateOption Attach
}

# Add NIC(s) and keep the same NIC as primary; keep the Private IP too, if it exists.
foreach ($nic in $originalVM.NetworkProfile.NetworkInterfaces) {	
    if ($nic.Primary -eq "True"){
        Add-AzVMNetworkInterface `
            -VM $newVM `
            -Id $nic.Id -Primary
    }else{
        Add-AzVMNetworkInterface `
        -VM $newVM `
        -Id $nic.Id 
    }
}

# Add Windows Hybrid Benefit
if($originalVM.LicenseType -eq "Windows_Server"){
    $newVM.LicenseType = "Windows_Server"
}

# Set Boot Diagnostic
Set-AzVMBootDiagnostic -VM $newVM -Enable

# Recreate the VM
New-AzVM `
    -ResourceGroupName $resourceGroup `
    -Location $originalVM.Location `
    -VM $newVM `
    -DisableBginfoExtension

元々のスクリプトに対して、Zoneの指定やWindowsServerライセンスハイブリッド特典の引継ぎや診断設定、Tagの引継ぎなどが追加されています。

rollback

# Set variables
$resourceGroup = "myrg"
$vmName = "myVM"
$availSetName = "as"

# Get the details of the VM to be moved to the Availability Set
$originalVM = Get-AzVM `
    -ResourceGroupName $resourceGroup `
    -Name $vmName

# Get the details of the Availability Set
$availSet = Get-AzAvailabilitySet `
    -ResourceGroupName $resourceGroup `
    -Name $availSetName 

# Remove the original VM
Remove-AzVM -ResourceGroupName $resourceGroup -Name $vmName

# Create the basic configuration for the replacement VM.
$newVM = New-AzVMConfig `
    -VMName $originalVM.Name `
    -VMSize $originalVM.HardwareProfile.VmSize `
    -Tags $originalVM.Tags `
    -AvailabilitySetId $availSet.Id

# For a Linux VM, change the last parameter from -Windows to -Linux
if($originalVM.StorageProfile.OSdisk.OsType -eq "Windows"){
    Set-AzVMOSDisk `
        -VM $newVM -CreateOption Attach `
        -ManagedDiskId $originalVM.StorageProfile.OsDisk.ManagedDisk.Id `
        -Name $originalVM.StorageProfile.OsDisk.Name `
        -Windows
}else{
    Set-AzVMOSDisk `
        -VM $newVM -CreateOption Attach `
        -ManagedDiskId $originalVM.StorageProfile.OsDisk.ManagedDisk.Id `
        -Name $originalVM.StorageProfile.OsDisk.Name `
        -Linux
}

# Add Data Disks
foreach ($disk in $originalVM.StorageProfile.DataDisks) { 
    Add-AzVMDataDisk -VM $newVM `
        -Name $disk.Name `
        -ManagedDiskId $disk.ManagedDisk.Id `
        -Caching $disk.Caching `
        -Lun $disk.Lun `
        -DiskSizeInGB $disk.DiskSizeGB `
        -CreateOption Attach
}

# Add NIC(s) and keep the same NIC as primary; keep the Private IP too, if it exists.
foreach ($nic in $originalVM.NetworkProfile.NetworkInterfaces) {	
    if ($nic.Primary -eq "True"){
        Add-AzVMNetworkInterface `
            -VM $newVM `
            -Id $nic.Id -Primary
    }else{
        Add-AzVMNetworkInterface `
        -VM $newVM `
        -Id $nic.Id 
    }
}

# Add Windows Hybrid Benefit
if($originalVM.LicenseType -eq "Windows_Server"){
    $newVM.LicenseType = "Windows_Server"
}

# Set Boot Diagnostic
Set-AzVMBootDiagnostic -VM $newVM -Enable

# Recreate the VM
New-AzVM `
    -ResourceGroupName $resourceGroup `
    -Location $originalVM.Location `
    -VM $newVM `
    -DisableBginfoExtension

注意事項

  • VM削除時にディスクやNICも合わせて削除する削除オプションが有効になっていないか
  • basic loadbalancer のバックエンドプールにVMが設定されていないか
  • VMは再作成されることになるので、アプリケーションがこのあたりの値を利用していないか
    https://azure.microsoft.com/nb-no/blog/accessing-and-using-azure-vm-unique-id/
Microsoft (有志)

Discussion