Automatizar instantáneas de AWS EC2 con PowerShell

Amazon Elastic Block Store (EBS) es un servicio que proporciona almacenamiento para las instancias de Amazon EC2. EBS es en lo que se ejecuta cada volumen en sus instancias EC2. Cuando depende de un servicio para ejecutar infraestructura importante, es prudente asegurarse de que los datos estén respaldados. En esta publicación de blog, aprenda cómo administrar y automatizar instantáneas de EC2 utilizando el lenguaje de scripting PowerShell.

Cada volumen EBS adjunto a una instancia EC2 puede respaldarse mediante una instantánea de EBS. Cada instantánea puede crearse de una de dos maneras; completa o incremental. Bueno, técnicamente ambas, pero… solo sígame en esto.

Cuando se crea la primera copia de seguridad de instantánea para una instancia EC2, crea una copia de seguridad de todo el volumen. Cuando se crean instantáneas posteriores, solo se guardan los datos en el nivel de almacenamiento de nivel de bloque que han cambiado desde la última instantánea. Sin embargo, a diferencia de las copias de seguridad incrementales típicas en un punto en el tiempo, dado que las instantáneas pueden encadenarse, cuando se restaura una instantánea se restauran todos los datos para ese volumen, lo que la hace similar a una copia de seguridad completa.

Las instantáneas pueden ocurrir de forma asincrónica, lo que significa que las instantáneas pueden estar en proceso de creación en paralelo. Cuando se inicia, una instantánea entra en una fase pendiente hasta que se copian todos los bloques necesarios en Amazon S3 donde se almacenan todas las instantáneas de EBS.

Uso de PowerShell para crear instantáneas de AWS EC2

Hay varias formas diferentes en las que AWS te permite administrar las instantáneas de EBS. Puedes utilizar la Consola de Administración de AWS, la AWS CLI, PowerShell o las API directamente si lo deseas. En este artículo, vamos a utilizar PowerShell ya que el módulo AWSPowerShell tiene un gran soporte para administrar las instantáneas de EBS con comandos de PowerShell.

Prerrequisitos

Antes de comenzar, asumiremos que tienes algunos prerrequisitos para aprovechar al máximo este tutorial. Necesitarás:

  • Una cuenta de AWS
  • Una instancia de EC2 con un volumen adjunto
  • Autenticado con el usuario raíz o un usuario IAM con el permiso CreateSnapshot (arn:aws:ec2:region::snapshot/*)

Una vez que tengas todos estos requisitos previos en orden, ¡estamos listos para empezar!

Encontrar instantáneas de EC2 existentes

Una de las primeras tareas que haremos es descubrir si ya tenemos alguna instantánea existente. Para averiguarlo, utilizamos el comando Get-EC2Snapshot. Este es el comando que buscará cualquier instantánea que ya haya sido creada y las mostrará en la consola de PowerShell.

PS C:\> Get-EC2Snapshot


DataEncryptionKeyId :
Description         : Business/Industry Summary (Windows)
Encrypted           : False
KmsKeyId            :
OwnerAlias          : amazon
OwnerId             : 947081328633
Progress            : 100%
SnapshotId          : snap-8af818e3
StartTime           : 11/19/2008 6:15:17 AM
State               : completed
StateMessage        :
Tags                : {}
VolumeId            : vol-e1ac4888
VolumeSize          : 15
<SNIP>

Notarás que las instantáneas de AWS EC2 que aparecen no son las de tu instancia de EC2. Estas son todas las instantáneas que se han compartido contigo y que están disponibles para que las restaures en tus instancias de EC2. Para descubrir todas las instantáneas que provienen de tus instancias de EC2, utiliza el parámetro OwnerId con el valor self.

PS> Get-EC2Snapshot -OwnerId self

Crear una nueva instantánea de EBS

Suponiendo que ya tienes una instancia de EC2 creada, ahora puedes crear un snapshot. Puedes crear nuevos snapshots usando el comando New-EC2Snapshot, pero primero, necesitarás recopilar el ID del volumen para cada volumen que desees capturar. Para hacer eso, primero necesitamos encontrar el ID de la instancia de EC2 a la que está conectado el volumen.

PS> (Get-EC2Instance).instances
PS> $instanceId = (Get-EC2Instance).instances.InstanceId

Una vez que sepas el ID de la instancia de EC2, necesitarás usarlo para encontrar los volúmenes. Para encontrar todos los volúmenes conectados a la instancia de EC2, usarás el comando Get-EC2Volume y filtrarás la salida para obtener solo los volúmenes con un ID de instancia adjunto al que estamos buscando.

PS> $volumes = Get-EC2Volume | Where-Object { $_.attachments.InstanceId -eq $instanceId }

Attachments      : {i-083007f62ff750d7a}
AvailabilityZone : us-east-1b
CreateTime       : 3/1/2019 7:06:57 AM
Encrypted        : False
Iops             : 100
KmsKeyId         :
Size             : 8
SnapshotId       : snap-0ff5b79fdf9b021e8
State            : in-use
Tags             : {}
VolumeId         : vol-0bf53c62534f99eee
VolumeType       : gp2

Ahora que tenemos los volúmenes, AWS recomienda apagar la instancia o al menos desmontar el volumen. Vamos a proceder a apagar la instancia.

PS> Stop-EC2Instance -InstanceId $instanceId

Ahora podemos iterar sobre cada uno y pasar el ID del volumen al parámetro VolumeId en el comando New-EC2Snapshot. Una vez que eso suceda, notarás que el snapshot entrará en un estado de pendiente.

foreach ($volume in $volumes) {
    New-EC2Snapshot -VolumeId $volume.VolumeId
}

DataEncryptionKeyId :
Description         :
Encrypted           : False
KmsKeyId            :
OwnerAlias          :
OwnerId             : 013223035658
Progress            :
SnapshotId          : snap-027a3550dde80eb3b
StartTime           : 3/1/2019 7:19:13 AM
State               : pending
StateMessage        :
Tags                : {}
VolumeId            : vol-0bf53c62534f99eee
VolumeSize          : 8

Puedes confirmar que el snapshot se ha completado ejecutando Get-EC2Snapshot de nuevo y confirmando que el Estado ahora es completado.

Asignación de etiquetas

Si tienes muchos snapshots para administrar, puede ser difícil mantenerlos todos organizados. Para ordenar los snapshots y categorizarlos para cada descubrimiento, también puedes asignarles etiquetas. Las etiquetas son una parte ubicua de EC2 y se pueden utilizar con tus snapshots de EBS.

Puedes asignar etiquetas en la creación del snapshot o después. Para asignar etiquetas en la creación del snapshot, utiliza el parámetro TagSpecification en New-EC2Snapshot.

Por ejemplo, tal vez quiera etiquetar esta instantánea de AWS EC2 que acabo de tomar antes de realizar un cambio en producción. Me gustaría crear una etiqueta llamada Etapa y asignarle Desarrollo. Para hacerlo, puedo crear un objeto TagSpecification, asignar uno o más objetos Tag a la propiedad Tags, y luego definir el tipo de recurso al que se adjuntará esta etiqueta.

$tag = New-Object Amazon.EC2.Model.Tag
$tag.Key = 'Stage'
$tag.Value = 'Dev'
$tagSpec = New-Object Amazon.EC2.Model.TagSpecification
$tagSpec.Tags = $tag
$tagSpec.ResourceType = 'snapshot'

Una vez creado el objeto TagSpecification, puedo pasar eso a New-EC2Snapshot.

PS> New-EC2Snapshot -VolumeId <VolumeId> -TagSpecification $tagSpec

Creación de una nueva AMI desde instantáneas

Otra característica interesante de las instantáneas es que puedes crear una nueva imagen (AMI) desde una instantánea. Si tienes una instantánea del volumen raíz de una instancia EC2 solo de Linux, puedes crear fácilmente una nueva AMI a partir de esa instantánea de volumen. Digamos que quiero crear una nueva imagen a partir de la instantánea que acabo de crear. Puedo hacerlo usando el comando New-EC2Image.

I’ll first need to capture the snapshot ID.

PS> $snapshotId = Get-EC2Snapshot -OwnerId self | where {$_.Tags.where({$_.Key -eq 'Stage' -and $_.Value -eq 'Dev'})} | Select-Object -ExpandProperty SnapshotId

A continuación, puedo pasar ese ID como una hashtable al parámetro BlockDeviceMapping en New-EC2Image.

PS> $block = @{SnapshotId=$snapshotId}
PS> Register-EC2Image -Name 'my_image' -BlockDeviceMapping @{DeviceName="/dev/sda1";Ebs=$block;VirtualName='ephemeral0'} -RootDeviceName '/dev/sda1'

Eliminación de instantáneas de AWS EC2

Si hemos terminado con la instantánea, ahora podemos eliminarla. Hacerlo es fácil. Simplemente pasa la instancia devuelta por Get-EC2Snapshot a Remove-EC2Snapshot. Sin embargo, puede encontrarse con este error si una AMI está en uso.

PS> Get-EC2Snapshot -OwnerId self | Remove-EC2Snapshot

Confirm
Are you sure you want to perform this action?
Performing the operation "Remove-EC2Snapshot (DeleteSnapshot)" on target "snap-066ccd492f85192be".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): a
Remove-EC2Snapshot : The snapshot snap-066ccd492f85192be is currently in use by ami-0b353cbd967f6658f
At line:1 char:33
+ Get-EC2Snapshot -OwnerId self | Remove-EC2Snapshot
+                                 ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Amazon.PowerShe...2SnapshotCmdlet:RemoveEC2SnapshotCmdlet) [Remove-EC2Snapshot], InvalidOperationExce
   ption
    + FullyQualifiedErrorId : Amazon.EC2.AmazonEC2Exception,Amazon.PowerShell.Cmdlets.EC2.RemoveEC2SnapshotCmdlet

En este caso, la AMI está registrada y primero debes desregistrarla usando el comando Unregister-EC2Image.

PS> $myImage = Get-EC2Image -Owner self
PS> Unregister-EC2Image -ImageId $myImage.ImageId
PS> Get-EC2Snapshot -OwnerId self | Remove-EC2Snapshot

Resumen

PowerShell te permite administrar cada aspecto de las instantáneas de EBS. Si los escenarios que cubrimos aquí no se ajustan a lo que necesitas hacer, te sugiero que eches un vistazo a todos los comandos de instantáneas de EC2 disponibles ejecutando Get-Command -Noun *ec2snapshot* -Module AWSPowerShell. Eso te dará una buena idea de lo que es posible con PowerShell e instantáneas de EC2 (EBS).

Source:
https://adamtheautomator.com/ec2-snapshot/