Einführung in AWS-CLI, Teil 5 EBS-Snapshots als Backup und High-Availability-Option

Autor / Redakteur: Dipl. -Ing. Thomas Drilling / Stephan Augsten

Die AWS-CLI für „EC2“ bietet umfassende Funktionen, um Snapshots von EBS Volumes erstellen, verwalten und konvertieren zu können. Neben Backups aus der EC2-Instanz trägt dies auch zu Erhöhung der Ausfallsicherheit bei.

Anbieter zum Thema

Dieses kurze Python/Boto-Programm erstellt automatisch Snapshots von EBS Volumes.
Dieses kurze Python/Boto-Programm erstellt automatisch Snapshots von EBS Volumes.
(Bild: Drilling)

Der AWS-Dienst Amazon Elastic Block Store (EBS) stellt virtuellen Maschinen Volumes für die persistente Blockspeicherung zur Verfügung. Der Clou dabei: jedes Amazon EBS-Volume wird in seiner Availability Zone (AZ) automatisch repliziert und bietet damit von sich aus bereits einen hohen Schutz bei Ausfall von Komponenten der AWS-Infrastruktur.

EBS-Volumes und Snapshots

EBS-Volumes sind zwar ähnlich wie iSCSI- oder FC-LUNs bei einem SAN im Rechenzentrum über das Netzwerk an die AWS-Cloud (VPC) angebunden, bieten aber eine einheitliche Leistung und trotzdem niedrige Latenz. Zudem lassen sich EBS-Volumes binnen Minuten erweitern oder verkleinern.

Legt der Admin in AWS EC2 eine neue virtuelle Maschine (EC2-Instanz) an, deren Boot-Laufwerk ein EBS-Volume ist, wird das Volume innerhalb der AZ automatisch repliziert. Darüber hinaus kann der Admin selbst einen Snapshot jedes Volumes anlegen. Während EBS-Volumes immer an ihre Availability Zone und damit stets an eine spezifische Instanz explizit gebunden sein können, ist der „Scope“ von Snapshots die Region des Nutzers.

Aus dem Snapshot lassen sich dann jederzeit neue Volumes erstellen und an eine Instanz anhängen. Snapshots lassen sich zudem verschlüsseln, sodass ein aus einem verschlüsselten Snapshot erstelltes Volume ebenfalls verschlüsselt ist. Snapshots sind zwar regional gebunden, lassen sich aber per CLI-Kommando bei Bedarf in eine andere Region kopieren.

Snapshots in der CLI

Sämtliche Snapshots eines EBS-Volumes findet der Admin in der AWS Management Console stets im EC2-Dashboard im Abschnitt „Elastic Block Store“ unter „Snapshots“. Per AWS CLI lässt sich das Erstellen von Snapshots sehr komfortabel automatisieren. Legt man z. B. auf diese Weise periodisch neue Snapshots an und löscht ebenfalls automatisiert alte Snapshots (um die Kosten im Griff zu halten), verfügt man über eine einfache und effiziente zusätzliche Sicherheitsstrategie im Hinblick auf die Ausfallsicherheit.

Ermitteln der Volume-ID und Stoppen einer Instanz.
Ermitteln der Volume-ID und Stoppen einer Instanz.
(Bild: Drilling / AWS)

Um einem Snapshot anlegen zu können, benötigt man die Volume-ID des betreffenden Volumes der gewünschten Instanz (Intance-ID). Diese lässt sich wie folgt ermitteln. So liefert z. B. …

aws ec2 describe-instances –query 'Reservations[*].Instances[*].BlockDeviceMappings[0].Ebs.{VolumeId:VolumeId}'

… die Volume-IDs des jeweils ersten EBS-Volumes aller Instanzen aller Reservierungen (Reservations[*].Instances[*].BlockDeviceMappings[0]). Alternativ kann man die Volume ID für die gewünschte Instanz und das gewünschte Volume auch in der Management Console nachschauen. Um einen Snapshot anlegen zu können, muss die Instanz gestoppt sein. Dazu benötigen wir die Instanz-ID:

aws ec2 describe-instances --filters 'Name=tag:Name,Values=Processor' --query 'Reservations[*].Instances[*].InstanceId'

Das Stoppen der Instanz erfolgt dann mit …

aws ec2 stop-instances --instance-ids <instance-id>

… wobei wir uns in der Abbildung für die zweite der gefundenen Instanzen [1] entscheiden.

Ob das Stoppen erfolgreich war, liefert:

aws ec2 describe-instance-status --instance-id <instance-id>

Erstellen des EBS-Volume-Snapshots.
Erstellen des EBS-Volume-Snapshots.
(Bild: Drilling / AWS)

Nun können wir wie folgt einen Snapshot anlegen:

aws ec2 create-snapshot --volume-id <volume-id>

Ob auch das erfolgreich war, verrät …

aws ec2 describe-snapshots --snapshot-id <snapshot-id>

Danach kann die Instanz neu gestartet werden:

aws ec2 start-instances --instance-ids <instance-id>

Ob das erfolgreich war, verrät wieder …

aws ec2 describe-instance-status --instance-id <instance-id>

Snapshots automatisieren

Zum Automatisieren des periodischen Erstellens von Snapshots kann man z. B. unter Linux den cron-Daemon bemühen. Folgender Cron-Task erstellt jede Minute einen neuen Snapshot:

echo "* * * * * aws ec2 create-snapshot --volume-id <volume-id> 2>&1 >> /tmp/cronlog" > cronjob

Nun muss der Cron-Task nur noch eingeplant werden:

crontab cronjob

Ob die automatisierten Snapshots auch erstellt wurden, liefert erneut:

aws ec2 describe-snapshots --filters "Name=volume-id,Values=<volume-id>"

Zum periodischen Löschen älterer, nicht mehr benötigter Snapshots könnte man dann z. B. ein kleines Programm schreiben. Hier ein Beispiel in Python/Boto, das automatisch Snapshots erstellt und nach einer gewissen Zeit wieder löscht. Dabei wird die Gesamtanzahl stets verfügbarer Snapshots mit Hilfe einer Snapshot-Sequenz-ID konstant auf 2 gehalten:

#!/usr/bin/env pythonimport boto3MAX_SNAPSHOTS = 2 # Number of snapshots to keep# Create the EC2 resource
ec2 = boto3.resource('ec2')
# Get a list of all volumes
volume_iterator = ec2.volumes.all()
# Create a snapshot of each volume
for v in volume_iterator:
   v.create_snapshot()
   # Too many snapshots?
   snapshots = list(v.snapshots.all())
   if len(snapshots) > MAX_SNAPSHOTS:
      # Delete oldest snapshots, but keep MAX_SNAPSHOTS available
      snap_sorted = sorted([(s.id, s.start_time, s) for s in snapshots], key=lambda k: k[1])
      for s in snap_sorted[:-MAX_SNAPSHOTS]:
         print "Deleting snapshot", s[0]
         s[2].delete()

(ID:45113276)