How-to: Migrate a VM between two Azure accountsCopy your VM to an other Azure account instead of building a new one from scratch
In the Azure IaaS platform, you are able to run virtual machines. These virtual machines are running on an Azure subscription in an Azure account. In some cases, you need to migrate a virtual machine from one Azure account to an other Azure account. This how-to will explain the steps that are needed to perform a virtual machine migration between two Azure accounts. Please note that this how-to describes the steps that are needed to perform a migration between two Azure account. If you only need to migrate a VM between two subscriptions in the same account, there are better solutions.
High level stepsAzure doesn’t support an out-of-the-box Virtual Machine migration. This how-to will describe a scenario that is close to a migration. On a high level, the following steps are required:
- Turn off the VM
- Copy the VHD of the source VM to an storage account in the target Azure account.
- Create a new VM based on the copied VHD in the target Azure account
- The IP address of the VM will change.
- The rules that are defined in the network security group are not migrated
- There will be downtime during the migration
Copy VHD to the other Azure accountThe first step in this how-to is turning off the Azure Virtual Machine. After turning off the VM, you are able to start a blob storage copy. The following PowerShell commands are used to do the copy:
### The URI of the VHD we would like to migrate $sourceVhdUri = "https://mysourcestorageaccount.blob.core.windows.net/vhds/myvhd.vhd" ### Source storage account definition $sourceStorageAccountName = "mysourcestorageaccount" $sourceStorageKey = "verysecretkey" ### Destination storage account definition $destStorageAccountName = "mytargetstorageaccount" $destStorageKey = "thismustbeasecret" ### The source context $sourceContext = New-AzureStorageContext –StorageAccountName $sourceStorageAccountName ` -StorageAccountKey $sourceStorageKey ### The target context $destContext = New-AzureStorageContext –StorageAccountName $destStorageAccountName ` -StorageAccountKey $destStorageKey ### Name for the destination storage container $containerName = "migratedvhds" ### Create a new container in the destination storage, the VHD will be placed in this container New-AzureStorageContainer -Name $containerName -Context $destContext ### Start the copy action $blob = Start-AzureStorageBlobCopy -srcUri $sourceVhdUri ` -SrcContext $sourceContext ` -DestContainer $containerName ` -DestBlob "myvhd.vhd"
### Output the status of the copy $blob | Get-AzureStorageBlobCopyState
Create a virtual machine based on the copied VHDAfter the copy has been completed it is time to build a new virtual machine based on that VHD. The only way to build a VM based on an existing VHD is via PowerShell. The following commands are needed to create a new virtual machine based on an existing VHD (the copied one).
#Create Resource Group $resourceGroupName = "MyResourceGroup" $resourceGroup = New-AzureRmResourceGroup -Name $resourceGroupName -Location "westeurope" # Select Vritual Network $virtualNetworkName = "MyVirtualNetwork" $locationName = "westeurope" $susbnet = New-AzureRmVirtualNetworkSubnetConfig -Name FrontEnd -AddressPrefix 10.0.1.0/24 $virtualNetwork = New-AzureRmVirtualNetwork -Name $virtualNetworkName ` -Subnet $susbnet ` -Location $locationName ` -ResourceGroupName $resourceGroupName ` -AddressPrefix 10.0.0.0/16 # Create IP-Adres $publicIp = New-AzureRmPublicIpAddress -Name "MyPublicIpAddress" ` -ResourceGroupName $resourceGroupName ` -Location $locationName -AllocationMethod Dynamic # Create Network Interface $networkInterface = New-AzureRmNetworkInterface -ResourceGroupName $resourceGroupName ` -Name "MyNetworkInterface" ` -Location $locationName ` -SubnetId $virtualNetwork.Subnets.Id ` -PublicIpAddressId $publicIp.Id ` # VM Config $vhdUri = "https://mytargetstorageaccount.blob.core.windows.net/migratedvhds/myvhd.vhd" $vmConfig = New-AzureRmVMConfig -VMName "MyVirtualMachine" -VMSize "Standard_A1" $vmConfig = Set-AzureRmVMOSDisk -VM $vmConfig -Name "MyVMDisk" -VhdUri $vhdUri ` -CreateOption Attach -Windows $vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $networkInterface.Id #Create VM $vm = New-AzureRmVM -VM $vmConfig -Location $locationName -ResourceGroupName $resourceGroupName