Como migrar suas máquinas virtuais do Microsoft Azure de outras regiões para a região Sul do Brasil (Powershell)

By: Rodrigo Gomes

Com o anuncio no dia 17 de Abril da disponibilidade em modo de visualização da região Sul do Brasil para o Microsoft Azure uma solicitação comum que recebemos é como mover as máquinas virtuais que se encontram em outras regiões para a nova região.

Por isso fizemos esse guia para orientá-lo em como se preparar para a migração de seu ambiente. Visto que será necessário copiar os arquivos VHDs entre datacenters diferentes e será necessário recriar as máquinas virtuais é esperado que haja algum tempo de indisponibilidade, mas acreditamos que com esse guia o tempo será reduzido.

Importante: Durante essa migração o IP Público de suas máquinas virtuais será alterado. No presente momento não é possível transferir ou preservar esse IP quando mudamos para outra região.

Os passos desse guia utilizarão comandos do Powershell, caso ainda não o tenha configurado poderá consultar esse link para começar: https://azure.microsoft.com/en-us/documentation/articles/install-configure-powershell (em inglês).

Os passos para a migração são:

1. Crie um grupo de afinidade escolhendo Sul do Brasil como região.

Execute o commando:

New-AzureAffinityGroup -Name novo_nome -Location "Brazil South" 

(O valor de Location precisa ser em inglês)

Um Grupo de Afinidade é a maneira que vocês tem de dizer ao nosso agente que deseja que essas máquinas virtuais, serviços de nuvem e contas de Storage sejam hospedadas o mais próximo possível uma das outras dentro do datacenter. Fazendo isso nós temos um aumento de performance visto que conseguimos reduzir a latência de rede entre máquinas virtuais diferentes e até mesmo obter uma melhor performance de disco já que a distância entre a VM e a conta de Storage que detém os discos será reduzida.

Lembre-se de fazer isso logo no inicio pois uma vez criada a conta de Storage ou a máquina virtual não é possível associá-las com outro Grupo de Afinidade.

2. Crie uma nova conta de Storage dentro do Grupo de Afinidade criado no passo 1 e um container para armazenar os arquivos.

Execute os comandos:

New-AzureStorageAccount -StorageAccountName "NomeStorage" -AffinityGroup "AFBrasil"

Set-AzureSubscription -CurrentStorageAccountName NomeStorage

New-AzureStorageContainer vhds

Essa conta irá guardar os VHDs de suas máquinas virtuais. Em seguida execute o comando abaixo para obter a chave Primary e anote-a para usarmos a seguir.

Get-AzureStorageKey –StorageAccountName “NomeStorage” 

3. Exportar as definições da máquina virtual

Podemos exportar a configuração da VM em um arquivo XML para na hora de recriar não precisarmos reconfigurar os endpoints e adicionarmos os discos de dados mais rapidamente.

Export-AzureVM -ServiceName 'cloudservice' -Name 'nome VM' -Path 'c:\temp\minhaVM.xml'

4. Copie o nome dos discos e seu caminho físico

Para selecionar uma VM especifica use Get-AzureVM e defina a saída para uma variável do powershell:

$vm = Get-AzureVM -ServiceName 'cloudservice' -Name 'nome VM'

Em seguida pesquise o disco de OS e de dados (se houver):

$vm | Get-AzureOSDisk

$vm | Get-AzureDataDisk

Nos dois outputs os valores de DiskName e MediaLink é o que nos interessa. Guarde essas informações pois esse é o arquivo VHD que iremos copiar.

O MediaLink será usado no passo 6 e o DiskName no passo 9

Exemplo: MediaLink: https://testestorage.blob.core.windows.net/vhds/disco1.vhd

Esse disco está armazenado na conta “teststorage”, no container “vhds” e o nome do arquivo é “disco1.vhd”

5. Excluir a máquina virtual atual

Para fazer a cópia dos VHDs é necessário primeiro que a máquina virtual esteja parada. Se a VM estiver funcionando, ainda que ociosa, dados são gravados constantemente nos discos alterando o conteúdo do arquivo de origem durante a cópia e portanto invalidando os bits que já foram copiados. Quando removemos a VM pelo powershell com o comando acima os discos são preservados.

Remove-AzureVM -ServiceName 'cloudservice' -Name 'nome VM'

Importante: O disco D: (em Windows) e /dev/sdb1 (em Linux) são espaços temporários. Não são discos persistentes. Caso você tenha algum arquivo importante nesses drives copie-os para outro disco antes de desligar a máquina pois esse disco será perdido. Mesmo quando você ligar a máquina de volta não use os discos temporário para armazenar dados importantes.

Depois de remover a última VM do serviço de nuvem você pode exclui-lo caso queira reaproveitar o mesmo DNS (xx.cloudapp.net) com o comando:

Remove-AzureService -ServiceName nome_serviço

6. Copiar os discos para a nova Storage

Execute os comandos:

#Conta de origem

$authOrigem = New-AzureStorageContext –StorageAccountName <storage origem> -StorageAccountKey <chaveorigem> 

#Conta de destino

$authDestino = New-AzureStorageContext –StorageAccountName <storage destino> -StorageAccountKey <chavedestino>

#Inicio da cópia

Start-AzureStorageBlobCopy -SrcBlob <nome do vhd> -SrcContainer vhds -Context $authOrigem -DestContainer vhds -DestBlob <nome do vhd> -DestContext $authDestino

Para obter a chave de acesso da conta de origem execute:

Get-AzureStorageKey –StorageAccountName “NomeStorage”

Para chave de acesso da storage de destino use aquela que pegamos no passo 2.

Repita esses passos para o disco de OS e para os discos de dados.

Na variável <nome do vhd> só é necessário colocar o nome do arquivo (ex: disco1.vhd), não é necessário o caminho completo. Esse nome e o nome da conta de Storage de origem são obtidos do valor MediaLink no passo 4.

Outro método é utilizar a ferramenta azcopy (pode ser obtida em aka.ms/AzCopy).

Com o Azcopy instalado abra um prompt de comando, entre na pasta de instalação (C:\Program Files (x86)\Microsoft SDKs\Windows Azure\AzCopy>) e execute:

AzCopy https://<origem>.blob.core.windows.net/vhds/ https://<destino>.blob.core.windows.net/vhds/ /SourceKey:<chaveorigem> /DestKey:<chavedestino> <nome_do_vhd>

7. Registre o novo VHD como um recurso de disco

Quando a cópia terminar registre o novo arquivo como um recurso de disco:

Add-AzureDisk -DiskName <nome do disco> -MediaLocation "https://<storage destino>.blob.core.windows.net/vhds/<arquivo>.vhd" -Label "Descrição"

<nome do disco> é o nome do objeto de disco, precisa ser um nome único e diferente do que era usado antes. Procure dar um nome que ajude a identificar a qual VM ele pertence.

MediaLocation deve refletir o endereço da Storage de destino e o <arquivo.vhd> é o arquivo que acabamos de copiar

Para o disco de OS adicione o parâmetro -OS, por exemplo:

Add-AzureDisk -DiskName <nome do disco> -MediaLocation "https://<storage destino>.blob.core.windows.net/vhds/<arquivo>.vhd" -Label "Descrição" -OS “Windows”

8. Crie uma nova Rede Virtual dentro do Grupo de Afinidade criado no passo 1.

Caso planeje utilizar futuramente uma Rede Virtual agora seria a melhor hora para cria-la visto que uma vez que as máquinas virtuais forem provisionadas não é possível alterar a que rede elas pertencem.

Se você utiliza VPN, seja Site-to-Site ou Point-to-Site, existem algumas restrições:

· Não será possível realizar a migração do seu Gateway atual. Isso significa um novo IP público para seu Gateway e novas Shared Keys que deverão ser reconfiguradas em seu aparelho de VPN local. Caso use Point-to-site é necessário realizar o upload do Certificado Raiz para a nova rede, criar um novo instalador e instalar a nova VPN nas máquinas clientes.

· Não é possível ter 2 redes virtuais com o mesmo espaço de endereços e conectadas à mesma Rede Local simultaneamente, logo, se você deseja manter o espaço de endereços será necessário seguir os passos de 3 a 7 para todas as VMs, depois excluir o gateway e só então alterar a localização da Rede Virtual.

Para remover o gateway:

Remove-AzureVNetGateway –VNetName "Rede_atual"

Para alterar a localização da rede (esse passo só irá funcionar se não houver mais nenhuma VM nem gateway utilizando essa rede, do contrário a atualização não será permitida)

Exporte a configuração de rede:

Get-AzureVNetConfig -ExportToFile c:\temp\netconfig.netcfg

Abra o arquivo c:\temp\netconfig.netcfg em um editor de textos.

Localize a rede utilizada pela tag <VirtualNetworkSite>

Altere o valor do atributo AffinityGroup para usar o Grupo de Afinidade que criamos no passo 1

<VirtualNetworkSite name="TestecomPS" AffinityGroup="AFBR">

Salve a alteração e importe o arquivo com o comando:

Set-AzureVNetConfig -ConfigurationPath "c:\temp\netconfig.netcfg"

Com esses passos sua rede já foi transferida para a nova região, agora podemos começar a adicionar as máquinas virtuais e no final criar um novo gateway, se for preciso

9. Criar uma nova VM

Antes de criarmos a VM precisamos fazer uma alteração no arquivo XML que geramos no passo 3. Abra o arquivo em um editor de textos e procure pelas tags <DiskName>

Substitua o nome dos discos antigos pelo novos nomes que você registrou no passo 7

Salve as alterações e execute o comando

Import-AzureVM -Path 'c:\temp\minhaVM.xml' | New-AzureVM -ServiceName 'novocloudservice' -AffinityGroup '<Grupo que criamos>' -VnetName '<nome da rede virtual>'

Pontos a considerar:

  • O IP publico irá mudar pois você está criando um novo serviço de nuvem, como mencionamos no inicio.
  • O IP privado também é dinâmico e pode mudar. Recomendamos recriar as máquinas virtuais começando pelas de menor IP (ex: 10.0.0.4) para tentar ter o mesmo IP assinalado, mas não há garantia.
  • Não é necessário definir um novo administrator/senha pois o sistema operacional não sofreu nenhuma modificação.

10. Limpeza final

Assim que você confirmar que a nova máquina virtual está funcionando corretamente já pode excluir os discos antigos que ainda estão listados como recurso para evitar cobrança adicional de espaço de armazenamento. Para isso selecione o disco a ser excluído e selecione a opção “Excluir o VHD associado”

Remove-AzureDisk -DiskName "DiscoOriginal" -DeleteVHD

Esperamos que esses passos possam ajuda-los a realizar uma migração planejada e sem imprevistos.