Copiar VM gerenciada entre assinaturas

Quando nos envolvemos em projetos de migração os cenários são os mais variados possíveis. Um deles envolve a movimentação de recursos entre assinaturas. A Microsoft aborda com bastante clareza este tópico e assim como ela é bem clara no que pode ser movido, ainda mais claro é o que não pode ser movido. Neste post quero deixar uma correção do documento oficial mostrando um workaround voltado para VMs que usam disco gerenciado. Onde nós vamos migrar uma VM com disco gerenciado entre assinaturas. O script é bem claro. Basta trocar os parâmetros que vou deixar nesta lista e você não terá problemas em executar passo a passo.
  • $sourceSubscriptionId: Id da assinatura de origem
  • $targetSubscriptionId: Id da assinatura de destino
  • $managedDiskName: Nome do disco gerenciado que será copiado
  • $vmName: Nome da Máquina virtual de origem
  • $sourceResourceGroupName: Nome do Grupo de recursos de Origem
  • $targetResouceGroupName: Nome do grupo de recursos de Destino
  • $location: local onde a nova VM será provisionada
  • $virtualNetworkName: nome da Rede Virtual de destino
  • $virtualMachineName: nome da nova Máquina Virtual
  • $virtualMachineSize: tamanho da nova Máquina virtual
<#
# Script: Migrar uma VM com disco Gerenciado
# Versão: 1.0.0
# Autor: Carlos Oliveira
# Créditos: Microsoft Docs por direcionar o método de implantação
#
#>
#Forneça o Id da assinatura onde o disco atualmente reside
$sourceSubscriptionId='<sourceSubscriptionId>'

#Forneça o nome do grupo de recursos onde o disco está atualmente alocal
$sourceResourceGroupName='<sourceResourceGroupName>'

#Forneça o nome do disco gerenciado
$managedDiskName='<managedDiskName>'

#Forneça o nome da VM que precisará ser desligada
$vmName ='<vmName>'

#Selecionar assinatura de origem
Select-AzureRmSubscription -SubscriptionId $sourceSubscriptionId

#Forçar desligamento da VM que deve ser migrada
Stop-AzureRmVm -Name $vmName -ResourceGroupName $resourceGroupName -Force -Debug

#Obter a origem do disco gerenciado
$managedDisk= Get-AzureRMDisk -ResourceGroupName $sourceResourceGroupName -DiskName $managedDiskName

#Informar assinatura de destino
$targetSubscriptionId='<targetSubscriptionId>'

#Informar nome do grupo de recursos de destino
$targetResourceGroupName='<targetResourceGroupName>'

#Selecionar assinatura de destino para iniciar a cópia
Select-AzureRmSubscription -SubscriptionId $targetSubscriptionId

#Preparar operação de cópia
$diskConfig = New-AzureRmDiskConfig -SourceResourceId $managedDisk.Id -Location $managedDisk.Location -CreateOption Copy 

#Criar um novo disco gerenciado usando o disco da assinatura de origem como fonte
New-AzureRmDisk -Disk $diskConfig -DiskName $managedDiskName -ResourceGroupName $targetResourceGroupName -Debug

#adaptar subscriptionId para uma nova variável
$subscriptionId = $targetSubscriptionId

#adaptar nome do grupo de recursos para migração
$resourceGroupName = $targetResourceGroupName

#Adaptar variável do nome do disco gerenciado
$diskName = $managedDiskName

#Informar o local onde a VM será provisionada (informar o mesmo local de origem do disco)
$location = '<location>'

#Informar o nome da rede (esta rede deve residir no mesmo local de origem do disco)
$virtualNetworkName = '<virtualNetworkName>'

#Informar nome para a Máquina Virtual
$virtualMachineName = '<virtualMachineName>'

<#Informar o nome da máquina virtual
#Para obter todos os tamanhos disponíveis para implantação usar o cmdlet: 
Get-AzureRmVMSize -Location $location
#>
$virtualMachineSize = '<Size>'

#Selecionar assinatura de destino
Select-AzureRmSubscription -SubscriptionId $SubscriptionId

#Obter informações do novo disco gerenciado baseado em seu nome e grupo de recurso
$disk =  Get-AzureRmDisk -ResourceGroupName $resourceGroupName -DiskName $diskName

#Iniciar configuração da VM
$VirtualMachine = New-AzureRmVMConfig -VMName $virtualMachineName -VMSize $virtualMachineSize

#vincular o Id da Máquina Virtual ao disco de OS que será provisionado (Mudar Windows para Linux caso seja outro SO)
$VirtualMachine = Set-AzureRmVMOSDisk -VM $VirtualMachine -ManagedDiskId $disk.Id -CreateOption Attach -Windows

#Criar IP público para  VM
$publicIp = New-AzureRmPublicIpAddress -Name ($VirtualMachineName.ToLower()+'_ip') -ResourceGroupName $resourceGroupName -Location $location -AllocationMethod Dynamic -Debug

#Obter informações da VNET de destino
$vnet = Get-AzureRmVirtualNetwork -Name $virtualNetworkName -ResourceGroupName $resourceGroupName

#Criar uma NIC na primeira subnet que estiver na VNET
$nic = New-AzureRmNetworkInterface -Name ($VirtualMachineName.ToLower()+'_nic') -ResourceGroupName $resourceGroupName -Location $location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $publicIp.Id

$VirtualMachine = Add-AzureRmVMNetworkInterface -VM $VirtualMachine -Id $nic.Id

#Criar a VM com o disco gerenciado
New-AzureRmVM -VM $VirtualMachine -ResourceGroupName $resourceGroupName -Location $location -Debug
Por hoje é isso pessoal, espero que vocês tenham aproveitado e não deixem de comentar se tiverem alguma sugestão. Um abraço!