Speichere Anwendungsdateien auf einem EBS-Volume

AWSBeginner
Jetzt üben

Einführung

Deine Berichtsanwendung benötigt eine eigene Festplatte für ihre Berichtsdatei. Du erstellst ein Amazon-EBS-Volume, verbindest es mit einer EC2-Instance, formatierst und mountest sein Dateisystem und stellst einen Bericht von diesem Volume bereit. Anschließend hängst du das Dateisystem aus, trennst das Volume und löschst die erstellten Ressourcen.

Du solltest den Start einer EC2-Instance und SSH bereits kennen. Jedes Lab beginnt in einer neuen Umgebung mit einem eigenen Anwendungsimage, Netzwerk und Schlüsselpaar.

Bezug zur Zertifizierung

Dieses Lab übt die Auswahl von Blockspeicher für eine EC2-Anwendung und unterstützt die Speicherkonzepte in Aufgabe 3.6 der Lernziele von Domain 3 für AWS Certified Cloud Practitioner CLF-C02.

Starte den Speicherserver

In diesem Schritt startest du die Anwendungsinstance und ermittelst ihre Availability Zone.

Beginne in deinem Arbeitsverzeichnis und lade die bereitgestellten Ressourcen-IDs:

cd /home/labex/project
source launch.env

Starte eine Instance namens storage-server. Das Image enthält bereits eine Berichtsanwendung; du stellst ihr das Datenvolume bereit:

aws ec2 \
  run-instances \
  --image-id "$AMI_ID" \
  --instance-type t3.micro \
  --subnet-id "$SUBNET_ID" \
  --security-group-ids "$SECURITY_GROUP_ID" \
  --key-name report-key \
  --count 1 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=storage-server}]'

Ermittle die Instance-ID anhand ihres Namens-Tags:

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=storage-server \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)

Warte, bis die Instance läuft:

aws ec2 \
  wait instance-running \
  --instance-ids "$INSTANCE_ID"

Eine Availability Zone ist ein isolierter Standort innerhalb einer Region. Ein EBS-Volume wird mit einer Instance in derselben Availability Zone verbunden. Frage die Zone der Instance ab, statt sie zu erraten:

AVAILABILITY_ZONE=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].Placement.AvailabilityZone' \
  --output text)

Prüfe den Zustand und die Zone:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name,Zone:Placement.AvailabilityZone}'

Bestätige running. Öffne AWS View, klicke auf Refresh resources, wähle storage-server und klicke auf Check application. Bestätige HTTP 200, bevor du Speicher hinzufügst.

Erstelle und verbinde das Datenvolume

In diesem Schritt erstellst du ein separates EBS-Datenvolume und verbindest es mit dem laufenden Server.

Amazon EBS bietet Blockspeicher für EC2. Ein Volume ist eine festplattenähnliche Ressource; ein Dateisystem organisiert die Dateien auf diesem Datenträger. Das Verbinden eines Volumes stellt sein Blockgerät bereit, erstellt aber kein Dateisystem. Der Leitfaden zu EBS-Volumes beschreibt die Verbindung und Persistenz von Volumes.

Erstelle ein kleines, leeres SSD-Volume für allgemeine Zwecke. gp3 wählt den Volumetyp, --size 1 fordert ein GiB an und die Zonenvariable legt es in derselben Zone wie deine Instance an. Speichere seine ID für spätere Aktionen:

VOLUME_ID=$(aws ec2 \
  create-volume \
  --availability-zone "$AVAILABILITY_ZONE" \
  --size 1 \
  --volume-type gp3 \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=report-data}]' \
  --query 'VolumeId' \
  --output text)

Warte, bis das neue Volume verfügbar ist:

aws ec2 \
  wait volume-available \
  --volume-ids "$VOLUME_ID"

Verbinde es mit dem API-Gerätenamen /dev/sdf:

aws ec2 \
  attach-volume \
  --volume-id "$VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdf

Warte auf die Verbindung:

aws ec2 \
  wait volume-in-use \
  --volume-ids "$VOLUME_ID"

Prüfe das Volume und seine Verbindung:

aws ec2 \
  describe-volumes \
  --volume-ids "$VOLUME_ID" \
  --query 'Volumes[].{Volume:VolumeId,State:State,Zone:AvailabilityZone,Size:Size,Type:VolumeType,Attachments:Attachments}'

Bestätige in-use, Größe 1, Typ gp3 und eine Verbindung mit deiner Instance. Aktualisiere AWS View und prüfe die Volume-Zeile. Das Root-Volume ist vom neuen Datenvolume getrennt.

Mounte das Volume und stelle einen Bericht bereit

In diesem Schritt initialisierst du das leere Datenvolume und machst einen Bericht für die Anwendung verfügbar.

Rufe die aktuelle öffentliche Adresse der Instance ab:

PUBLIC_IP=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].PublicIpAddress' \
  --output text)

Verbinde dich mit der bereitgestellten SSH-Konfiguration:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Prüfe innerhalb der Instance das neu verbundene Gerät. Sein Linux-Name ist in diesem Lab /dev/xvdf; Gerätenamen können vom API-Verbindungsnamen abweichen. Andere EC2-Images können NVMe-Namen verwenden. Identifiziere deshalb einen Datenträger, bevor du ihn bearbeitest. Der offizielle Leitfaden zur Vorbereitung von Linux-Volumes erklärt diesen Unterschied.

lsblk -f /dev/xvdf

Bestätige, dass das Gerät keinen Dateisystemtyp hat. Erstelle nur auf diesem neu erstellten, leeren Datenvolume ein ext4-Dateisystem. Das Formatieren eines Volumes mit vorhandenen Daten würde diese löschen:

sudo mkfs.ext4 /dev/xvdf

Ein Mountpunkt ist das Verzeichnis, über das du auf ein Dateisystem zugreifst. Mounte das neue Dateisystem im vorbereiteten Verzeichnis der Berichtsanwendung:

sudo mount /dev/xvdf /srv/reports

Bestätige das Quellgerät, Dateisystem und den Mountpunkt:

findmnt /srv/reports

Suche nach /dev/xvdf, ext4 und /srv/reports. Erstelle einen CSV-Bericht mit synthetischen Daten. sudo tee schreibt in das Dateisystem, das dem Administrator gehört; das Here-Dokument mit einem zitierten Begrenzungswort bewahrt die zwei Zeilen:

sudo tee /srv/reports/report.csv <<'CSV'
period,total
Q1,320
CSV

Lies die Datei erneut:

cat /srv/reports/report.csv

Kehre zum LabEx-Terminal zurück:

exit

Wähle in AWS View storage-server und klicke auf Read volume report. Bestätige HTTP 200 und den CSV-Text period,total und Q1,320. Diese Antwort zeigt, dass die Anwendung die Datei vom gemounteten Volume lesen kann.

Der Mount in diesem Lab erfolgt manuell. Ein Neustart stellt einen manuellen Mount nicht automatisch wieder her. In Produktionsumgebungen wird üblicherweise die Dateisystem-UUID in /etc/fstab konfiguriert, nachdem der Eintrag getestet wurde.

Hänge aus, trenne und lösche

In diesem Schritt entfernst du das Datenvolume und die Anwendungsinstance in einer kontrollierten Reihenfolge.

Verbinde dich zuerst erneut mit der Anwendungsinstance:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Hänge das Dateisystem aus, bevor du seinen Datenträger trennst. Dadurch wird der Dateisystemzugriff beendet und ausstehende Schreibvorgänge werden abgeschlossen:

sudo umount /srv/reports

Bestätige, dass es nicht mehr gemountet ist:

findmnt /srv/reports

Ein nicht gemountetes Verzeichnis liefert keine Ausgabe und findmnt einen Exitstatus ungleich null; das ist hier zu erwarten. Kehre zum LabEx-Terminal zurück:

exit

Trenne nur dein Datenvolume:

aws ec2 \
  detach-volume \
  --volume-id "$VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdf

Warte, bis das Volume wieder verfügbar ist:

aws ec2 \
  wait volume-available \
  --volume-ids "$VOLUME_ID"

Lösche das getrennte Volume. Dadurch werden seine Daten dauerhaft entfernt. Bewahre wichtige Dateien oder ein Backup auf, bevor du ein Produktionsvolume löschst:

aws ec2 \
  delete-volume \
  --volume-id "$VOLUME_ID"

Beende die Anwendungsinstance:

aws ec2 \
  terminate-instances \
  --instance-ids "$INSTANCE_ID"

Warte auf die Beendigung:

aws ec2 \
  wait instance-terminated \
  --instance-ids "$INSTANCE_ID"

Prüfe den abschließenden Zustand der Instance:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name}'

Bestätige terminated und liste dann die verbleibenden Volumes auf:

aws ec2 \
  describe-volumes \
  --query 'Volumes[].{Volume:VolumeId,State:State}'

Erwarte []: Dein Datenvolume wurde ausdrücklich gelöscht und das Root-Volume dieser Instance wurde bei ihrer Beendigung gelöscht. Aktualisiere AWS View und bestätige, dass der Server kein laufendes Ziel mehr ist und die Volumeliste leer ist. Behalte das vorbereitete Netzwerk und Schlüsselpaar bei.

Zusammenfassung

Du hast ein EBS-Datenvolume in derselben Availability Zone wie eine EC2-Instance erstellt, verbunden, ein leeres Dateisystem formatiert und für die Anwendung gemountet. Du hast eine echte Berichtsantwort geprüft und anschließend das Volume ausgehängt, getrennt und gelöscht, bevor du den Server beendet hast.