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.