In my previous blog, I detailed how to create Virtual Machine (VM) snapshots of all disks and restore in Azure using PowerShell, this is a follow-on blog detailing how you can copy the Virtual Machine disk snapshots to another region, for additional backup purposes for those VMs that cannot be backedup using Azure-related backup resources, possibly an older Windows Server 2003 or similar can use this type of approach; but most likely – part of a DR plan
In the previous blog, you will also have created some snapshots of your Virtual Machine, similar to below:-

These are currently located in North Europe, to copy snapshot to another region we are going to transfer the snapshot to a Storage Account in the West Europe region as a VHD. From the VHD we will then look at creating Managed Disks from these VHDs.
Copy Snapshots to another region
When you run the PowerShell below, it will overwrite the file if it is already there – handy for a DR scenario backup to another region.
$storageaccountdrblob is reference to the blob container that you will be storing the copied snapshots
$snapshots have some simple logic to return the snapshots created within the last 12 hours as over time you may have multiple daily snapshots
$storageaccountdr = "tamopsdrsa" $storageaccountdrblob = "snapshots" $SnapshotResourceGroup = "tamops-changetracking" $storageaccountdrkey = (Get-AzStorageAccountKey -Name $storageaccountdr -ResourceGroupName $snapshotresourcegroup).value[0] $snapshots = Get-AzSnapshot -ResourceGroupName $snapshotresourcegroup | ?{($_.TimeCreated) -gt ([datetime]::UtcNow.Addhours(-12))} foreach ($snapshot in $snapshots) { try { Write-Output "Granting $($snapshot.name) access" $snapshotaccess = Grant-AzSnapshotAccess -ResourceGroupName $snapshotresourcegroup -SnapshotName $snapshot.Name -DurationInSecond 3600 -Access Read -ErrorAction stop Write-Output "$($snapshot.name) access granted" $DestStorageContext = New-AzStorageContext –StorageAccountName $storageaccountdr -StorageAccountKey $storageaccountdrkey -ErrorAction stop $vhdname = $($snapshot.name).Substring(0,$($snapshot.name).Length-16) Write-Output "Begin snapshot: ($($snapshot.name)) copy to $vhdname.vhd" Start-AzStorageBlobCopy -AbsoluteUri $snapshotaccess.AccessSAS -DestContainer $storageaccountdrblob -DestContext $DestStorageContext -DestBlob "$($vhdname).vhd" -Force -ErrorAction stop Write-Output "snapshot: ($($snapshot.name)) copy to $vhdname.vhd completed" } catch { $_ } }
Successful output of this script (output for datadisk1_snapshot_030420):-
Granting datadisk1_snapshot_030420 access datadisk1_snapshot_030420 access granted Begin snapshot: (datadisk1_snapshot_030420) copy to datadisk1.vhd Container Uri: https://tamopsdrsa.blob.core.windows.net/snapshots Name BlobType Length ContentType LastModified AccessTier SnapshotTime IsDeleted ---- -------- ------ ----------- ------------ ---------- ------------ --------- datadisk1.vhd PageBlob -1 2020-04-03 19:23:05Z False snapshot: (datadisk1_snapshot_030420) copy to datadisk1.vhd completed
Creating Managed Disks with VHDs
To create Managed Disks from these .vhds, you have to wait until they have been successfully copied across regions, progress can be checked using:-
Get-AzStorageBlobCopyState -blob "datadisk1.vhd" -Container $storageaccountdrblob -context $DestStorageContext
Output below, Status is what you need to review, if its “pending” the .vhd is still being copied. If “Success” then the .vhd is ready to be created into a Managed Disk
CopyId : 9ee8a183-efb5-4072-9322-27063810dbb1 CompletionTime : 04/04/2020 21:23:07 +00:00 Status : Success Source : https://md-vczv3q3whsw2.blob.core.windows.net/kqvplbsdhs3l/abcd?sv=2017-04-17&sr=b&si=321f4777-d733-4eab-805b-509ec6f214ed&sig=TSlYkJyk4HC bbGeV7rnd6o1WyGADSyD6UuHb9UOO0PI= BytesCopied : 4294967808 TotalBytes : 4294967808 StatusDescription : DestinationSnapshotTime :
Time to create some Managed Disks in the DR region:- West Europe
I created some simple logic to ensure naming of Managed Disks are the same as they are currently in North Europe, reference to $snapshots & $vhdname
#Create Managed Disks $storageaccountdr = "tamopsdrsa" $storageaccountdrblob = "snapshots" $SnapshotResourceGroup = "tamops-changetracking" $ManagedDiskResourceGroup = "tamsops-md" $storageaccountid = Get-AzStorageAccount -Name $storageaccountdr -ResourceGroupName $snapshotresourcegroup $snapshots = Get-AzSnapshot -ResourceGroupName $snapshotresourcegroup | ?{($_.TimeCreated) -gt ([datetime]::UtcNow.Addhours(-12))} foreach ($snapshot in $snapshots) { $vhdname = $($snapshot.name).Substring(0,$($snapshot.name).Length-16) #Create Managed Disk $diskuri = "https://$($storageaccountdr).blob.core.windows.net/$($storageaccountdrblob)/$($vhdname).vhd" $storageType = 'Premium_LRS' try { Write-Output "Creating managed disk: $vhdname" $diskConfig = New-AzDiskConfig -AccountType $storageType -Location westeurope -CreateOption Import -StorageAccountId $storageaccountid.id -SourceUri $diskuri -OsType Windows New-AzDisk -Disk $diskConfig -ResourceGroupName $ManagedDiskResourceGroup -DiskName $vhdname -ErrorAction stop Write-Output "managed disk: $vhdname created" } catch { Write-output "Error Creating managed disk: $vhdname" $_ } }
Output of creating Managed Disks from the .vhds
Creating managed disk: datadisk1 ResourceGroupName : tamsops-md ManagedBy : Sku : Microsoft.Azure.Management.Compute.Models.DiskSku Zones : TimeCreated : 04/04/2020 20:41:20 OsType : Windows HyperVGeneration : CreationData : Microsoft.Azure.Management.Compute.Models.CreationData DiskSizeGB : 4 EncryptionSettingsCollection : ProvisioningState : Succeeded DiskIOPSReadWrite : 120 DiskMBpsReadWrite : 25 DiskState : Unattached Id : /subscriptions/XXXXXXXXX/resourceGroups/tamsops-md/providers/Microsoft.Compute/disks/datadisk1 Name : datadisk1 Type : Microsoft.Compute/disks Location : westeurope Tags : {} managed disk: datadisk1 created Creating managed disk: tamops-vm_disk1_40e292431c0c4afe82c18f82bec39646 ResourceGroupName : tamsops-md ManagedBy : Sku : Microsoft.Azure.Management.Compute.Models.DiskSku Zones : TimeCreated : 04/04/2020 20:41:24 OsType : Windows HyperVGeneration : CreationData : Microsoft.Azure.Management.Compute.Models.CreationData DiskSizeGB : 127 EncryptionSettingsCollection : ProvisioningState : Succeeded DiskIOPSReadWrite : 500 DiskMBpsReadWrite : 100 DiskState : Unattached Id : /subscriptions/XXXXXXXXX/resourceGroups/tamsops-md/providers/Microsoft.Compute/disks/tamops-vm_disk1_40e29 2431c0c4afe82c18f82bec39646 Name : tamops-vm_disk1_40e292431c0c4afe82c18f82bec39646 Type : Microsoft.Compute/disks Location : westeurope Tags : {} managed disk: tamops-vm_disk1_40e292431c0c4afe82c18f82bec39646 created

A handy couple of scripts to assist you with automation in relation to having your snapshots in another region as a “backup” and along with the DR scenario including having the Managed Disks ready to be attached to a Virtual Machine if required.
2 comments