Die Logs vom Oktober unter einer Million Dateien
Ein Webshop legt seine Protokolle in einem S3-Bucket ab, eine Datei pro Tag, seit Jahren. Sie brauchen nur die vom Oktober. Eine Million Dateien zu öffnen kommt nicht in Frage.
S3 liefert Ihnen auf Wunsch eine Liste der Dateien, deren Namen auf bestimmte Art anfangen. In dieser Lektion lernen Sie, einen S3-Bucket nach Präfix aufzulisten.
Am Ende dieser Lektion
Notiz
Ich kann Dateien in einem Bucket über ein Präfix finden.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Objekt | eine gespeicherte Datei samt ihren Angaben | |
| Key (Schlüssel) | der volle Name eines Objekts im Bucket | protokolle/2026-10-01/web.log |
| Präfix | der Anfang eines Keys | |
| Trennzeichen | ein Zeichen, das einen Key in Ebenen teilt | / |
| Gemeinsames Präfix | ein ordnerähnlicher Anfang, den mehrere Keys teilen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Bucket enthält Objekte mit je einem Key
Ein Bucket enthält Objekte. Ein Objekt sind die Bytes einer Datei plus Angaben wie die Größe. Jedes Objekt hat einen Key, seinen vollen Namen. Über den Key finden Sie es.
Innen gibt es keinen Baum aus Ordnern. Der Bucket ist eine einzige flache Liste von Keys. Ein Key wie protokolle/2026-10-01/web.log ist nur ein langer Name, der Schrägstriche enthält.
Run: eine Auflistung lesen
antwort = {
"Name": "shop-protokolle",
"Prefix": "",
"KeyCount": 4,
"IsTruncated": False,
"Contents": [
{"Key": "bilder/katze.png", "Size": 4, "StorageClass": "STANDARD"},
{"Key": "protokolle/2026-10-01/web.log", "Size": 17, "StorageClass": "STANDARD"},
{"Key": "protokolle/2026-10-02/web.log", "Size": 6, "StorageClass": "STANDARD"},
{"Key": "lies-mich.txt", "Size": 5, "StorageClass": "STANDARD"},
],
}
for objekt in antwort["Contents"]:
print(objekt["Key"], objekt["Size"])
# Zählen Sie die Size aller Objekte zusammen und geben Sie die Summe aus.
Ein häufiger Fehler
Warnung
Viele denken, ein S3-Bucket habe echte Ordner. Das stimmt nicht. Der Schrägstrich ist nur ein Zeichen im Key. Ein Ordner erscheint in einer Auflistung nur, weil mehrere Keys gleich anfangen. Er verschwindet, sobald sein letztes Objekt gelöscht ist.
Ein Präfix listet Keys, die damit beginnen
Beim Auflisten eines Buckets können Sie ein Präfix mitgeben. S3 liefert dann nur die Keys, die damit anfangen. Das Präfix protokolle/2026-10-01/ findet einen Tag Protokolle und sonst nichts.
S3 filtert, Ihr Code muss also nie den ganzen Bucket lesen. Die Antwort wiederholt Ihr Präfix und zählt die gefundenen Keys in KeyCount.
Run: Keys nach Präfix filtern
keys = [
"bilder/katze.png",
"protokolle/2026-10-01/db.log",
"protokolle/2026-10-01/web.log",
"protokolle/2026-10-02/web.log",
"lies-mich.txt",
]
praefix = "protokolle/2026-10-01/"
gefunden = []
for key in keys:
if key.startswith(praefix):
gefunden.append(key)
print("KeyCount:", len(gefunden))
print(gefunden)
# Ändern Sie praefix in "protokolle/" und drücken Sie Run. Wie viele Keys sind es jetzt?
Ein Trennzeichen fasst Keys zu Ordnern zusammen
Angenommen, Sie wollen die Ordner direkt unter protokolle/ sehen, nicht jede Datei. Geben Sie neben dem Präfix das Trennzeichen / an. S3 schneidet jeden Key am ersten Schrägstrich nach dem Präfix ab.
Keys mit demselben Abschnitt kommen nur einmal zurück, als gemeinsames Präfix, in CommonPrefixes. Keys ohne Schrägstrich nach dem Präfix stehen wie vorher in Contents.
Run: die Ordner unter protokolle/ finden
keys = [
"protokolle/2026-10-01/db.log",
"protokolle/2026-10-01/web.log",
"protokolle/2026-10-02/web.log",
]
praefix = "protokolle/"
gemeinsam = []
for key in keys:
rest = key[len(praefix):]
strich = rest.find("/")
if strich != -1:
ordner = praefix + rest[:strich + 1]
if ordner not in gemeinsam:
gemeinsam.append(ordner)
praefixe = []
for eins in gemeinsam:
praefixe.append({"Prefix": eins})
antwort = {"Prefix": praefix, "Delimiter": "/", "CommonPrefixes": praefixe}
print(antwort)
# Fügen Sie den Key "protokolle/2026-10-03/web.log" zu keys hinzu. Starten Sie noch einmal.
Fehlende Keys antworten auf zwei Arten
Ein einzelnes Objekt anzufordern, das es nicht gibt, ist ein Fehler. Die beiden Aufrufe unterscheiden sich. get_object antwortet mit dem Code NoSuchKey. head_object fragt nur nach den Angaben, und seine Antwort hat keinen Body, der einen Fehlernamen tragen könnte. Darum ist sein Code "404".
Beide haben den Status 404. Prüfen Sie den Status, wenn Sie beide abdecken wollen.
Probieren Sie es im Cloud-Lab aus
Das Cloud-Lab ist eine Übungskopie von S3, SQS und DynamoDB. Klicken Sie in der Leiste auf Lab starten und dann bei jedem Befehl unten auf Ausführen. Sie benutzen die echte AWS-Befehlszeile, dieselben Wörter funktionieren also bei einem echten Konto. Die letzten beiden Befehle zeigen eine Liste mit dem Ordner logs/2026-10-01/ in CommonPrefixes und dann den Fehler NoSuchKey. Dieser Schritt dient zum Üben. Die Aufgabe unten bleibt einfaches Python, Sie können sie also ohne das Lab lösen.
Schlüssel und Adresse des Labs setzen
export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test AWS_DEFAULT_REGION=us-east-1 AWS_ENDPOINT_URL=http://cloud:4566Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Einen Bucket anlegen
aws s3 mb s3://prefix-labHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Objekt unter einem Pfad-Schlüssel speichern
aws s3 cp /etc/hostname s3://prefix-lab/logs/2026-10-01/web.logHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Mit Präfix und Trennzeichen auflisten
aws s3api list-objects-v2 --bucket prefix-lab --prefix logs/ --delimiter /Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Nach einem Schlüssel fragen, den es nicht gibt
aws s3api get-object --bucket prefix-lab --key nothing.txt /dev/nullHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.