Das Erstellen und Bereitstellen von AWS-Ressourcen via Python lässt sich recht einfach mit Boto 3 umsetzen. Dabei werden fast alle Amazon Web Services unterstützt, hier sehen wir uns das am Beispiel des AWS-Dienstes S3 an.
Wie wir in Teil 1 dieser Kurzserie gelernt haben, müssen wir Boto 3 installieren und so konfigurieren, dass der Zugriff auf die AWS-APIs gewährleistet ist. Dann lassen sich nahezu alle AWS-Services mittels Boto unter Python ansprechen.
Konkret besitzt Boto3 aber zwei getrennte API-Ebenen. Die Client-APIs (oder API auf niedriger Ebene) stellen Nutzen eine 1-zu-1-Zuordnung der zugrunde liegenden HTTP-API-Calls des jeweiligen AWS-Services zur Verfügung. Darüber hinaus gibt es Ressourcen-APIs, die explizite Netzwerkaufrufe verbergen und stattdessen „Resource“-Objekte und „Collections“ bereitstellen, über die Nutzer auf Attribute zuzugreifen und Aktionen durchzuführen.
Boto selbst ist hervorragend dokumentiert. Die Client- und Ressourcen-Schnittstellen von Boto3 haben dynamisch generierte Klassen, die von JSON-Modellen getrieben werden, welche AWS APIs beschreiben. So lassen sich schnelle Aktualisierungen mit starker Konsistenz für alle unterstützten Services bereitstellen. Weitere Einzelheiten lassen sich dem Boto 3 Quickstart-Guide sowie der vollständigen Boto3-Dokumentation entnehmen.
High-Level-API mit Ressourcen und Collections
Wurde Boto erfolgreich installiert, steht in der Python-Umgebung der gesamten Funktionsumfang von Boto 3 bereits, sofern man die Bibliothek wie folgt inkludiert:
import boto3
Außerdem muss Boto mitgeteilt werden, mit welchem Service man zu arbeiten gedenkt, wie z. B. AWS S3. AWS S3 bietet sich für erste Experimente an, weil es hier nur einen globalen Namensraum gibt und sich der Nutzer keine Gedanken um Regionen und Availability Zones machen muss. Dazu wird zunächst wie folgt eine Boto3-Ressource erstellt:
#Wir wollen AWS S3 benutzen und erstellen dazu eine Ressource-Objekt
S3Ressource = boto3.resource(‘s3‘)
Jetzt hat der Anwender eine S3-Ressource erstellt und kann Anfragen stellen oder Antworten vom Dienst verarbeiten, z. B. eine Liste sämtlicher S3-Buckets in der konfigurierten Default-Region abrufen, die jeweils den Namen des jeweiligen Bucket ausgibt:
for bucket in S3Ressource.buckets.all():
print (bucket.name)
Es sei angemerkt, dass dieses Beispiel auf der neuen print-Funktion in Python3 aufsetzt.
Ebenso einfach ist es, Binärdaten hochzuladen und herunterzuladen.
bucket_name = „mein-bucket“
key = „upload-datei“
s3Ressource = boto3.resource(‘s3‘)
bucket = s3Ressoruce.Bucket(bucket_name)
bucket.upload_file(“meinedatei.txt”,key)
Das Herunterladen einer Datei lässt sich mit der Methode „download_file“ wie folgt formulieren. Wir könnten hier exemplarisch auch gleich eine Fehlerbehandlung implementieren, die meldet, wenn der Service einen 404-Error zurückgibt. In Python wird so etwas mit try/except-Konstrukten formuliert:
import boto3
import botocore #für die Fehlerbehandlung
BUCKET_NAME = ‚meinbucket‘
KEY = ‚mein_bild_s3.jpg‘
s3 = boto3.resource(’s3′)
try:
s3.Bucket(BUCKET_NAME).download_file(KEY, ‚mein_lokales_bild.jpg‘)
except botocore.exceptions.ClientError as e:
if e.response[‚Error‘][‚Code‘] == „404“:
print(„The object does not exist.“)
else:
raise
Auf die Bedeutung von „Ressources“ und „Collections“ und die Existenz zweier API-Ebenen haben wir eingangs bereits hingewiesen. Für das Erstellen der „Verbindung“ (Connection) verfügt Boto 3 sowohl über Low-Level-Clients als auch über Ressourcen auf höherer Ebene. Die Verwendung der „höheren“ Ebene, haben wir mit …
import boto3 s3 = boto3.resource(’s3′)
… nun kennengelernt.
Low-Level-API
Bleiben wir beim AWS-Dienst S3, weil dieser der grundlegendste Service in AWS ist und wohl den meisten Nutzen und Programmierern bekannt sein dürfte. In den folgenden Code-Schnipseln wollen wir noch einmal die Liste vorhandener Amazon-S3-Buckets abrufen, dann einen Bucket erstellen und schließlich eine Datei in den angegebenen Bucket hochladen. Hierfür verwenden wir aber explizit die zugehörigen Methoden aus der Amazon S3-Client-Klasse, darunter:
- list_buckets
- create_bucket
- upload_file
- get_bucket_location
Die Python-API für Amazon S3 wird über die AWS-S3-Clientklasse verfügbar gemacht. Weitere Informationen zu Amazon S3 finden Sie in der Amazon S3-Dokumentation.
Das Beispiel mit dem Auflisten aller Buckets im konfigurierten IAM-Namespace kann damit auch direkt über ein die S3-API und S3-Client-Objekt erfolgen:
import boto3
# Einen S3 client erstellen
s3 = boto3.client(’s3′)
# den S3-Client mit der Methode „list_buckets“ aufrufen. Die Rückgabe in die Variable ergebnis schreiben
ergebnis = s3.list_buckets()
#Eine Liste sämtlicher Bucketnamen aus dem ergebnis-Objekt extrahieren
buckets = [bucket[‚Name‘] for bucket in ergebnis [‚Buckets‘]]
# Die Liste der Buckets ausgeben
print(„Bucket List: %s“ % buckets)