Respaldos automáticos de instancias de EC2 en Amazon AWS

Hasta donde sé, Amazon no tiene un método para programar respaldos automáticos de sus instancias en EC2, así que hice un pequeño script de PowerShell que me permite programar respaldos de un server, específicamente de volúmenes EBS (Elastic Block Storage).

La lógica del script es identificar todos los discos de la instancia, el script supone que tiene solo un disco, pero se puede modificar facilmente para encontrar y respaldar todos en caso de existir mas de uno.

Teniendo el disco, sacamos su “volume ID” y generamos el snapshot. Una cosa interesante del Cmdlet con el que hacemos el snapshot es que podemos ponerle una descripción, para este caso estoy incluyendo la fecha, la hora y el nombre de la instancia, pero podemos ponerle lo que queramos.

Otra cosa que hace el script es que mantiene solo un determinado número de puntos de restauración, en este caso estoy dejando únicamente 7 días. Recordemos que AWS cobra por GB, así que hay que cuidar los centavos 🙂

$nombre = "Mi_Instancia"
$instancia = Get-EC2Instance | select -expandproperty RunningInstance | ? {$_.Tag.Key -eq "Name" -and $_.Tag.Value -eq $nombre}
$id = $instancia.InstanceId
$disco = Get-EC2Volume | Where-Object {$_.Attachment.InstanceId -eq $id}
$fecha = Get-Date -Format "yyMMdd-HHmm"
$descripcion = "backup-$fecha-$nombre"

# Snapshots a mi !!
New-EC2Snapshot -VolumeId $disco.VolumeId -Description $descripcion

# Elimina el Snapshot que tienen mas de 7 días (Bueno, mas de 165 horas, o 6 días + 21 horas)
$7dias = (Get-Date).addhours(-165)
$oldsnapshot = Get-EC2Snapshot | ? {$_.VolumeId -eq $disco.VolumeId -and $_.StartTime -lt $7dias}
Remove-EC2Snapshot -SnapshotId $oldsnapshot.SnapshotId -Force

La manera en la que se programa la ejecución del script de respaldo es utilizando Task Scheduler de Windows, así puede ejecutarse con la frecuencia que queramos.

Si queremos ver todos los snapshots que tiene la instancia ejecutamos esta línea…

 Get-EC2Snapshot | ? {$_.VolumeId -eq $disco.VolumeId} | select description, starttime, state | ft

Algo así …

Captura_de_pantalla_2015-03-07_a_las_21_08_35

Espero lo encuentren útil, y si necesitan ayuda para customizar el script porfavor sólo déjenme un mensaje. Sería un gusto.

Referencias:
AWS Tools para PowerShell http://docs.aws.amazon.com/powershell/latest/reference/Index.html