Automatiser les instantanés AWS EC2 avec PowerShell

L’Amazon Elastic Block Store (EBS) est un service qui fournit du stockage pour les instances Amazon EC2. EBS est ce sur quoi s’exécute chaque volume de vos instances EC2. Lorsque vous comptez sur un service pour exécuter une infrastructure importante, il est sage de s’assurer que les données sont sauvegardées. Dans cet article de blog, apprenez comment gérer et automatiser les instantanés EC2 en utilisant le langage de script PowerShell.

Chaque volume EBS attaché à une instance EC2 peut être sauvegardé via un instantané EBS. Chaque instantané peut être créé de deux façons ; un instantané complet ou incrémentiel. Eh bien, techniquement les deux mais…suivez-moi sur ce coup-là.

Lorsque la première sauvegarde instantanée est créée pour une instance EC2, elle crée une sauvegarde de l’ensemble du volume. Lorsque des instantanés ultérieurs sont créés, seules les données au niveau du stockage de blocs qui ont changé depuis le dernier instantané sont sauvegardées. Cependant, contrairement aux sauvegardes incrémentielles classiques, puisque les instantanés peuvent être chaînés, lorsqu’un instantané est restauré, toutes les données pour ce volume sont restaurées le rendant similaire à une sauvegarde complète.

Les instantanés peuvent se produire de manière asynchrone, ce qui signifie que des instantanés peuvent être en cours de création en parallèle. Lorsqu’il est lancé, un instantané entre dans une phase en attente jusqu’à ce que tous les blocs nécessaires soient copiés vers Amazon S3 où tous les instantanés EBS sont stockés.

Utilisation de PowerShell pour créer des instantanés AWS EC2

Il existe plusieurs façons différentes dont AWS vous permet de gérer les instantanés EBS. Vous pouvez utiliser la Console de gestion AWS, l’interface de ligne de commande AWS (AWS CLI), PowerShell ou les API directement si vous le souhaitez. Dans cet article, nous allons utiliser PowerShell, car le module AWSPowerShell offre un excellent support pour la gestion des instantanés EBS avec des commandes PowerShell.

Prérequis

Avant d’aller trop loin, je présume que vous avez quelques prérequis pour tirer le meilleur parti de ce tutoriel. Vous aurez besoin de :

  • Un compte AWS
  • Une instance EC2 avec un volume attaché
  • Être authentifié avec l’utilisateur root ou un utilisateur IAM ayant l’autorisation CreateSnapshot (arn:aws:ec2:region::snapshot/*)

Une fois que vous avez tous ces prérequis en ordre, nous sommes prêts à commencer !

Recherche des instantanés EC2 existants

Une des premières tâches que nous ferons est de découvrir si nous avons déjà des instantanés existants. Pour le savoir, nous utilisons la commande Get-EC2Snapshot. C’est la commande qui recherchera tous les instantanés qui ont déjà été créés et les affichera dans la console 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>

Vous remarquerez que les instantanés EC2 AWS qui apparaissent ne sont pas ceux de votre instance EC2. Ce sont tous des instantanés qui vous ont été partagés et qui sont disponibles pour être restaurés sur vos instances EC2. Pour découvrir tous les instantanés provenant de vos instances EC2, utilisez le paramètre OwnerId avec la valeur self.

PS> Get-EC2Snapshot -OwnerId self

Création d’un nouvel instantané EBS

En supposant que vous avez déjà créé une instance EC2, vous pouvez maintenant créer une capture instantanée. Vous pouvez créer de nouvelles captures instantanées en utilisant la commande New-EC2Snapshot, mais d’abord, vous devrez rassembler l’ID du volume pour chaque volume que vous souhaitez capturer. Pour ce faire, nous devons d’abord trouver l’ID de l’instance EC2 à laquelle le volume est attaché.

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

Une fois que vous connaissez l’ID de l’instance EC2, vous devrez l’utiliser pour trouver les volumes. Pour trouver tous les volumes attachés à l’instance EC2, vous utiliserez la commande Get-EC2Volume et filtrerez la sortie pour ne garder que les volumes avec un ID d’instance attaché correspondant à celui que nous recherchons.

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

Maintenant que nous avons les volumes, AWS recommande d’arrêter l’instance ou au moins de démonter le volume. Nous allons donc arrêter l’instance.

PS> Stop-EC2Instance -InstanceId $instanceId

Nous pouvons maintenant boucler sur chacun d’eux et passer l’ID du volume au paramètre VolumeId sur la commande New-EC2Snapshot. Une fois cela fait, vous remarquerez alors que la capture instantanée passera à un état de pending.

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

Vous pouvez confirmer que la capture instantanée est terminée en exécutant à nouveau Get-EC2Snapshot et en confirmant que l’état State est désormais completed.

Attribution de balises

Si vous avez beaucoup de captures instantanées à gérer, il peut être difficile de les garder toutes droites. Pour trier les captures instantanées et les catégoriser pour chaque découverte, vous pouvez également leur attribuer des balises. Les balises font partie intégrante d’EC2 et peuvent être utilisées avec vos captures instantanées EBS.

Vous pouvez attribuer des balises lors de la création de la capture instantanée ou après. Pour attribuer des balises lors de la création de la capture instantanée, utilisez le paramètre TagSpecification sur New-EC2Snapshot.

Par exemple, peut-être que je veux étiqueter cette capture instantanée AWS EC2 que je viens de prendre avant d’apporter une modification en production. J’aimerais créer une étiquette appelée Stage et lui attribuer la valeur Dev. Pour ce faire, je peux créer un objet TagSpecification, assigner un ou plusieurs objets Tag à la propriété Tags, puis définir le type de ressource auquel cette étiquette sera attachée.

$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'

Une fois l’objet TagSpecification créé, je peux ensuite le passer à New-EC2Snapshot.

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

Création d’une nouvelle AMI à partir des snapshots

Une autre fonctionnalité intéressante des snapshots est que vous pouvez créer une toute nouvelle image (AMI) à partir d’un snapshot. Si vous avez un snapshot du volume racine d’une instance EC2 Linux uniquement, vous pouvez facilement créer une nouvelle AMI à partir de ce snapshot de volume. Disons que je veux créer une nouvelle image à partir du snapshot que je viens de créer. Je peux le faire en utilisant la commande 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

Ensuite, je peux transmettre cet ID sous forme de hashtable au paramètre BlockDeviceMapping sur New-EC2Image.

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

Suppression des snapshots AWS EC2

Si nous avons terminé avec le snapshot, nous pouvons maintenant les supprimer. C’est facile à faire. Il suffit de rediriger l’instance renvoyée par Get-EC2Snapshot vers Remove-EC2Snapshot. Cependant, vous pouvez rencontrer cette erreur si une AMI est en cours d’utilisation.

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

Dans ce cas, l’AMI est enregistrée et vous devez d’abord la désenregistrer en utilisant la commande Unregister-EC2Image.

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

Résumé

PowerShell vous permet de gérer tous les aspects des instantanés EBS. Si les scénarios que nous avons couverts ici ne correspondent pas à ce que vous devez faire, je vous suggère de consulter l’ensemble des commandes d’instantané EC2 disponibles en exécutant Get-Command -Noun *ec2snapshot* -Module AWSPowerShell. Cela vous donnera une bonne idée de ce qui est possible avec PowerShell et les instantanés EC2 (EBS).

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