Al usar máquinas virtuales en Azure debemos, obviamente, mantener una serie de copias de seguridad de las mismas. Además de utilizar nuestros almacenes de Recovery Services podemos, como no, utilizar nuestro querido Powershell para realizar snapshots de los discos presentes en la VM. Esto nos permite poder automatizar snapshots completos o incrementales y tener a mano un método de recuperación rápido y fiable para nuestras máquinas virtuales.

azure snapshot

 

Un snapshot es una imagen puntual de solo lectura de cualquier disco presente en la máquina virtual . Estos pueden usarse para restaurar una máquina virtual a un estado anterior o para crear una nueva VM en base a este snapshot. Azure permite además de los clásicos snapshots completos, la creación de snapshots incrementales para ahorrar incluso más tiempo y recursos en el proceso. Veremos ambos a continuación además de como recuperar un snapshot para recuperar un estado anterior de una máquina virtual de manera sencilla.

Powershell

Primero y en caso que no dispongamos del mismo instalaremos en nuestro Powershell el módulo AzureVMSnapShots

Install-module azurevmsnapshots

Conectamos a nuestra cuenta de Azure

Connect-azaccount

En caso que dispongamos de más de una subscripción asociada a nuestro email, deberemos seleccionar sobre la que queremos trabajar con

Get-AzSubscription Select-AzSubscription -Subscription "ejemplosubscripción"

Configurar Snapshot

Para crear un snapshot vamos a utilizar toda una serie de variables que definiremos previamente, esto nos ayudará luego a referenciar en los diferentes comandos a nuestra máquina virtual, grupo de recursos etc..sin tener que escribirlos una y otra vez. Para empezar definiremos el nombre del grupo de recursos, la localización del mismo y el nombre de la VM

$resourcegroupname = ‘ejemploRG’
$location = ‘West Europe’
$vmname = ‘ejemploVM’

Teniendo esto vamos a guardar el objeto de la máquina virtual para referenciarlo a posteriori con el cmdlet Get-AzVM

$vm = get-azvm -name $vmname -resourcegroupname $resourcegroupname

Ahora vamos a definir la configuración del snapshot en una nueva variable utilizando el cmdlet New-AzSnapshotConfig. En el comando utilizaremos el parámetro SourceUri en el que indicaremos el disco del cual queremos hacer el snapshot y el nombre de SKU, que puede ser por ejemplo Standard_LRS o Premium_LRS

El siguiente ejemplo lo podemos utilizar para el snapshot del OS Disk

$snapshotconfig = New-AzSnapshotConfig -SourceUri $vm.StorageProfile.OsDisk.ManagementDisk.Id -Location $location -CreateOption copy -SkuName Standard_LRS

El siguiente ejemplo, que varía ligeramente del anterior, para cualquier otro Data Disk, deberemos incrementar el índice en el corchete de DataDisks[X] para referirnos al disco en cuestión.

$snapshotconfig = New-AzSnapshotConfig -SourceUri $vm.StorageProfile.DataDisks[0].ManagementDisk.Id -Location $location -CreateOption copy -SkuName Standard_LRS

Crear el snapshot

Ahora que ya tenemos la configuración creada podemos crear el snapshop con el cmdlet New-AzSnapshot. Además de las variables que ya tenemos solo tendremos que indicar el nombre con el cual queramos guardar el snapshot. En el ejemplo siguiente defino el mismo con la fecha actual además del nombre de la máquina virtual para tener una referencia clara a posteriori.

$timestamp = Get-Date -Format yyMMddhhmmss
$snapshotname = ($vmName+$timestamp)
New-AzSnapshot -Snapshot $snapshotconfig -SnapshotName $snapshotname -ResourceGroupName $resourcegroupname

En pantalla una vez creado, se nos mostrará un resumen de las características del snapshot.

Crear Snapshot Incremental

Azure permite también generar snapshots incrementales de los discos, para ello deberemos primero seleccionar el disco del cual ya tengamos un snapshot de la siguiente manera

$disk = Get-AzDisk -DiskName $vm.StorageProfile.OsDisk.Name -ResourceGroupName $resourceGroupName

Como hemos hecho antes, debemos crear la configuración con el cmdlet New-AzSnapshotConfig, esta vez incluyendo el parámetro incremental. A diferencia de los snapshots normales, estos se almacenan por defecto en discos duros standard y, si la región lo permite, en Zone Redundant Storage (ZRS)

$snapshotConfig=New-AzSnapshotConfig -SourceUri $disk.Id -Location $disk.Location -CreateOption Copy -Incremental

Una vez tenemos la configuración, podemos tomar el snapshop incremental exactamente con el mismo comando que hemos utilizado para los snapshots normales.

New-AzSnapshot -Snapshot $snapshotconfig -SnapshotName $snapshotname -ResourceGroupName $resourcegroupname

Listar Snapshots generados

Para ver los snapshots que hemos generado utilizaremos el cmdlet Get-AzVmSnapshot únicamente indicando el nombre del grupo de recursos. Este comando no listara otros snapshots que hayan sido creados por ejemplo a través de la interfaz web.

get-azvmsnapshot -ResourceGroupName $resourcegroupname

Restaurar Snapshot

Del comando anterior obtenemos un listado de los snapshots que disponemos en el grupo de recursos. A partir de esta lista y un sencillo filtrado podremos restaurar cualquiera de ellos con el cmdlet Restore-AzVmSnapshot.

get-azvmsnapshot -ResourceGroupName $resourcegroupname | Where {$_.Name -eq "ejemploVM200822123656"} | Restore-AzVmSnapshot

Por defecto Azure mantiene el disco actual, pero podríamos indicarle que lo borrara automáticamente añadiendo el parámetro -RemoveOriginalDisk

Eliminar Snapshot

Finalmente podemos eliminar los snapshots que tengamos creados y no necesitemos (ya que obviamente nos están costando dinero..) con el cmdlet Remove-AzVmSnapshot funcionando de la misma manera que el anterior

get-azvmsnapshot -ResourceGroupName $resourcegroupname | Where {$_.Name -eq "ejemploVM200822123656"} | Remove-AzVmSnapshot