Ein Foto-Upload ist eine Web-Anfrage
Ein Fahrradladen in Leipzig lässt Kunden ein Foto von einer kaputten Klingel hochladen. Das Foto landet in einem S3-Bucket, einem Platz für Dateien in der Cloud. Dein Code meldet sich dafür an keinem Rechner an. Er schickt eine Anfrage über das Web und liest die Antwort.
In dieser Lektion lernst du, was ein Cloud-Dienst ist, wo er läuft und wer wofür sorgt.
Am Ende dieser Lektion
Notiz
Ich kann sagen, was eine Region, ein Dienst und ein API-Aufruf sind.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Dienst | ein fertiges Werkzeug, das du über das Web benutzt | |
| API-Aufruf | eine einzelne Anfrage an einen Dienst samt Antwort | |
| Region | der Teil der Welt, in dem ein Dienst läuft | eu-central-1 |
| Bucket | ein benannter Behälter für Dateien in S3 | |
| Geteilte Verantwortung | Anbieter und Kunde sorgen jeweils für einen Teil des Systems |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Was dieses Modul nicht ist
Notiz
Du brauchst kein AWS-Konto und nichts wird veröffentlicht. Du tippst nie einen echten Schlüssel, ein Passwort oder eine Kontonummer ein. Es geht auch nicht um Kosten oder Rechnungen. Du liest Antworten, die wie echte gebaut sind, und schreibst Python dafür, ganz ohne Netz.
Ein Dienst ist eine API, die du aufrufst
Ein Cloud-Anbieter betreibt riesige Rechner und vermietet, was sie können. Jedes gemietete Werkzeug ist ein Dienst. S3 speichert Dateien. SQS hält Nachrichten in einer Warteschlange. DynamoDB speichert Items in Tabellen.
Einen Dienst benutzt du mit einem API-Aufruf: eine Anfrage, die den Aufruf nennt, zum Beispiel list_objects_v2, und die nötigen Angaben. Die Antwort kommt als Daten zurück.
Run: ein Aufruf und seine Antwort
aufruf = {"dienst": "s3", "operation": "list_objects_v2", "Bucket": "werkstatt-fotos"}
antwort = {
"Name": "werkstatt-fotos",
"KeyCount": 2,
"IsTruncated": False,
"Contents": [
{"Key": "defekt/klingel.png", "Size": 2048, "StorageClass": "STANDARD"},
{"Key": "defekt/bremse.png", "Size": 3072, "StorageClass": "STANDARD"},
],
}
print("Dienst:", aufruf["dienst"])
print("Aufruf:", aufruf["operation"])
print("Schlüssel:", antwort["KeyCount"])
for objekt in antwort["Contents"]:
print(objekt["Key"], objekt["Size"])
# Ändere die Size der Bremse auf 5000 und drücke noch einmal Run.
Ein gescheiterter Aufruf ist auch eine Antwort
Nicht jeder Aufruf klappt. Ein Schlüssel kann fehlen oder ein Bucket gar nicht existieren. Dann antwortet der Dienst mit einem Fehler: einem Code, der das Problem nennt, und einem HTTP-Status.
Dein Code muss zuerst nach dem Fehler suchen. Eine Prüfung wie "Contents" in antwort taugt nur, wenn der Aufruf geklappt hat.
Run: gute Antwort oder Fehler?
gut = {"KeyCount": 1, "Contents": [{"Key": "lies-mich.txt", "Size": 5}]}
schlecht = {"error": {"Code": "NoSuchBucket", "HTTPStatusCode": 404}}
for antwort in [gut, schlecht]:
if "error" in antwort:
print("gescheitert:", antwort["error"]["Code"], antwort["error"]["HTTPStatusCode"])
else:
print("geklappt, Schlüssel:", antwort["KeyCount"])
# Ändere "NoSuchBucket" in "NoSuchKey" und drücke noch einmal Run.
Ein häufiger Fehler
Warnung
Viele denken, eine leere Antwort sei ein Fehler. Das stimmt nicht. Fragst du DynamoDB nach einem Item, das es nicht gibt, kommt {} mit gutem Status. Such nach einem error-Eintrag mit einem Code. Eine leere Antwort heißt nur: nichts gefunden.
Eine Region ist der Ort eines Dienstes
Ein Anbieter hat Rechenzentren an vielen Orten. Eine Region ist ein Gebiet davon, zum Beispiel eu-central-1, das ist Frankfurt. Die Region wählst du, wenn du einen Bucket anlegst. Die Dateien bleiben dort.
Nimm eine Region nahe bei deinen Nutzern, damit Antworten schnell ankommen. In den Antworten steht auch, in welcher Region ein Bucket liegt.
Run: die Region jedes Buckets lesen
antwort = {
"Buckets": [
{"Name": "werkstatt-fotos", "BucketRegion": "eu-central-1", "BucketArn": "arn:aws:s3:::werkstatt-fotos"},
{"Name": "werkstatt-archiv", "BucketRegion": "us-east-1", "BucketArn": "arn:aws:s3:::werkstatt-archiv"},
],
"Owner": {"DisplayName": "werkstatt", "ID": "besitzer-id"},
}
for bucket in antwort["Buckets"]:
print(bucket["Name"], "liegt in", bucket["BucketRegion"])
# Gib nur die Buckets in eu-central-1 aus: setze ein if in die Schleife.
Anbieter und du teilen sich die Arbeit
Der Anbieter sorgt für Gebäude, Maschinen und die Software des Dienstes. Du sorgst für das, was du hineinlegst, und dafür, wer es benutzen darf.
Das heißt geteilte Verantwortung. Wenn du jedem erlaubst, einen Bucket zu lesen, war das deine Entscheidung. Fällt in einem Rechenzentrum der Strom aus, ist das Sache des Anbieters.
Wer sorgt wofür
| Sache | Zuständig |
|---|---|
| Das Gebäude und der Strom | Der Anbieter |
| Die S3-Software selbst | Der Anbieter |
| Welche Dateien du hochlädst | Du |
| Wer einen Bucket lesen darf | Du |
| Der Code, der den Dienst aufruft | Du |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.