Pular para o conteúdo principal

Fundamentação Teórica: Move a Virtual Machine to Another Resource Group, Subscription, or Region


1. Intuição Inicial

Imagine que você mora em um apartamento e decide se mudar. Dependendo do destino, a mudança tem implicações muito diferentes:

  • Mudar para outro apartamento no mesmo prédio (outro Resource Group, mesma subscription): você leva tudo, o endereço muda, mas continua no mesmo condomínio com as mesmas regras.
  • Mudar para outro prédio no mesmo bairro (outra Subscription, mesmo tenant): você leva tudo, mas agora está em outro condomínio com outras regras, outro síndico, outra conta de gás.
  • Mudar para outra cidade (outra região): não dá para carregar os móveis pesados. Você precisa adquirir tudo novo no destino ou transportar peça por peça com esforço significativo.

Mover uma VM no Azure segue exatamente essa lógica. Mover entre Resource Groups ou Subscriptions é uma operação de metadados que preserva o recurso intacto. Mover entre regiões é uma operação de migração física que requer uma ferramenta especializada e envolve criação real de novos recursos.


2. Contexto

Por que mover recursos existe como operação

Organizações evoluem. Uma VM criada em um projeto temporário pode precisar ser transferida para o Resource Group permanente da aplicação. Uma startup adquirida pela empresa traz VMs em subscriptions separadas que precisam ser consolidadas. Uma expansão para novos mercados exige mover infraestrutura para regiões mais próximas dos usuários.

A operação de mover VMs existe para acomodar essas necessidades sem precisar deletar e recriar infraestrutura, o que causaria perda de dados, downtime e reconfiguração completa.

O que depende de mover VMs corretamente

  • RBAC: role assignments existentes no RG ou Subscription de origem não são transferidos
  • Azure Policy: o destino pode ter policies diferentes que tornam a VM não-conforme
  • Networking: dependências de VNet, NSG e IP público precisam ser gerenciadas
  • Backup: jobs do Azure Backup no RG de origem precisam ser reconfigurados no destino
  • Monitoring: alertas e Diagnostic Settings apontam para o Resource ID antigo
  • Cost Management: budgets e tags precisam ser revisados no destino

3. Construção dos Conceitos

3.1 Os três tipos de movimentação e suas naturezas

100%
Scroll para zoom · Arraste para mover · 📱 Pinch para zoom no celular

3.2 O que muda no Resource ID ao mover

O Resource ID de uma VM inclui o caminho completo na hierarquia ARM:

/subscriptions/{subId}/resourceGroups/{rgName}/providers/Microsoft.Compute/virtualMachines/{vmName}

Ao mover para outro RG (mesma Sub):

DE: /subscriptions/AAA/resourceGroups/rg-origem/providers/Microsoft.Compute/virtualMachines/vm-01
PARA: /subscriptions/AAA/resourceGroups/rg-destino/providers/Microsoft.Compute/virtualMachines/vm-01

Apenas o resourceGroups muda.

Ao mover para outra Subscription:

DE: /subscriptions/AAA/resourceGroups/rg-origem/providers/Microsoft.Compute/virtualMachines/vm-01
PARA: /subscriptions/BBB/resourceGroups/rg-destino/providers/Microsoft.Compute/virtualMachines/vm-01

Tanto subscriptions quanto resourceGroups mudam.

Implicação: qualquer referência hardcoded ao Resource ID antigo em scripts, alertas, RBAC, políticas ou aplicações quebra após o move.

3.3 Recursos que acompanham a VM em um move de RG/Subscription

Uma VM raramente existe sozinha. Ela tem dependências que precisam ser movidas juntas ou tratadas explicitamente:

100%
Scroll para zoom · Arraste para mover · 📱 Pinch para zoom no celular

Regra geral: a VM, sua NIC e seus discos gerenciados devem ser movidos juntos. VNets e NSGs podem permanecer no RG de rede (cross-RG networking funciona normalmente).

3.4 Restrições ao mover VMs

Existem situações que impedem o move:

CondiçãoPode mover?Motivo
VM com Azure Disk Encryption (ADE) ativoNão (para outra Sub)Key Vault deve estar na mesma Sub; mova o KV junto ou descriptografe primeiro
VM em Availability Set sendo movida sem o ASNãoAS deve ser movido junto com todas as VMs
VM com Proximity Placement GroupCondicionalPPG deve ser movido junto se existir
VM com Extension de backup configuradaSim, mas com atençãoBackup jobs precisam ser reconfigurados no destino
VM com discos Ultra SSD ou Premium SSD v2VerificarAlgumas restrições por tipo de disco
VM rodando (para move cross-subscription)SimMove de metadados não requer parar a VM
VM com Classic AdministratorsNão recomendadoModelo legado; migrar para ARM primeiro

3.5 Azure Resource Mover: para movimentação entre regiões

Para mover uma VM para outra região, a ferramenta oficial é o Azure Resource Mover. Ele:

  1. Cria novos recursos no destino baseados na configuração da origem
  2. Replica os dados dos discos para a região destino
  3. Permite validar e testar no destino antes de commitar
  4. Descarta os recursos de origem após commit

Esta é a única forma suportada de "mover" uma VM entre regiões. Tecnicamente não é um move mas sim uma migração: novos recursos são criados e os antigos são deletados.

Alternativas ao Resource Mover para migração de região:

  • Azure Site Recovery (para VMs com workloads críticos que precisam de replicação contínua)
  • Capturar imagem + deploy em nova região + deletar original
  • Exportar/importar VHD manualmente (não recomendado para produção)

4. Visão Estrutural

Fluxo completo: mover VM entre Resource Groups

100%
Scroll para zoom · Arraste para mover · 📱 Pinch para zoom no celular

Fluxo de migração entre regiões com Azure Resource Mover

100%
Scroll para zoom · Arraste para mover · 📱 Pinch para zoom no celular

5. Funcionamento na Prática

Comportamentos não óbvios e críticos

A operação de move aplica um lock temporário nos recursos. Durante o move (que pode levar de segundos a minutos para muitos recursos), o Azure aplica um lock nos recursos de origem. Nenhuma operação pode ser executada neles até o move terminar. Se o move falhar, os recursos são liberados no estado original.

Move entre subscriptions requer que ambas pertençam ao mesmo tenant. Não é possível mover VMs entre subscriptions de tenants diferentes via move nativo. Para isso é necessário recriar no destino ou usar Azure Site Recovery.

RBAC nunca é transferido automaticamente. Esta é a mudança mais impactante em um move cross-subscription: todos os role assignments no RG ou subscription de origem são perdidos. O receptor da VM precisa receber novos acessos no destino. Em um ambiente com muitos usuários e permissões, isso pode ser um trabalho significativo.

Resource providers devem estar registrados na subscription de destino. Se você move uma VM para uma subscription que nunca teve VMs, os resource providers Microsoft.Compute, Microsoft.Network e Microsoft.Storage precisam estar registrados. Caso contrário, o move falha com erro de resource provider não registrado.

Managed Disks movem junto com a VM mas podem ter restrições de zona. Se a VM usa Availability Zones e está na Zone 1 em brazilsouth, os discos gerenciados também estão atrelados àquela zone. Ao mover para outro RG, a zone é preservada. Mas ao mover para outra subscription, verifique se a zona está disponível no destino.

Diagnostic Settings e alertas ficam órfãos. Após um move, os Diagnostic Settings configurados na VM ou nos discos continuam existindo, mas apontam para o Resource ID antigo que não existe mais. Você verá logs sendo enviados para o Log Analytics com referências incorretas. É necessário reconfigurar.

O Azure Backup não segue a VM. Se a VM estava protegida pelo Azure Backup em um Recovery Services Vault no RG de origem, após o move a VM continua registrada no vault mas a associação pode se tornar inconsistente. Recomendação: pare a proteção de backup antes do move e reconfigure no destino.


6. Formas de Implementação

Portal do Azure

Quando usar: moves pontuais, uma VM por vez, verificação visual das dependências

Para mover para outro RG ou Subscription:

  1. Portal > Resource Groups > selecionar RG de origem
  2. Selecionar os recursos a serem movidos (VM + NIC + Discos + IP Público, se aplicável)
  3. Clicar em Move > Move to another resource group ou Move to another subscription
  4. O portal valida automaticamente as dependências e exibe avisos
  5. Selecionar o RG destino (ou subscription + RG destino)
  6. Confirmar que entende que Resource IDs mudarão
  7. Move

Para mover entre regiões (via Resource Mover):

  1. Portal > buscar Azure Resource Mover
  2. Move > Move to another region
  3. Selecionar subscription, RG de origem
  4. Adicionar VM e deixar o Resource Mover identificar dependências
  5. Seguir o wizard de preparação, validação e commit

Limitação: para grandes volumes, o portal é lento e impraticável.


Azure CLI

# Validar se os recursos suportam move antes de executar
az resource invoke-action \
--action "validateMoveResources" \
--ids "/subscriptions/<sub-id>/resourceGroups/rg-origem" \
--request-body "{
\"resources\": [
\"/subscriptions/<sub-id>/resourceGroups/rg-origem/providers/Microsoft.Compute/virtualMachines/vm-01\",
\"/subscriptions/<sub-id>/resourceGroups/rg-origem/providers/Microsoft.Network/networkInterfaces/nic-vm-01\",
\"/subscriptions/<sub-id>/resourceGroups/rg-origem/providers/Microsoft.Compute/disks/vm-01-osdisk\"
],
\"targetResourceGroup\": \"/subscriptions/<sub-id>/resourceGroups/rg-destino\"
}"

# Mover VM para outro Resource Group (mesma Subscription)
# Obtém os IDs de todos os recursos a mover
VM_ID=$(az vm show --resource-group rg-origem --name vm-01 --query id --output tsv)
NIC_ID=$(az vm show --resource-group rg-origem --name vm-01 --query "networkProfile.networkInterfaces[0].id" --output tsv)
OS_DISK_ID=$(az vm show --resource-group rg-origem --name vm-01 --query "storageProfile.osDisk.managedDisk.id" --output tsv)
DATA_DISK_IDS=$(az vm show --resource-group rg-origem --name vm-01 --query "storageProfile.dataDisks[].managedDisk.id" --output tsv)

# Executar o move
az resource move \
--destination-group "rg-destino" \
--ids "$VM_ID" "$NIC_ID" "$OS_DISK_ID" $DATA_DISK_IDS

# Mover para outra Subscription
az resource move \
--destination-group "rg-destino" \
--destination-subscription-id "<sub-destino-id>" \
--ids "$VM_ID" "$NIC_ID" "$OS_DISK_ID"

# Verificar resource providers na subscription de destino (para cross-sub move)
az provider show \
--namespace "Microsoft.Compute" \
--subscription "<sub-destino-id>" \
--query "registrationState" \
--output tsv

# Registrar providers se necessário
az provider register \
--namespace "Microsoft.Compute" \
--subscription "<sub-destino-id>"

az provider register \
--namespace "Microsoft.Network" \
--subscription "<sub-destino-id>"

az provider register \
--namespace "Microsoft.Storage" \
--subscription "<sub-destino-id>"

# Após o move: verificar que a VM está no novo RG
az vm show \
--resource-group "rg-destino" \
--name "vm-01" \
--query "{Name: name, RG: resourceGroup, Location: location}" \
--output json

# Script completo: mover VM com todos os recursos associados
RESOURCE_GROUP_ORIGEM="rg-origem"
RESOURCE_GROUP_DESTINO="rg-destino"
VM_NAME="vm-01"
SUB_ID=$(az account show --query id --output tsv)

echo "Coletando IDs dos recursos associados a $VM_NAME..."

VM_ID="/subscriptions/$SUB_ID/resourceGroups/$RESOURCE_GROUP_ORIGEM/providers/Microsoft.Compute/virtualMachines/$VM_NAME"

# Coletar NICs
NIC_IDS=$(az vm show \
--resource-group "$RESOURCE_GROUP_ORIGEM" \
--name "$VM_NAME" \
--query "networkProfile.networkInterfaces[].id" \
--output tsv)

# Coletar disco de SO
OS_DISK_ID=$(az vm show \
--resource-group "$RESOURCE_GROUP_ORIGEM" \
--name "$VM_NAME" \
--query "storageProfile.osDisk.managedDisk.id" \
--output tsv)

# Coletar discos de dados
DATA_DISK_IDS=$(az vm show \
--resource-group "$RESOURCE_GROUP_ORIGEM" \
--name "$VM_NAME" \
--query "storageProfile.dataDisks[].managedDisk.id" \
--output tsv)

# Coletar IP público (se houver)
PUBLIC_IP_IDS=$(for nic_id in $NIC_IDS; do
az network nic show --ids "$nic_id" \
--query "ipConfigurations[].publicIpAddress.id" \
--output tsv 2>/dev/null
done)

echo "Executando move..."
az resource move \
--destination-group "$RESOURCE_GROUP_DESTINO" \
--ids "$VM_ID" $NIC_IDS "$OS_DISK_ID" $DATA_DISK_IDS $PUBLIC_IP_IDS

echo "Move concluído. Verificando..."
az vm show \
--resource-group "$RESOURCE_GROUP_DESTINO" \
--name "$VM_NAME" \
--query "{Name: name, RG: resourceGroup}" \
--output json

Azure PowerShell

# Mover VM para outro Resource Group
$vm = Get-AzVM -ResourceGroupName "rg-origem" -Name "vm-01"

# Coletar IDs dos recursos associados
$nicIds = $vm.NetworkProfile.NetworkInterfaces.Id
$osDiskId = $vm.StorageProfile.OsDisk.ManagedDisk.Id
$dataDiskIds = $vm.StorageProfile.DataDisks.ManagedDisk.Id

# Coletar IPs públicos das NICs
$publicIpIds = @()
foreach ($nicId in $nicIds) {
$nic = Get-AzNetworkInterface -ResourceId $nicId
$publicIpIds += $nic.IpConfigurations.PublicIpAddress.Id | Where-Object { $_ -ne $null }
}

# Combinar todos os IDs
$allIds = @($vm.Id) + $nicIds + $osDiskId + $dataDiskIds + $publicIpIds
$allIds = $allIds | Where-Object { $_ -ne $null }

# Executar move
Move-AzResource `
-DestinationResourceGroupName "rg-destino" `
-ResourceId $allIds

# Mover para outra Subscription
Move-AzResource `
-DestinationResourceGroupName "rg-destino" `
-DestinationSubscriptionId "<sub-destino-id>" `
-ResourceId $allIds

# Verificar resultado
Get-AzVM -ResourceGroupName "rg-destino" -Name "vm-01" |
Select-Object Name, ResourceGroupName, Location

Azure Resource Mover via CLI (migração entre regiões)

# Criar Move Collection no Resource Mover
az resource-mover move-collection create \
--name "move-collection-brazilsouth-to-eastus" \
--resource-group "rg-resource-mover" \
--source-region "brazilsouth" \
--target-region "eastus" \
--identity-type SystemAssigned

# Adicionar VM à move collection
az resource-mover move-resource add \
--move-collection-name "move-collection-brazilsouth-to-eastus" \
--resource-group "rg-resource-mover" \
--source-id "/subscriptions/<sub-id>/resourceGroups/rg-origem/providers/Microsoft.Compute/virtualMachines/vm-01"

# Resolver dependências automaticamente
az resource-mover move-collection resolve-dependency \
--move-collection-name "move-collection-brazilsouth-to-eastus" \
--resource-group "rg-resource-mover"

# Preparar recursos (inicia replicação de dados)
az resource-mover move-resource initiate-move \
--move-collection-name "move-collection-brazilsouth-to-eastus" \
--resource-group "rg-resource-mover" \
--move-resources "/subscriptions/<sub-id>/resourceGroups/rg-resource-mover/providers/Microsoft.Migrate/moveCollections/move-collection-brazilsouth-to-eastus/moveResources/vm-01"

# Verificar status de preparação
az resource-mover move-resource list \
--move-collection-name "move-collection-brazilsouth-to-eastus" \
--resource-group "rg-resource-mover" \
--query "[].{Name: name, State: moveStatus.moveState}" \
--output table

# Commit o move (após validar no destino)
az resource-mover move-collection commit \
--move-collection-name "move-collection-brazilsouth-to-eastus" \
--resource-group "rg-resource-mover" \
--move-resources "/subscriptions/<sub-id>/..."

# Deletar recursos de origem (após commit)
az resource-mover move-collection discard \
--move-collection-name "move-collection-brazilsouth-to-eastus" \
--resource-group "rg-resource-mover" \
--move-resources "/subscriptions/<sub-id>/..."

7. Controle e Segurança

Permissões necessárias para executar um move

OperaçãoPermissão necessária
Mover para outro RG (mesma Sub)Microsoft.Resources/subscriptions/resourceGroups/moveResources/action no RG origem + Contributor no RG destino
Mover para outra SubscriptionOwner ou Contributor em ambas as subscriptions
Usar Azure Resource MoverContributor na subscription de origem e destino

A forma mais simples de garantir as permissões corretas é ter Contributor tanto no RG/Subscription de origem quanto no destino.

O que fazer com RBAC após o move cross-subscription

100%
Scroll para zoom · Arraste para mover · 📱 Pinch para zoom no celular

Backup antes do move

Para moves críticos, especialmente cross-subscription, criar um snapshot dos discos antes do move é uma prática de segurança:

# Criar snapshot do disco de SO antes do move
OS_DISK_ID=$(az vm show \
--resource-group rg-origem \
--name vm-01 \
--query "storageProfile.osDisk.managedDisk.id" \
--output tsv)

az snapshot create \
--name "snapshot-vm-01-osdisk-premove-$(date +%Y%m%d)" \
--resource-group "rg-snapshots" \
--source "$OS_DISK_ID"

8. Tomada de Decisão

Quando usar cada abordagem de movimentação

SituaçãoAbordagemMotivo
Reorganização de RGs na mesma subscriptionaz resource moveOperação rápida, apenas metadados
Consolidar VMs de subscription adquiridaaz resource move cross-subMove nativo se mesmo tenant
Mover para região mais próxima de usuáriosAzure Resource MoverÚnica opção suportada para migração entre regiões
VM com ADE ativo para outra SubMover Key Vault junto, depois a VMKV deve estar na mesma Sub
VM crítica com mínimo de downtime para nova regiãoAzure Site RecoveryReplicação contínua, failover controlado
Recriar VM com mesma configuração em nova regiãoCapturar imagem + deployMais controle, mas requer recriação manual
Move de dezenas de VMs entre RGsScript PowerShell/CLI em lotePortal é impraticável para volumes altos

Move nativo vs. recreação

AspectoMove nativo (RG/Sub)Recriar no destino
Dados preservadosSim (dados no disco intactos)Depende (precisa copiar dados)
DowntimeNenhum (lock temporário)Necessário para copiar dados
Resource IDMudaNovo ID desde o início
RiscoBaixo (operação atômica)Médio (pode ocorrer erros na recriação)
TempoMinutosHoras para VMs grandes
Ideal paraVMs com dados e configuração complexaAmbientes novos ou VMs stateless

9. Boas Práticas

Sempre use o validador de move antes de executar. O comando validateMoveResources ou o portal identifica restrições antes da operação. Descobrir que um recurso não suporta move depois de iniciar causa rollback desnecessário.

Mova todos os recursos dependentes na mesma operação. Uma VM sem sua NIC no mesmo RG é uma VM sem conectividade de rede. Discos sem a VM são discos órfãos. O ARM valida algumas dependências, mas não todas. Identifique manualmente tudo que precisa se mover junto.

Documente o estado antes do move. Antes de qualquer move cross-subscription, exporte os role assignments atuais:

az role assignment list \
--resource-group "rg-origem" \
--output json > rbac-backup-$(date +%Y%m%d).json

Isso serve como referência para recriar acessos no destino.

Teste a validação de resource providers na subscription de destino. Para cross-subscription, verifique com antecedência que Microsoft.Compute, Microsoft.Network e Microsoft.Storage estão registrados. O registro pode levar alguns minutos.

Para movimentações entre regiões, prefira Azure Resource Mover a soluções manuais. O Resource Mover gerencia dependências automaticamente, oferece uma fase de teste antes do commit e mantém um estado da operação que permite desfazer se necessário.

Planeje janelas de manutenção para moves cross-subscription de VMs críticas. Embora o move não cause downtime na VM em execução, o período em que a VM está com lock temporário pode impedir operações de gerenciamento (scaling, restart, apply de patches). Comunique a janela para as equipes dependentes.


10. Erros Comuns

ErroPor que aconteceComo evitar
Move falha por resource provider não registradoSubscription destino nunca usou aquele tipo de recursoVerificar e registrar providers antes do move
Move falha por recurso não suportadoTipo específico de disco ou configuração sem suporteUsar validateMoveResources antes de executar
Alertas e dashboards quebram após o moveResource ID muda; referências ficam obsoletasInventariar e atualizar todas as referências externas
RBAC perdido sem backupMove cross-subscription apaga role assignmentsExportar RBAC antes do move
NIC ou disco não movido junto com a VMOperação incompleta, movendo apenas a VMSempre mapear e incluir todos os recursos dependentes
VM com ADE falha no move cross-subKey Vault deve estar na mesma subscriptionMover KV primeiro, ou descriptografar e re-criptografar
Backup jobs quebram após o moveRecovery Services Vault aponta para Resource ID antigoRemover VM do backup antes do move, reconfigurá-la no destino
Cross-sub move falha por subscriptions em tenants diferentesMove nativo não funciona cross-tenantUsar Azure Site Recovery ou recrear no destino

O erro mais crítico

Executar um move cross-subscription sem documentar os role assignments e sem avisar as equipes que têm acesso à VM. Após o move, todos os acessos são perdidos e as equipes reportam que "não conseguem acessar a VM". Em produção, isso pode causar incidentes de disponibilidade enquanto os acessos são reconfigurados.


11. Operação e Manutenção

Checklist pós-move

# 1. Confirmar que a VM está no novo RG/Sub
az vm show \
--resource-group "rg-destino" \
--name "vm-01" \
--query "{Name: name, RG: resourceGroup, Sub: id}" \
--output json

# 2. Verificar conectividade da VM (se em execução)
az vm run-command invoke \
--resource-group "rg-destino" \
--name "vm-01" \
--command-id RunShellScript \
--scripts "echo 'VM acessivel'"

# 3. Verificar que discos estão associados
az disk list \
--resource-group "rg-destino" \
--query "[?managedBy != null].{Name: name, VM: managedBy}" \
--output table

# 4. Verificar Diagnostic Settings (se existem, precisam ser atualizados)
az monitor diagnostic-settings list \
--resource "/subscriptions/<sub-destino>/resourceGroups/rg-destino/providers/Microsoft.Compute/virtualMachines/vm-01"

# 5. Verificar se VM ainda está no Recovery Services Vault antigo
az backup item list \
--resource-group "rg-backup-origem" \
--vault-name "rsv-origem" \
--query "[?properties.friendlyName=='vm-01']" \
--output table

Monitorar o status de um move em andamento

# Move de grandes volumes pode levar tempo
# Verificar status das operações recentes
az monitor activity-log list \
--resource-group "rg-origem" \
--max-events 10 \
--query "[?operationName.value=='Microsoft.Resources/subscriptions/resourceGroups/moveResources/action'].{Time: eventTimestamp, Status: status.value, Caller: caller}" \
--output table

12. Integração e Automação

Move em massa com validação e logging

# Script: Mover múltiplas VMs de um RG para outro com logging
param (
[string]$SourceRG,
[string]$DestinationRG,
[string[]]$VMNames
)

$results = @()

foreach ($vmName in $VMNames) {
Write-Output "Processando VM: $vmName"

try {
$vm = Get-AzVM -ResourceGroupName $SourceRG -Name $vmName -ErrorAction Stop

# Coletar recursos dependentes
$resourceIds = @($vm.Id)
$resourceIds += $vm.NetworkProfile.NetworkInterfaces.Id
$resourceIds += $vm.StorageProfile.OsDisk.ManagedDisk.Id
$resourceIds += $vm.StorageProfile.DataDisks.ManagedDisk.Id | Where-Object { $_ -ne $null }

# Exportar RBAC antes do move
$rbac = Get-AzRoleAssignment -ResourceGroupName $SourceRG |
Where-Object { $_.Scope -like "*$vmName*" }
$rbac | Export-Csv -Path "rbac-$vmName-$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation

# Executar move
Move-AzResource `
-DestinationResourceGroupName $DestinationRG `
-ResourceId $resourceIds `
-Force

$results += [PSCustomObject]@{
VM = $vmName
Status = "Success"
Message = "Movida para $DestinationRG"
}
Write-Output "VM $vmName movida com sucesso"

} catch {
$results += [PSCustomObject]@{
VM = $vmName
Status = "Failed"
Message = $_.Exception.Message
}
Write-Error "Falha ao mover $vmName: $_"
}
}

# Relatório final
$results | Format-Table -AutoSize
$results | Export-Csv -Path "move-results-$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation

Integração com Azure Resource Mover via Terraform

Para migração de região como parte de um processo de IaC, o Azure Resource Mover pode ser acionado via Terraform usando o provider azurerm:

resource "azurerm_resource_group_template_deployment" "resource_mover" {
name = "resource-mover-deployment"
resource_group_name = azurerm_resource_group.mover.name
deployment_mode = "Incremental"

template_content = jsonencode({
"$schema" = "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"
contentVersion = "1.0.0.0"
resources = [
{
type = "Microsoft.Migrate/moveCollections"
apiVersion = "2021-08-01"
name = "move-collection-prod"
location = "eastus"
identity = { type = "SystemAssigned" }
properties = {
sourceRegion = "brazilsouth"
targetRegion = "eastus"
}
}
]
})
}

13. Resumo Final

Pontos essenciais:

  • Mover uma VM entre Resource Groups ou Subscriptions é uma operação de metadados no ARM: os dados nos discos não são tocados, apenas o endereçamento (Resource ID) muda
  • Mover entre regiões é uma migração física: novos recursos são criados no destino, dados são copiados, recursos de origem são deletados ao final; use Azure Resource Mover para essa operação
  • A VM, suas NICs e seus discos gerenciados devem ser movidos juntos na mesma operação
  • Move cross-subscription apaga todos os role assignments; exporte o RBAC antes e recrie no destino
  • O move aplica um lock temporário nos recursos durante a operação; nenhuma ação de gerenciamento pode ser executada neles até o término
  • Azure Disk Encryption com Key Vault em outra subscription impede o move da VM; mova o Key Vault primeiro ou descriptografe

Diferenças críticas:

  • Move RG vs. Move Subscription: ambos mudam o Resource ID, mas move de subscription também perde RBAC e pode exigir registro de resource providers no destino
  • Move nativo vs. Azure Resource Mover: move nativo é para RG/Subscription (metadados); Resource Mover é para mudança de região (migração física)
  • Azure Resource Mover vs. Azure Site Recovery: Resource Mover é para migração única (mover uma vez); Site Recovery é para replicação contínua com failover (DR)
  • Lock temporário durante move vs. Resource Lock permanente: o lock do move é automático e temporário; Resource Locks são configurados pelo administrador

O que precisa ser lembrado para o AZ-104:

  • O comando CLI para move é az resource move --destination-group --ids
  • Para cross-subscription, adicionar --destination-subscription-id
  • Resource providers precisam estar registrados na subscription de destino antes do move cross-sub
  • Mover VM entre regiões requer Azure Resource Mover (não o comando az resource move)
  • A operação de move é atômica: se falhar, todos os recursos voltam ao estado original
  • Verificar suporte ao move: https://learn.microsoft.com/azure/azure-resource-manager/management/move-support-resources
  • Permissão mínima necessária: Microsoft.Resources/subscriptions/resourceGroups/moveResources/action + Contributor no destino