Automatizzare gli snapshot di AWS EC2 con PowerShell

Amazon Elastic Block Store (EBS) è un servizio che fornisce spazio di archiviazione per le istanze di Amazon EC2. EBS è su cui si basa ogni volume delle istanze EC2. Quando ci si affida a un servizio per eseguire infrastrutture importanti, è saggio assicurarsi che i dati siano salvati. In questo post del blog, impara come gestire e automatizzare gli snapshot di EC2 utilizzando il linguaggio di scripting PowerShell.

Ogni volume EBS collegato a un’istanza EC2 può essere salvato tramite uno snapshot EBS. Ogni snapshot può essere creato in uno dei due modi; uno snapshot completo o incrementale. Beh, tecnicamente entrambi, ma… seguimi su questo.

Quando viene creato il primo backup snapshot per un’istanza EC2, viene creato un backup dell’intero volume. Quando vengono creati gli snapshot successivi, vengono salvati solo i dati a livello di blocco che sono cambiati rispetto all’ultimo snapshot. Tuttavia, a differenza dei tipici backup incrementali in un determinato momento, poiché gli snapshot possono essere concatenati, quando viene ripristinato uno snapshot, tutti i dati per quel volume vengono ripristinati, rendendolo simile a un backup completo.

Gli snapshot possono essere creati in modo asincrono, il che significa che gli snapshot possono essere creati in parallelo. Quando viene avviato, uno snapshot entra in una fase di attesa fino a quando tutti i blocchi necessari vengono copiati su Amazon S3, dove vengono archiviati tutti gli snapshot EBS.

Utilizzare PowerShell per creare snapshot AWS EC2.

Ci sono diversi modi in cui AWS ti consente di gestire gli snapshot di EBS. Puoi utilizzare la Console di gestione di AWS, la CLI di AWS, PowerShell o le API direttamente se lo desideri. In questo articolo, utilizzeremo PowerShell poiché il modulo AWSPowerShell offre un ottimo supporto per la gestione degli snapshot di EBS con i comandi PowerShell.

Prerequisiti

Prima di procedere, ci saranno alcuni prerequisiti che presumo tu abbia per ottenere il massimo da questo tutorial. Avrai bisogno di:

  • Un account AWS
  • Un’istanza EC2 con un volume collegato
  • Autenticato con l’utente root o un utente IAM con l’autorizzazione CreateSnapshot (arn:aws:ec2:region::snapshot/*)

Una volta che hai tutti questi prerequisiti in ordine, siamo pronti a iniziare!

Trovare gli snapshot esistenti di EC2

Una delle prime attività che faremo è scoprire se ci sono già degli snapshot esistenti. Per capirlo, utilizziamo il comando Get-EC2Snapshot. Questo comando cercherà tutti gli snapshot che sono già stati creati e li visualizzerà sulla console di 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>

Noterai che gli snapshot di EC2 di AWS che vengono mostrati non sono quelli relativi alla tua istanza EC2. Questi sono tutti snapshot condivisi con te e disponibili per il ripristino sulle tue istanze EC2. Per scoprire tutti gli snapshot provenienti dalle tue istanze EC2, utilizza il parametro OwnerId con il valore self.

PS> Get-EC2Snapshot -OwnerId self

Creazione di un nuovo snapshot di EBS

Assumendo che tu abbia già creato un’istanza EC2, puoi ora creare uno snapshot. Puoi creare nuovi snapshot utilizzando il comando New-EC2Snapshot, ma prima dovrai raccogliere l’ID del volume per ogni volume che desideri fotografare. Per fare ciò, dovremo prima trovare l’ID dell’istanza EC2 a cui il volume è collegato.

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

Una volta che conosci l’ID dell’istanza EC2, dovrai usarlo per trovare i volumi. Per trovare tutti i volumi collegati all’istanza EC2, utilizzerai il comando Get-EC2Volume e filtrerai l’output solo per i volumi con un ID di istanza collegata a quello che stiamo cercando.

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

Ora che abbiamo i volumi, AWS consiglia di spegnere l’istanza o almeno smontare il volume. Procediamo con lo spegnimento dell’istanza.

PS> Stop-EC2Instance -InstanceId $instanceId

Ora possiamo iterare su ciascuno di essi e passare l’ID del volume al parametro VolumeId del comando New-EC2Snapshot. Una volta fatto ciò, noterai che lo snapshot passerà allo stato di in attesa.

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

Puoi confermare che lo snapshot sia completato eseguendo nuovamente il comando Get-EC2Snapshot e verificando che lo stato sia ora completato.

Assegnazione dei tag

Se hai molti snapshot da gestire, può essere difficile tenerli tutti separati. Per ordinare gli snapshot e categorizzarli per ogni scoperta, puoi anche assegnare loro dei tag. I tag sono una parte ubiqua di EC2 e possono essere utilizzati per i tuoi snapshot EBS.

Puoi assegnare i tag durante la creazione dello snapshot o successivamente. Per assegnare i tag durante la creazione dello snapshot, utilizza il parametro TagSpecification su New-EC2Snapshot.

Ad esempio, forse voglio contrassegnare questo snapshot di AWS EC2 che ho appena preso prima di apportare una modifica di produzione. Vorrei creare un tag chiamato Stage e assegnarlo come Dev. Per fare ciò, posso creare un oggetto TagSpecification, assegnare uno o più oggetti Tag alla proprietà Tags e quindi definire il tipo di risorsa a cui verrà allegato questo tag.

$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 volta creato l’oggetto TagSpecification, posso quindi passarlo a New-EC2Snapshot.

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

Creazione di una nuova AMI da Snapshots

Un’altra caratteristica interessante degli snapshot è che è possibile creare una nuova immagine (AMI) da uno snapshot. Se si dispone di uno snapshot del volume root di un’istanza EC2 solo Linux, è possibile creare facilmente una nuova AMI da tale snapshot di volume. Supponiamo che voglia creare una nuova immagine dallo snapshot appena creato. Posso farlo usando il 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

In seguito, posso passare quell’ID come hashtable al parametro BlockDeviceMapping su New-EC2Image.

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

Rimozione degli snapshot di AWS EC2

Se abbiamo finito con lo snapshot, ora possiamo rimuoverli. Farlo è semplice. Basta collegare l’istanza restituita da Get-EC2Snapshot a Remove-EC2Snapshot. Tuttavia, potresti incorrere in questo errore se un’AMI è in 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

In questo caso, l’AMI è registrata e devi prima annullarne la registrazione usando il comando Unregister-EC2Image.

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

Riepilogo

PowerShell ti consente di gestire ogni aspetto degli snapshot EBS. Se gli scenari che abbiamo coperto qui non corrispondono a ciò che devi fare, ti suggerisco di dare un’occhiata a tutti i comandi disponibili per gli snapshot EC2 eseguendo Get-Command -Noun *ec2snapshot* -Module AWSPowerShell. Questo ti darà un’idea di ciò che è possibile fare con PowerShell e gli snapshot EC2 (EBS).

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