Automatisieren von AWS EC2-Snapshots mit PowerShell

Amazon Elastic Block Store (EBS) ist ein Dienst, der Speicherplatz für Amazon EC2-Instanzen bereitstellt. EBS ist das, auf dem jeder Volume Ihrer EC2-Instanzen läuft. Wenn Sie sich auf einen Dienst verlassen, um wichtige Infrastruktur auszuführen, ist es klug, sicherzustellen, dass die Daten gesichert sind. In diesem Blog-Beitrag erfahren Sie, wie Sie EC2-Snapshots verwalten und automatisieren können, indem Sie die PowerShell-Skriptsprache verwenden.

Jedes an eine EC2-Instanz angeschlossene EBS-Volume kann über einen EBS-Snapshot gesichert werden. Jeder Snapshot kann auf zwei Arten erstellt werden: als vollständiger oder inkrementeller Snapshot. Nun, technisch gesehen beides, aber… gehen Sie einfach mit mir mit.

Wenn die erste Snapshot-Sicherung für eine EC2-Instanz erstellt wird, wird eine Sicherung des gesamten Volumes erstellt. Bei der Erstellung nachfolgender Snapshots werden nur Daten auf Blockebene gespeichert, die sich seit dem letzten Snapshot geändert haben. Im Gegensatz zu typischen inkrementellen Punkt-in-Zeit-Backups werden bei Snapshots jedoch alle Daten für das Volume wiederhergestellt, wenn ein Snapshot wiederhergestellt wird, sodass es einem vollständigen Backup ähnelt.

Snapshots können asynchron erfolgen, was bedeutet, dass Snapshots parallel im Erstellungsprozess sein können. Wenn ein Snapshot gestartet wird, durchläuft er eine ausstehende Phase, bis alle erforderlichen Blöcke in Amazon S3 kopiert sind, wo alle EBS-Snapshots gespeichert werden.

Verwenden von PowerShell zum Erstellen von AWS EC2-Snapshots

Es gibt verschiedene Möglichkeiten, wie Sie EBS-Snapshots in AWS verwalten können. Sie können die AWS Management Console, die AWS CLI, PowerShell oder die APIs direkt verwenden. In diesem Artikel verwenden wir PowerShell, da das AWSPowerShell-Modul eine ausgezeichnete Unterstützung für das Verwalten von EBS-Snapshots mit PowerShell-Befehlen bietet.

Voraussetzungen

Bevor wir weitermachen, gehe ich davon aus, dass Sie einige Voraussetzungen erfüllen, um das Beste aus diesem Tutorial herauszuholen. Sie benötigen:

  • Ein AWS-Konto
  • Eine EC2-Instanz mit einem angehängten Volume
  • Eine Authentifizierung mit dem Root-Benutzer oder einem IAM-Benutzer mit der Berechtigung CreateSnapshot (arn:aws:ec2:region::snapshot/*)

Wenn Sie alle diese Voraussetzungen erfüllt haben, können wir loslegen!

Vorhandene EC2-Snapshots finden

Eine der ersten Aufgaben besteht darin herauszufinden, ob bereits vorhandene Snapshots existieren. Um das herauszufinden, verwenden wir den Befehl Get-EC2Snapshot. Dies ist der Befehl, der nach bereits erstellten Snapshots sucht und sie in der PowerShell-Konsole ausgibt.

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>

Sie werden feststellen, dass die AWS EC2-Snapshots, die angezeigt werden, nicht für Ihre EC2-Instanz sind. Dies sind alles Snapshots, die mit Ihnen geteilt wurden und die Sie zur Wiederherstellung auf Ihre EC2-Instanzen verwenden können. Um alle Snapshots zu entdecken, die von Ihren EC2-Instanzen stammen, verwenden Sie den Parameter OwnerId mit dem Wert self.

PS> Get-EC2Snapshot -OwnerId self

Erstellen eines neuen EBS-Snapshots

Vorausgesetzt, Sie haben bereits eine EC2-Instanz erstellt, können Sie jetzt eine Momentaufnahme erstellen. Sie können neue Momentaufnahmen mit dem Befehl New-EC2Snapshot erstellen, aber zuerst müssen Sie die Volume-ID für jede Volume sammeln, von der Sie eine Momentaufnahme erstellen möchten. Dazu müssen wir zunächst die EC2-Instanz-ID finden, an die das Volume angehängt ist.

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

Sobald Sie die EC2-Instanz-ID kennen, müssen Sie diese verwenden, um die Volumes zu finden. Um alle Volumes zu finden, die an die EC2-Instanz angehängt sind, verwenden Sie den Befehl Get-EC2Volume und filtern Sie die Ausgabe auf die Volumes, deren angehängte Instanz-ID derjenigen entspricht, nach der wir suchen.

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

Jetzt, da wir die Volumes haben, empfiehlt AWS, die Instanz herunterzufahren oder zumindest das Volume zu demontieren. Wir werden die Instanz herunterfahren.

PS> Stop-EC2Instance -InstanceId $instanceId

Jetzt können wir über jedes Volume iterieren und die Volume-ID an den Parameter VolumeId des Befehls New-EC2Snapshot übergeben. Sobald das geschieht, wird die Momentaufnahme in den Zustand pending wechseln.

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

Sie können bestätigen, dass die Momentaufnahme abgeschlossen ist, indem Sie erneut Get-EC2Snapshot ausführen und überprüfen, ob der Zustand nun abgeschlossen ist.

Tags zuweisen

Wenn Sie viele Momentaufnahmen verwalten müssen, kann es schwierig sein, den Überblick zu behalten. Um Momentaufnahmen zu sortieren und für jede Entdeckung zu kategorisieren, können Sie ihnen auch Tags zuweisen. Tags sind ein allgegenwärtiger Bestandteil von EC2 und können für Ihre EBS-Momentaufnahmen verwendet werden.

Sie können Tags bei der Erstellung der Momentaufnahme oder danach zuweisen. Verwenden Sie zur Zuweisung von Tags bei der Erstellung der Momentaufnahme den Parameter TagSpecification des Befehls New-EC2Snapshot.

Beispielsweise möchte ich möglicherweise diesen AWS EC2-Snapshot markieren, den ich gerade vor einer Produktionsänderung gemacht habe. Ich möchte einen Tag mit dem Namen Stage erstellen und ihm den Wert Dev zuweisen. Dazu kann ich ein TagSpecification-Objekt erstellen, einem oder mehreren Tag-Objekten die Tags-Eigenschaft zuweisen und dann den Ressourcentyp definieren, an den dieser Tag angehängt wird.

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

Nachdem ich das TagSpecification-Objekt erstellt habe, kann ich es an New-EC2Snapshot übergeben.

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

Erstellen einer neuen AMI aus Snapshots

Eine weitere coole Funktion von Snapshots ist, dass Sie ein brandneues Image (AMI) aus einem Snapshot erstellen können. Wenn Sie einen Snapshot des Root-Volumes einer nur Linux EC2-Instanz haben, können Sie ganz einfach ein brandneues AMI aus diesem Volumesnapshot erstellen. Angenommen, ich möchte ein neues Image aus dem gerade erstellten Snapshot erstellen. Das kann ich mit dem Befehl New-EC2Image tun.

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

Dann kann ich diese ID als Hashtable an den BlockDeviceMapping-Parameter von New-EC2Image übergeben.

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

Entfernen von AWS EC2-Snapshots

Wenn wir mit dem Snapshot fertig sind, können wir ihn jetzt entfernen. Das ist einfach. Leiten Sie einfach die von Get-EC2Snapshot zurückgegebene Instanz an Remove-EC2Snapshot weiter. Es kann jedoch zu diesem Fehler kommen, wenn ein AMI verwendet wird.

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 diesem Fall ist das AMI registriert und Sie müssen es zuerst mit dem Befehl Unregister-EC2Image abmelden.

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

Zusammenfassung

PowerShell ermöglicht es Ihnen, alle Aspekte von EBS-Snapshots zu verwalten. Wenn die hier behandelten Szenarien nicht Ihren Anforderungen entsprechen, empfehle ich Ihnen, einen Blick auf alle verfügbaren EC2-Snapshot-Befehle zu werfen, indem Sie Get-Command -Noun *ec2snapshot* -Module AWSPowerShell ausführen. Das gibt Ihnen eine gute Vorstellung davon, was mit PowerShell und EC2 (EBS)-Snapshots möglich ist.

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