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