Azure Managed Disk snapshot and restore using PowerShell

Using Virtual Machines in Azure from time-to-time you may want to have a copy of the current point-in-time of your Virtual Machine, rather than taking a full backup of this using Recovery Services, can you create a snapshot of the Virtual Machine disk(s) using an Azure Snapshot

Snapshots are in theory, a simple read-only copy of your Virtual Machines (VM) disks from a point-in-time. These are used as a type of backup that can be used quickly to restore your virtual machine back to the state of the time the snapshot was taken or can be used to create a new virtual machine to assist with further troubleshooting

I am going to show you how to snapshot a virtual machine and restore via PowerShell. Along with this, we will look at incremental snapshots in an additional blog post; this feature was recently made publicly available, more information here

Creating Virtual Machine disk snapshots using PowerShell

Enter Virtual Machine parameters you want to snapshot

# Get VM 
    $VmName = "tamops-vm"
    $VmResourceGroup = "tamops-snapshots"

    $vm = get-azvm -Name $VmName -ResourceGroupName $VmResourceGroup

Snapshot the OS disk first

#VM Snapshot

    Write-Output "VM $($vm.name) OS Disk Snapshot Begin"
    $snapshotdisk = $vm.StorageProfile
    

        $OSDiskSnapshotConfig = New-AzSnapshotConfig -SourceUri $snapshotdisk.OsDisk.ManagedDisk.id -CreateOption Copy -Location eastus -OsType Windows
        $snapshotNameOS = "$($snapshotdisk.OsDisk.Name)_snapshot_$(Get-Date -Format ddMMyy)"

        # OS Disk Snapshot

            try {
                New-AzSnapshot -ResourceGroupName $VmResourceGroup -SnapshotName $snapshotNameOS -Snapshot $OSDiskSnapshotConfig -ErrorAction Stop
            } catch {
                $_
            }
    
            Write-Output "VM $($vm.name) OS Disk Snapshot End"

Output of successful OS Disk Snapshot

VM tamops-vm OS Disk Snapshot Begin


ResourceGroupName            : tamops-snapshots
ManagedBy                    :
Sku                          : Microsoft.Azure.Management.Compute.Models.SnapshotSku
TimeCreated                  : 27/03/2020 16:49:17
OsType                       : Windows
HyperVGeneration             : V1
CreationData                 : Microsoft.Azure.Management.Compute.Models.CreationData
DiskSizeGB                   : 127
EncryptionSettingsCollection :
ProvisioningState            : Succeeded
Id                           : /subscriptions/xxxxxxxxxxxxx/resourceGroups/tamops-snapshots/providers/Microsoft.Compute/snapshots/tamops-vm_d 
                               isk1_a538b6c5dd52462bb1f2c83b4bb9cad2_snapshot_270320
Name                         : tamops-vm_disk1_a538b6c5dd52462bb1f2c83b4bb9cad2_snapshot_270320
Type                         : Microsoft.Compute/snapshots
Location                     : eastus
Tags                         : {}

VM tamops-vm OS Disk Snapshot End

Snapshot of data disks (snapshot per disk created separately

# Data Disk Snapshots 

    Write-Output "VM $($vm.name) Data Disk Snapshots Begin"

    $dataDisks = ($snapshotdisk.DataDisks).name

        foreach ($datadisk in $datadisks) {

            $dataDisk = Get-AzDisk -ResourceGroupName $vm.ResourceGroupName -DiskName $datadisk

            Write-Output "VM $($vm.name) data Disk $($datadisk.Name) Snapshot Begin"

            $DataDiskSnapshotConfig = New-AzSnapshotConfig -SourceUri $dataDisk.Id -CreateOption Copy -Location eastus
            $snapshotNameData = "$($datadisk.name)_snapshot_$(Get-Date -Format ddMMyy)"

                New-AzSnapshot -ResourceGroupName $VmResourceGroup -SnapshotName $snapshotNameData -Snapshot $DataDiskSnapshotConfig -ErrorAction Stop
         
            Write-Output "VM $($vm.name) data Disk $($datadisk.Name) Snapshot End"    
        }

    Write-Output "VM $($vm.name) Data Disk Snapshots End"  

Output of successful data disk snapshots

VM tamops-vm Data Disk Snapshots Begin
VM tamops-vm data Disk datadisk1 Snapshot Begin


ResourceGroupName            : tamops-snapshots
ManagedBy                    :
Sku                          : Microsoft.Azure.Management.Compute.Models.SnapshotSku
TimeCreated                  : 27/03/2020 17:03:24
OsType                       :
HyperVGeneration             :
CreationData                 : Microsoft.Azure.Management.Compute.Models.CreationData
DiskSizeGB                   : 32
EncryptionSettingsCollection :
ProvisioningState            : Succeeded
Id                           : /subscriptions/xxxx-xxx-xxxxxxxxx/resourceGroups/tamops-snapshots/providers/Microsoft.Compute/snapshots/datadisk1_s 
                               napshot_270320
Name                         : datadisk1_snapshot_270320
Type                         : Microsoft.Compute/snapshots
Location                     : eastus
Tags                         : {}

VM tamops-vm data Disk datadisk1 Snapshot End
VM tamops-vm data Disk datadisk2 Snapshot Begin
ResourceGroupName            : tamops-snapshots
ManagedBy                    : 
Sku                          : Microsoft.Azure.Management.Compute.Models.SnapshotSku
TimeCreated                  : 27/03/2020 17:03:32
OsType                       :
HyperVGeneration             :
CreationData                 : Microsoft.Azure.Management.Compute.Models.CreationData
DiskSizeGB                   : 32
EncryptionSettingsCollection :
ProvisioningState            : Succeeded
Id                           : /subscriptions/xxxx-xxx-xxxxxxxxx/resourceGroups/tamops-snapshots/providers/Microsoft.Compute/snapshots/datadisk2_s 
                               napshot_270320
Name                         : datadisk2_snapshot_270320
Type                         : Microsoft.Compute/snapshots
Location                     : eastus
Tags                         : {}

VM tamops-vm data Disk datadisk2 Snapshot End
VM tamops-vm Data Disk Snapshots End

Full script

# Get VM 
    $VmName = "tamops-vm"
    $VmResourceGroup = "tamops-snapshots"

    $vm = get-azvm -Name $VmName -ResourceGroupName $VmResourceGroup

#VM Snapshot

    Write-Output "VM $($vm.name) OS Disk Snapshot Begin"
    $snapshotdisk = $vm.StorageProfile
    

        $OSDiskSnapshotConfig = New-AzSnapshotConfig -SourceUri $snapshotdisk.OsDisk.ManagedDisk.id -CreateOption Copy -Location eastus -OsType Windows
        $snapshotNameOS = "$($snapshotdisk.OsDisk.Name)_snapshot_$(Get-Date -Format ddMMyy)"

        # OS Disk Snapshot

            try {
                New-AzSnapshot -ResourceGroupName $VmResourceGroup -SnapshotName $snapshotNameOS -Snapshot $OSDiskSnapshotConfig -ErrorAction Stop
            } catch {
                $_
            }
    
            Write-Output "VM $($vm.name) OS Disk Snapshot End"

# Data Disk Snapshots 

    Write-Output "VM $($vm.name) Data Disk Snapshots Begin"

    $dataDisks = ($snapshotdisk.DataDisks).name

        foreach ($datadisk in $datadisks) {

            $dataDisk = Get-AzDisk -ResourceGroupName $vm.ResourceGroupName -DiskName $datadisk

            Write-Output "VM $($vm.name) data Disk $($datadisk.Name) Snapshot Begin"

            $DataDiskSnapshotConfig = New-AzSnapshotConfig -SourceUri $dataDisk.Id -CreateOption Copy -Location eastus
            $snapshotNameData = "$($datadisk.name)_snapshot_$(Get-Date -Format ddMMyy)"

                New-AzSnapshot -ResourceGroupName $VmResourceGroup -SnapshotName $snapshotNameData -Snapshot $DataDiskSnapshotConfig -ErrorAction Stop
         
            Write-Output "VM $($vm.name) data Disk $($datadisk.Name) Snapshot End"    
        }

    Write-Output "VM $($vm.name) Data Disk Snapshots End"  

Restoring Virtual Machine using snapshot

If you ran the above script, you will have three snapshots as below

Create OS Disk from Snapshot

# Create OS Disk from snapshot

$SnapshotName = "tamops-vm_disk1_a538b6c5dd52462bb1f2c83b4bb9cad2_snapshot_270320"
$SnapshotResourceGroup = "tamops-snapshots"
$DiskNameOS = "tamops-vm-snapshotdisk"

$snapshotinfo = Get-AzSnapshot -ResourceGroupName $SnapshotResourceGroup -SnapshotName $snapshotName

    New-AzDisk -DiskName $DiskNameOS (New-AzDiskConfig  -Location eastus -CreateOption Copy -SourceResourceId $snapshotinfo.Id) -ResourceGroupName $SnapshotResourceGroup

Output of successful OS disk creation from snapshot

ResourceGroupName            : tamops-snapshots
ManagedBy                    :
Sku                          : Microsoft.Azure.Management.Compute.Models.DiskSku
Zones                        :
TimeCreated                  : 27/03/2020 17:52:23
OsType                       : Windows
HyperVGeneration             : V1
CreationData                 : Microsoft.Azure.Management.Compute.Models.CreationData
DiskSizeGB                   : 127
EncryptionSettingsCollection :
ProvisioningState            : Succeeded
DiskIOPSReadWrite            : 500
DiskMBpsReadWrite            : 60
DiskState                    : Unattached
Id                           : /subscriptions/xxxx-xxx-xxxxxxxxx/resourceGroups/tamops-snapshots/providers/Microsoft.Compute/disks/tamops-vm-snaps 
                               hotdisk
Name                         : tamops-vm-snapshotdisk
Type                         : Microsoft.Compute/disks
Location                     : eastus
Tags                         : {}

Attach new disk now to VM, in the VM disk settings – select Swap OS Disk

Attaching new data disk snapshots, can be done via PowerShell but depending on scenario it may be as easy to just attach as new data disks, done below, or alternatively re-run the above script with the parameters for each data disk

Hopefully you find this blog useful and will assist you in relation to Virtual Machine snapshots in Azure!

1 thought on “Azure Managed Disk snapshot and restore using PowerShell

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: