Suchen

Einführung in AWS-CLI, Teil 6 S3-Objekte per Kommandozeile verwalten

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

Als echter verteilter Objektspeicher kennt Amazon S3 kein richtiges Dateisystem. Mit dem AWS Command Line Interface lassen sich S3-Ressourcen aber recht komfortabel erstellen, verwalten und verwenden sowie Vorgänge automatisieren.

Firmen zum Thema

Mit den Kommandos ,mv‘ und ,ls‘ lassen sich S3-Objekte verschieben und anzeigen.
Mit den Kommandos ,mv‘ und ,ls‘ lassen sich S3-Objekte verschieben und anzeigen.
(Bild: Drilling / AWS)

Amazon S3 ist ein Objektspeicher zum Speichern und Abrufen beliebiger Datenmengen und Datenarten aus nahezu beliebigen Speicherorten. Dies können Websites und mobile Apps sein oder auch Unternehmensanwendungen sowie Daten von IoT-Sensoren und -Geräten. S3 dient bei Bedarf auch als Archiv für EBS-Snapshots oder als Konfigurationsmanagement-Repository für Chef (Rezepte) oder Puppet (Manifeste) und zum Aufnehmen von Code-Repositories aller Art.

Amazon S3 ist auf eine Haltbarkeit von 99,999999999 % ausgelegt und speichert Daten für Millionen von Anwendungen. Hinzu kommen umfassende Sicherheits- und Compliance-Funktionen und eine direkte Abfragefunktion, die es erlaubt, leistungsstarke Analysen an inaktiven Daten (Data-At-Rest) in S3 durchzuführen.

Was ist Amazon S3?

Als echter Internetspeicher wird S3 beinahe ausschließlich über seine umfassende REST-API über HTTP-Aufrufe und entsprechende Abfragen (PUT, COPY, POST, LIST, GET, DEL) angesprochen. Eine Ausnahme bildet lediglich die Möglichkeit, in der jeweiligen Virtual Private Cloud (VPC) einen S3-Endpunkt anzulegen. Dieser erlaubt es einem Service in der eigenen VPC wie z. B. einer EC2-Instanz, ohne Umweg über das Internet und damit kostenneutral und mit maximaler Performance auf ein S3-Bucket zuzugreifen.

Ansonsten gliedert sich die S3-Kostenstruktur in die eigentlichen Speicherpreise (berechnet wird die genutzte Kapazität), die eben skizzierten Anforderungspreise, einen Preis für das Management der Daten und schließlich die Übertragungspreise „in“ und „aus“ dem S3-Bucket, wobei der Datentransfer in die Cloud kostenlos ist. S3 kennt verschiedene Speicherklassen, die sich hinsichtlich Verfügbarkeit, Haltbarkeit (Durability) und Preisgestaltung unterscheiden. Standardmäßig bietet S3 eine Verfügbarkeit von 99,99 %.

Adressierung und Service-Limits

S3 ist ein echter verteilter Objektspeicher und kennt kein Dateisystem oder ähnliches, was durch das „S“ im Namen für „simple“ gekennzeichnet ist. Die oberste Ebene des Objektspeichers ist der „Bucket“ (z. Dt. Eimer), der sämtliche Objekte (Bilder, Texte, CSS-Dateien, Videos, Log-Dateien etc.) aufnimmt. Der gewählte Bucket-Name muss weltweit eindeutig sein, da der Namespace von S3 global ist, auch wenn der Scope von S3 immer die Region ist, in der der Nutzer den Bucket erzeugt.

Größenbeschränkungen gibt es keine, sieht man mal davon ab, dass pro Konto 100 Buckets erlaubt sind und ein Einzel-Objekt nicht größer als 5 Terabyte (TB) sei darf. Davon abgesehen kann ein Bucket beliebig groß werden. Der Zugriff erfolgt über den Schlüssel „https://s3.amazonaws.com/<Bucket>/<Objekt>“, wobei der gesamte Teil rechts des Buckets samt etwaiger Slashes (/) als „Objekt-Key“ interpretiert wird.

Das ist insofern von Bedeutung, als der Objektspeicher kein hierarchisches Dateisystem, also eine quasi flache Struktur besitzt. Der Nutzer kann also eine Quasi-Ordnerstruktur in den Objekt-Key abbilden, obwohl de facto keine Ordnerstruktur besteht. Bei https://s3.amazonaws.com/<Bucket>/Fotos/2017/Urlaub/IMAG0029.JPG ist der Objekt-Key z. B. „/Fotos/2017/Urlaub/IMAG0029.JPG“.

S3 Command Line Interface

Per AWS-CLI lassen sich Aufgaben im Zusammenhang mit S3 elegant automatisieren. In den folgenden Beispielen kopieren und/oder verschieben wir zunächst eine Anzahl von Dateien von bzw. hin zu einem S3-Bucket. Dazu muss zunächst ein S3-Bucket angelegt werden, wozu es entsprechender Berechtigungen bedarf. Abschließend richten wir eine automatische Synchronisation eines lokalen Verzeichnisses mit eine S3-Bucket ein.

Für unser Beispiel haben wir einfach eine IAM-Policy mit dem Policy-Generator erzeugt.
Für unser Beispiel haben wir einfach eine IAM-Policy mit dem Policy-Generator erzeugt.
(Bild: Drilling / AWS)

S3 kennt historisch bedingt drei verschiedene Ansätze zum Verwalten und Zuweisen von Berechtigungen: die klassischen, aber nur grob granular steuerbaren Bucket-ACLs sowie IAM-Richtlinien oder S3-Bucket-Richtlinien. Für dieses Beispiel erstellen wir der Einfachheit halber eine IAM-Policy mit dem Policy-Generator. Diese soll für das S3-Objekt „arn:aws:s3:::<bucket-name>“, sowie sämtliche Schlüssel darin „arn:aws:s3:::<bucket-name>/*“ vollen Zugriff auf sämtliche S3-Funktionen bieten.

Diese Policy können wir dann an eine ebenfalls neu zu erstellenden IAM-Rolle „S3FullAcess“ hängen, um damit eine neue EC2-Instanz zu instanziieren. Diese soll im folgenden Beispiel auf den Namen „ Processor“ hören und für die skizzierten Synchronisationsbeispiele herhalten. So haben wir in unserer Test-Instanz namens Processor eine fiktive Log-Datei erstellt, deren Einträge durch je einen Zeitstempel gebildet werden. Wir haben dazu folgendes einfaches Bash-Skript verwendet.

#!/bin/bash
while :
do
   date +"%m-%d-%Y %T" >> /home/ec2-user/timestamp.log
   sleep 10
done

Lässt man das Skript mit …

./log-generator &

… permanent im Hintergrund laufen, erhält man im Zehn-Sekunden-Takt (sleep 10) frische Log-Einträge, was man mit

tail timestamp.log

leicht beobachten kann. Nun soll die S3-API ins Spiel kommen. Mit …

Mit den Kommandos ,mv‘ und ,ls‘ lassen sich S3-Objekte verschieben und anzeigen.
Mit den Kommandos ,mv‘ und ,ls‘ lassen sich S3-Objekte verschieben und anzeigen.
(Bild: Drilling / AWS)

aws s3 mv timestamp.log s3://<s3-bucket-name>/logfiles/timestamp-`date +"%m-%d-%Y-%H.%M.%S"`.log

… verschieben wir (s3 mv) diese Datei in ein S3-Bucket namens <bucket-name> und verwenden im Schlüsselnamen den Einschub„>/logfiles“, wodurch eine quasi Verzeichnishierarchie entsteht. Der Inhalt des S3-Buckets sollte jetzt so aussehen:

aws s3 ls s3://<s3-bucket-name>

Um auch die Objekte unterhalb des Logfiles-Anhangs zu sehen, verwendet man den Befehl

aws s3 ls s3://<s3-bucket-name>/logfiles/

Jetzt wollen wir das älteste Objekt verschieben und verwenden dazu den Einschub „/logfiles/archive“, wodurch wieder quasi eine Verzeichnis-Hierarchie simuliert wird.

aws s3 mv s3://<s3-bucket-name>/logfiles/<file-name> s3://<s3-bucket-name>/logfiles/archive/<file-name>

Ob das erfolgreich war, zeigt wieder ...

aws s3 ls s3://<s3-bucket-name>/logfiles/

Außerdem ist es mit der S3-CLI/API möglich, den Inhalt eines aktuellen Verzeichnisses komplett mit einem S3-Bucket zu synchronisieren. Hierzu verwenden wir den Anhang „/files“. Das funktioniert so:

aws s3 sync files s3://<s3-bucket-name>/files/

Den Erfolg verifiziert wieder das Kommando ...

aws s3 ls s3://<s3-bucket-name>/files/

Das Löschen einer einzelnen „Datei“ (die ja real ein Objekt mit Object-Key ist) geht dann folgendermaßen:

aws s3 rm <Object-Key>

also beispielsweise ...

aws s3 rm s3://timestamplog/files/file1.txt

S3-Dateisynchronisation über das AWS Command Line Interface.
S3-Dateisynchronisation über das AWS Command Line Interface.
(Bild: Drilling / AWS)

Danach führen wir einen Resync aus um mit --delete“ zu verifizieren, dass die betreffende Datei im S3-Bucket gelöscht wurde:

aws s3 sync files s3://<s3-bucket-name>/files/ --delete

(ID:45117338)

Über den Autor

Dipl. -Ing. Thomas Drilling

Dipl. -Ing. Thomas Drilling

IT-Consultant, Trainer, Freier Journalist