你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure PowerShell 和 CLI 将虚拟机从区域性可用性区域移动到区域可用性区域

本文详细介绍了如何使用 Azure PowerShell 和 CLI cmdlet 将 Azure 单实例 VM 从区域移到区域可用性区域。 可用性区域是 Azure 区域中物理上独立的区域。 使用可用性区域可在整个数据中心发生故障或服务中断(这种情况很少见)时保护应用和数据。

若要使用可用性区域,请在受支持的 Azure 区域中创建虚拟机。

先决条件

在开始移动过程之前,请验证以下要求:

要求 说明
订阅权限 请确保你对包含待移动资源的订阅具有“所有者”访问权限

托管标识需要以下权限:
- 在用户订阅中写入/创建资源的权限,参与者角色具有此权限
- 创建角色分配的权限。 通常,所有者或用户访问管理员角色,或者分配了 Microsoft.Authorization 角色或写入权限的自定义角色具有此权限。 如果已向数据共享资源的托管标识分配对 Azure 数据存储的访问权限,则不需要此权限。
详细了解 Azure 角色。
VM 支持 查看支持的区域。

- 查看支持的计算存储网络设置。
VM 运行状况 在尝试区域移动之前,要移动的 VM 必须处于正常状态。 在尝试移动 VM 区域之前,请确保所有挂起的重新启动和强制更新均已完成,并且虚拟机正在运行且处于正常状态。

查看 PowerShell 和 CLI 要求

无论是使用 Azure 门户还是 PowerShell 或 CLI,大多数移动资源操作都是相同的,只有几个例外。

操作 Portal PowerShell/CLI
创建移动集合 移动集合(要移动的所有 VM 的列表)会自动创建。 所需的标识权限会由门户在后端中分配。 可使用 PowerShell cmdletCLI cmdlet 执行以下操作:
- 为集合分配托管标识。
- 将区域 VM 添加到集合。
资源移动操作 验证步骤并验证用户设置更改。 启动移动会启动移动过程,并在目标区域中创建源 VM 的副本。 它还将完成目标区域中新创建的 VM 的移动。 可使用 PowerShell cmdletCLI cmdlet 执行以下操作:
- 将区域 VM 添加到集合
- 解决依赖项问题
- 执行移动。
- 提交移动。

示例值

在脚本示例中使用以下值:

设置 “值”
订阅 ID subscription-id
移动区域 美国东部
资源组(为移动集合保留元数据) RegionToZone-DemoMCRG
移动集合名称 RegionToZone-DemoMC
移动集合的位置 eastus2euap
IdentityType SystemAssigned
VM 名称 demoVM-MoveResource
移动类型 RegionToZone

登录 Azure

运行 Connect-AzAccount 命令以登录 Azure 订阅,并按照屏幕上的说明操作。

Connect-AzAccount –Subscription "<subscription-id>"

设置移动集合

MoveCollection 对象存储有关要移动的资源的元数据和配置信息。 要设置移动计划,请执行以下操作:

  • 为移动集合创建资源组。
  • 将服务提供程序注册到订阅,以便可以创建 MoveCollection 资源。
  • 创建具有托管标识的 MoveCollection 对象。 为使 MoveCollection 对象能够访问资源转移器服务所在的订阅,它需要一个受订阅信任的系统分配的托管标识(以前称为托管服务标识,MSI)。
  • 为托管标识授予访问资源移动器订阅的权限。

创建资源组

使用以下 cmdlet 通过 New-AzResourceGroup 为移动集合元数据和配置信息创建资源组。 资源组是在其中部署和管理 Azure 资源的逻辑容器。

New-AzResourceGroup -Name "RegionToZone-DemoMCRG" -Location "EastUS"

输出:

输出显示,托管磁盘与 VM 位于相同的可用性区域中:

ResourceGroupName : RegionToZone-DemoMCRG
Location          : eastus
ProvisioningState : Succeeded
Tags              :
                    Name     Value
                    =======  ========
                    Created  20230908

ResourceId        : /subscriptions/<Subscription-id>/resourceGroups/RegionToZone-DemoMCRG

注册资源提供程序

  1. 注册资源提供程序 Microsoft.Migrate,以便可以创建 MoveCollection 资源,如下所示:

    Register-AzResourceProvider -ProviderNamespace Microsoft.Migrate
    
  2. 等待注册:

    While(((Get-AzResourceProvider -ProviderNamespace Microsoft.Migrate)| where {$_.RegistrationState -eq "Registered" -and $_.ResourceTypes.ResourceTypeName -eq "moveCollections"}|measure).Count -eq 0)
    {
        Start-Sleep -Seconds 5
        Write-Output "Waiting for registration to complete."
    }
    

创建 MoveCollection 对象

创建 MoveCollection 对象,并为其分配托管标识,如下所示:

New-AzResourceMoverMoveCollection -Name "RegionToZone-DemoMC"  -ResourceGroupName "RegionToZone-DemoMCRG" -MoveRegion "eastus" -Location "eastus2euap" -IdentityType "SystemAssigned" -MoveType "RegionToZone"

输出:

Etag                                   Location    Name
----                                   --------    ----
"3a00c441-0000-3400-0000-64fac1b30000" eastus2euap RegionToZone-DemoMC

注意

对于区域到区域移动,MoveType 参数应设置为 RegionToZone,MoveRegion 参数应设置为正在进行区域移动的资源所在的位置。 请确保不需要参数 SourceRegionTargetRegion,并且应设置为 null

为托管标识授予访问权限

为托管标识授予访问资源移动器订阅的权限,如下所示。 你必须是订阅所有者。

  1. 检索 MoveCollection 对象的标识详细信息。

    $moveCollection = Get-AzResourceMoverMoveCollection -Name "RegionToZone-DemoMC" -ResourceGroupName "RegionToZone-DemoMCRG"
    $identityPrincipalId = $moveCollection.IdentityPrincipalId
    
  2. 为标识分配所需角色,以便 Azure 资源移动器可以访问你的订阅,以帮助移动资源。 查看移动的必需权限列表。

    New-AzRoleAssignment -ObjectId $identityPrincipalId -RoleDefinitionName Contributor -Scope "/subscriptions/<subscription-id>""
    New-AzRoleAssignment -ObjectId $identityPrincipalId -RoleDefinitionName "User Access Administrator" -Scope "/subscriptions/<subscription-id>"
    

将区域 VM 添加到移动集合

检索想要移动的现有源资源的 ID。 创建目标资源设置对象,然后将资源添加到移动集合。

注意

添加到移动集合的资源必须在同一订阅中,但可以在不同的资源组中。

  1. 按如下所示创建目标资源设置对象:

    $targetResourceSettingsObj = New-Object Microsoft.Azure.PowerShell.Cmdlets.ResourceMover.Models.Api20230801.VirtualMachineResourceSettings
    $targetResourceSettingsObj.ResourceType = "Microsoft.Compute/virtualMachines"
    $targetResourceSettingsObj.TargetResourceName = "RegionToZone-demoTargetVm"
    $targetResourceSettingsObj.TargetAvailabilityZone = "2"
    

    输出

    ResourceType                      TargetResourceGroupName TargetResourceName        TargetAvailabilitySetId TargetAvailabilityZone TargetVMSize UserManagedIdentity
    ------------                      ----------------------- ------------------        ----------------------- ---------------------- ------------ -------------------
    Microsoft.Compute/virtualMachines                         RegionToZone-demoTargetVm                         2
    
  2. 添加资源

    Add-AzResourceMoverMoveResource -ResourceGroupName "RegionToZone-DemoMCRG" -MoveCollectionName "RegionToZone-DemoMC" -SourceId "/subscriptions/<Subscription-id>/resourcegroups/PS-demo-RegionToZone-RG/providers/Microsoft.Compute/virtualMachines/RegionToZone-demoSourceVm" -Name "demoVM-MoveResource" -ResourceSetting $targetResourceSettingsObj
    

    输出

    DependsOn                         : {}
    DependsOnOverride                 : {}
    ErrorsPropertiesCode              :
    ErrorsPropertiesDetail            :
    ErrorsPropertiesMessage           :
    ErrorsPropertiesTarget            :
    ExistingTargetId                  :
    Id                                : /subscriptions/<Subscription-id>/resourceGroups/RegionToZone-DemoMCRG/providers/Microsoft.Migrate/moveCollections/Re
                                        gionToZone-DemoMC/moveResources/demoVM-MoveResource
    IsResolveRequired                 : False
    JobStatusJobName                  :
    JobStatusJobProgress              :
    MoveStatusErrorsPropertiesCode    : DependencyComputationPending
    MoveStatusErrorsPropertiesDetail  : {}
    MoveStatusErrorsPropertiesMessage : The dependency computation is not completed for resource - /subscriptions/<Subscription-id>/resourcegroups/PS-demo-R
                                        egionToZone-RG/providers/Microsoft.Compute/virtualMachines/RegionToZone-demoSourceVm'.
                                            Possible Causes: Dependency computation is pending for resource.
                                            Recommended Action: Validate dependencies to compute the dependencies.
    
    MoveStatusErrorsPropertiesTarget  :
    MoveStatusMoveState               : MovePending
    Name                              : demoVM-MoveResource
    ProvisioningState                 : Succeeded
    ResourceSetting                   : Microsoft.Azure.PowerShell.Cmdlets.ResourceMover.Models.Api20230801.VirtualMachineResourceSettings
    SourceId                          : /subscriptions/<Subscription-id>/resourcegroups/PS-demo-RegionToZone-RG/providers/Microsoft.Compute/virtualMachines/
                                        RegionToZone-demoSourceVm
    SourceResourceSetting             : Microsoft.Azure.PowerShell.Cmdlets.ResourceMover.Models.Api20230801.VirtualMachineResourceSettings
    SystemDataCreatedAt               : 9/8/2023 6:48:11 AM
    SystemDataCreatedBy               : xxxxx@microsoft.com
    SystemDataCreatedByType           : User
    SystemDataLastModifiedAt          : 9/8/2023 6:48:11 AM
    SystemDataLastModifiedBy          : xxxxx@microsoft.com
    SystemDataLastModifiedByType      : User
    TargetId                          :
    Type                              :
    

修改设置

移动 Azure VM 和关联资源时,可以修改目标设置。 建议仅在验证移动集合前更改目标设置。

可修改的设置包括:

  • 虚拟机设置:资源组、VM 名称、VM 可用性区域、VM SKU、VM 密钥保管库和磁盘加密集。
  • 网络资源设置:对于网络接口、虚拟网络 (Vnet/) 和网络安全组/网络接口,可以:
    • 使用目标区域中的现有网络资源。
    • 使用其他名称创建新资源。
  • 公共 IP/负载均衡器:SKU 和区域

按如下所示修改设置:

  1. 检索要编辑其属性的移动资源。 例如检索 VM 运行:

    $moveResourceObj = Get-AzResourceMoverMoveResource -MoveCollectionName " RegionToZone-DemoMCRG " -ResourceGroupName " RegionToZone-DemoMC " -Name "PSDemoVM"
    
  2. 将资源设置复制到目标资源设置对象。

    $TargetResourceSettingObj = $moveResourceObj.ResourceSetting
    
  3. 设置目标资源设置对象中的参数。 例如更改目标 VM 的名称:

    $TargetResourceSettingObj.TargetResourceName="PSDemoVM-target"
    
  4. 更新“移动资源目标”设置。 在此示例中,我们将 VM 的名称“PSDemoVM”更改为“PSDemoVMTarget” 。

    Update-AzResourceMoverMoveResource -ResourceGroupName " RegionToZone-DemoMCRG " -MoveCollectionName " RegionToZone-DemoMC -SourceId "/subscriptions/<Subscription-d>/resourceGroups/PSDemoRM/providers/Microsoft.Compute/virtualMachines/PSDemoVM" -Name "PSDemoVM" -ResourceSetting $TargetResourceSettingObj
    

解决依赖项问题

检查已添加的资源是否有任何依赖项依赖其他资源,并根据需要进行添加。

  1. 按如下所示验证依赖项:

    Resolve-AzResourceMoverMoveCollectionDependency -ResourceGroupName "RegionToZone-DemoMCRG" -MoveCollectionName "RegionToZone-DemoMC"
    

    输出(如果依赖项存在)

    AdditionalInfo :
    Code           :
    Detail         :
    EndTime        : 
    EndTime        : 9/8/2023 6:52:14 AM
    
    Id             : /subscriptions/<Subscription-id>/resourceGroups/RegionToZone-DemoMCRG/providers/Microsoft.Migrate/moveCollections/RegionToZone-DemoMC/operations/bc68354b-ec1f-44cb-92ab-fb3b4ad90229
    Message        :
    Name           : bc68354b-ec1f-44cb-92ab-fb3b4ad90229
    Property       : Microsoft.Azure.PowerShell.Cmdlets.ResourceMover.Models.Any
    StartTime      : 9/8/2023 6:51:50 AM
    Status         : Succeeded
    
  2. 获取添加到移动集合的资源列表:

    $list = Get-AzResourceMoverMoveResource -ResourceGroupName "RegionToZone-DemoMCRG" -MoveCollectionName "RegionToZone-DemoMC" $list.Name
    

    输出:

    demoVM-MoveResource
    mr_regiontozone-demosourcevm661_d6f18900-3b87-4fb5-9bdf-12da2f9fb185
    mr_regiontozone-demosourcevm-vnet_d8536bf5-2d5f-4778-9650-32d0570bc41a
    mr_regiontozone-demosourcevm-ip_6af03f1f-eae8-4541-83f5-97a2506cfc3e
    mr_regiontozone-demosourcevm-nsg_98d68420-d7ff-4e2d-b758-25a6df80fca7
    mr_nrms-timkbo3hy3nnmregiontozone-demosourcevm-vnet_f474c880-4823-4ed3-b761-96df6500f6a3
    
  3. 要从资源集合中删除资源,请按照这些说明

可用性区域 VM SKU、配额和容量验证

当所选可用性区域没有虚拟机 SKU 或没有足够的配额或容量可用时,Azure 会提供建议。 下面是这些建议的一些示例,以及虚拟机 SKU 不可用时应执行的操作。

VM SKU 不可用

当源虚拟机大小 Standard_DC1ds_v3 在所选可用性区域 1 中不可用时。

建议的操作:在同一可用性区域中选择不同的虚拟机大小,或者选择具有推荐的相应 VM 大小的不同可用性区域。

建议

  • SKU:Standard_DC1ds_v3,区域:[ 2 ]
  • SKU:Standard_DC2ds_v3,区域:[ 2 ]
  • SKU:Standard_DC4ds_v3,区域:[ 2 ]
  • SKU:Standard_DC1s_v3,区域:[ 2 ]
  • SKU:Standard_D2ds_v5,区域:[ 2、3 ]
  • SKU:Standard_D2as_v4,区域:[ 1、2、3 ]
  • SKU:Standard_D2s_v3,区域:[ 1、2、3 ]
  • SKU:Standard_D2as_v5,区域:[ 1、2、3 ]
  • SKU:Standard_D2s_v5,区域:[ 2、3 ]

容量建议

所选可用性区域 1 中当前所选虚拟机大小 Standard_DC1ds_v3 的容量建议。

建议的操作:为了增加成功部署的可能性,Azure 已确定其他推荐的虚拟机大小和区域。 若要无缝部署,请在同一可用性区域中选择不同的虚拟机大小,或者选择具有相应 VM 大小的不同可用性区域。

建议

  • SKU:Standard_DC1ds_v3,区域:[ 2 ]
  • SKU:Standard_DC2ds_v3,区域:[ 2 ]
  • SKU:Standard_DC4ds_v3,区域:[ 2 ]
  • SKU:Standard_DC1s_v3,区域:[ 2 ]
  • SKU:Standard_D2ds_v5,区域:[ 2、3 ]
  • SKU:Standard_D2as_v4,区域:[ 1、2、3 ]
  • SKU:Standard_D2s_v3,区域:[ 1、2、3 ]
  • SKU:Standard_D2as_v5,区域:[ 1、2、3 ]
  • SKU:Standard_D2s_v5,区域:[ 2、3 ]

处理建议

若要解决找不到 VM SKU 或存在容量问题的情况,请更新移动资源,然后再次运行解决。 下面是一个参考示例:

  1. 根据建议更新虚拟机移动资源对象(移动到新的区域或 SKU)。

    $targetResourceSettingsObj.TargetVmSize = "Standard_DC1ds_v3"
    $targetResourceSettingsObj.TargetAvailabilityZone = "3"
    
  2. 更新虚拟机移动资源

    Add-AzResourceMoverMoveResource -ResourceGroupName "RegionToZone-DemoMCRG" -MoveCollectionName "RegionToZone-DemoMC" -SourceId "/subscriptions/<Subscription ID>/resourceGroups/<Resource Group Name>/providers/Microsoft.Compute/virtualMachines/vmtwo" -Name "demoVM-MoveResource2" -ResourceSetting $targetResourceSettingsObj
    
  3. 再次运行解析

    Resolve-AzResourceMoverMoveCollectionDependency -ResourceGroupName "RegionToZone-DemoMCRG" -MoveCollectionName "RegionToZone-DemoMC"

配额不足

由于配额不足,无法将所选虚拟机移动到可用性区域。

建议的操作:发现配额不足。 请参阅链接并联系支持人员

启动 VM 资源的移动

Invoke-AzResourceMoverInitiateMove -ResourceGroupName "RegionToZone-DemoMCRG" -MoveCollectionName "RegionToZone-DemoMC" -MoveResource $("demoVM-MoveResource") -MoveResourceInputType "MoveResourceId"

输出

AdditionalInfo :
Code           :
Detail         :
EndTime        : 9/8/2023 7:07:58 AM
Id             : /subscriptions/<Subscription-id>/resourceGroups/RegionToZone-DemoMCRG/providers/Microsoft.Migrate/moveCollections/RegionToZone-DemoMC/o
                 perations/d3e06ac3-a961-4045-8301-aee7f6911160
Message        :
Name           : d3e06ac3-a961-4045-8301-aee7f6911160
Property       : Microsoft.Azure.PowerShell.Cmdlets.ResourceMover.Models.Any
StartTime      : 9/8/2023 7:01:31 AM
Status         : Succeeded

提交

启动移动后,必须提交移动或放弃移动。 提交可完成到目标区域的移动

按如下所示提交移动

Invoke-AzResourceMover-VMZonalMoveCommit -ResourceGroupName "RG-MoveCollection-demoRMS" -MoveCollectionName "PS-centralus-westcentralus-demoRMS" -MoveResource $('psdemovm111', 'PSDemoRM-vnet','PSDemoVM-nsg', ‘PSDemoVM’) -MoveResourceInputType "MoveResourceId"

输出:

AdditionalInfo : 
Code           : 
Detail         : 
EndTime        : 9/22/2023 5:26:55 AM 
Id             : /subscriptions/e80eb9fa-c996-4435-aa32-5af6f3d3077c/resourceGroups/RegionToZone-DemoMCRG/providers/Microsoft.Migrate/moveCollections/RegionToZone-DemoMC/operations/35dd1d93-ba70-4dc9-a17f-7d8ba48678d8 
Message        : 
Name           : 35dd1d93-ba70-4dc9-a17f-7d8ba48678d8 
Property       : Microsoft.Azure.PowerShell.Cmdlets.ResourceMover.Models.Any 
StartTime      : 9/22/2023 5:26:54 AM 
Status         : Succeeded 

移除资源

可以使用以下 cmdlet 从 MoveCollection 中移除单个资源或多个资源:

  1. 获取添加到移动集合的移动资源的列表:$list = Get-AzResourceMoverMoveResource -ResourceGroupName "<MoveCollectionResourceGroupName>" -MoveCollectionName "<MoveCollectionName>"

  2. 移除找到的移动资源:Invoke-AzResourceMoverBulkRemove -ResourceGroupName "<MoveCollectionResourceGroupName>" -MoveCollectionName "<MoveCollectionName>" -MoveResource $($list.Name)

  3. 移除移动集合:Remove-AzResourceMoverMoveCollection -ResourceGroupName "<MoveCollectionResourceGroupName>" -MoveCollectionName "<MoveCollectionName>"

注意

如果观察到托管标识授权问题,请再次按照相应步骤重新启用托管标识访问。

删除源区域 VM

提交移动并验证资源在目标区域中是否按预期工作后,可使用以下命令删除每个源资源:

后续步骤

了解如何通过门户将 Azure 单实例 VM 从区域移到区域配置。