Q. Is there example PowerShell showing taking a snapshot of a data disk for an Azure VM then applying the snapshot?
A. Below is a fairly large PowerShell script that demonstrates using snapshots with a data disk that has been added to a VM. You can change the various variables at the start of the script for your own VM name, resource group and data disk name. Note also the comments where I talk about going inside the VM to make some changes. Note through this whole demo the VM can stay running as data disks can be hot-added and removed from a VM. I walk through this demo in a video at to help better understand this at https://youtu.be/WP7-96KQJl0.
#Test with a data disk that has been added to the VM
$AzStorAccName = 'savtechsalrsscus' #Storage account name
$AzResGroup = 'rg-scusa' #resource group name
$AzStrAct = Get-AzureRmStorageAccount -Name $AzStorAccName -ResourceGroupName $AzResGroup
$AzStrKey = Get-AzureRmStorageAccountKey -Name $AzStorAccName -ResourceGroupName $AzResGroup
$AzStrCtx = New-AzureStorageContext $AzStorAccName -StorageAccountKey $AzStrKey[0].Value
$Container = 'vhds'
$VHDName = 'DummyVM-Data1.vhd'
$VHDNameShort = 'DummyVM-Data1'
$VMName = 'DummyVM'
$VMblob = Get-AzureRMStorageAccount -Name $AzStorAccName -ResourceGroupName $AzResGroup |
Get-AzureStorageContainer | where {$_.Name -eq $Container} | Get-AzureStorageBlob | where {$_.Name -eq $VHDName -and $_.ICloudBlob.IsSnapshot -ne $true}
#Inside the VM partition and format the VHD to create drive letter so its empty
$VMsnap = $VMblob.ICloudBlob.CreateSnapshot() #Empty disk snapshot which will be snapshot [0]
#View all snapshots
Get-AzureStorageBlob –Context $AzStrCtx -Container $Container | Where-Object {$_.ICloudBlob.IsSnapshot -and $_.SnapshotTime -ne $null }
#Now copy some data to the data disk then...
$VMsnap = $VMblob.ICloudBlob.CreateSnapshot() #Snapshot with data on the disk which will be snapshot [1]
#Save array of all snapshots
$VMsnaps = Get-AzureStorageBlob –Context $AzStrCtx -Container $Container | Where-Object {$_.ICloudBlob.IsSnapshot -and $_.Name -eq $VHDName -and $_.SnapshotTime -ne $null }
#Detach the disk from the VM can be done while VM is running and will break the lease enabling the blob to be overwritten
$VM = Get-AzureRmVM -ResourceGroupName $AzResGroup -VMName $VMName
Remove-AzureRmVMDataDisk -VM $VM -Name $VHDNameShort
Update-AzureRmVM -ResourceGroupName $AzResGroup -VM $VM
#Restore the first via a copy which should be empty
#Copy snapshot to blob
$status = Start-AzureStorageBlobCopy -CloudBlob $VMsnaps[0].ICloudBlob -Context $AzStrCtx -DestContext $AzStrCtx -DestContainer $Container -DestBlob $VHDName -ConcurrentTaskCount 10 -Force
$status | Get-AzureStorageBlobCopyState
#Attach disk back to VM
Add-AzureRmVMDataDisk -VM $VM -Name $VHDNameShort -Caching None -CreateOption Attach -DiskSizeInGB 1023 -VhdUri $VMblob.ICloudBlob.Uri.AbsoluteUri
Update-AzureRmVM -ResourceGroupName $AzResGroup -VM $VM
#Look inside and note all the content has gone. now we'll restore back to the latest snapshot with the data on it again
Remove-AzureRmVMDataDisk -VM $VM -Name $VHDNameShort
Update-AzureRmVM -ResourceGroupName $AzResGroup -VM $VM
#Restore the first via a copy which should be empty
#Copy snapshot to blob
$status = Start-AzureStorageBlobCopy -CloudBlob $VMsnaps[$VMsnaps.Count - 1].ICloudBlob -Context $AzStrCtx -DestContext $AzStrCtx -DestContainer $Container -DestBlob $VHDName -ConcurrentTaskCount 10 -Force
$status | Get-AzureStorageBlobCopyState
#Attach disk back to VM
Add-AzureRmVMDataDisk -VM $VM -Name $VHDNameShort -Caching None -CreateOption Attach -DiskSizeInGB 1023 -VhdUri $VMblob.ICloudBlob.Uri.AbsoluteUri
Update-AzureRmVM -ResourceGroupName $AzResGroup -VM $VM
#Data is all back
1 comment
Hide comments