Einführung
Ihr Supportteam benötigt einen kleinen Dokumentenspeicher. Ein Objekt besteht aus den Bytes einer Datei und ihren Metadaten. Ein Bucket gruppiert Objekte, und ein Key ist der vollständige Name eines Objekts. Schrägstriche in Keys bilden nützliche Präfixe, erzeugen aber keine normalen Verzeichnisse eines Dateisystems. Sie erstellen einen privaten Bucket, laden zwei synthetische Dokumente hoch, prüfen deren Metadaten, laden die exakten Bytes herunter und entfernen anschließend nur das ausgewählte Dokument, bevor Sie die Umgebung bereinigen.
Bearbeiten Sie zuerst LabEx mit Ihrem Cloudflare-Konto verbinden. Dort lernen Sie das LabEx-Terminal, die Geräteautorisierung, die Bestätigung des Lernkontos und die Konfiguration der Konto-ID kennen. Dieses Lab startet unabhängig in /home/labex/project/r2-lab. Node.js 22.22.0, Wrangler 4.131.1 und AWS SDK 3.888.0 sind bereits vorbereitet. Installieren Sie auf Ihrem eigenen Computer zuerst Node.js und anschließend Wrangler und das AWS SDK als Projektabhängigkeiten mit npm install.
Vor dem Start: Ihr Lernkonto muss über ein aktives R2-Abonnement verfügen. Das R2-Setup von Cloudflare enthält einen Checkout-Ablauf. Prüfen Sie ihn selbst, falls R2 nicht aktiv ist. Bei einem kostenlosen Konto wird R2 nicht automatisch aktiviert. Lesen Sie die Preisübersicht zu Speicher- und Betriebskosten. In dieser Übung verwenden Sie kleine synthetische Dateien und keine gekaufte Domain. Sie benötigen Berechtigungen zur Bucket-Verwaltung sowie die Berechtigung, ein Benutzer-R2-Token einzuschränken, das nur für diesen neuen Bucket gilt. Lassen Sie den öffentlichen Zugriff deaktiviert. Fügen Sie niemals Zugangsdaten in dieses Lab, in Chats oder in Screenshots ein.
Erstellen Sie Ihren privaten Dokument-Bucket
In diesem Schritt autorisieren Sie diese VM und erstellen einen temporären Bucket. Die Geräteautorisierung bestätigt Ihr Lernkonto. Für die R2-Bucket-Verwaltung wird ein separates API-Token verwendet, das auf dieses Konto beschränkt ist.
Starten Sie Bash für die unten verwendete Befehlssyntax. Wechseln Sie anschließend in das vorbereitete Projekt und prüfen Sie die verfügbaren Tools. Lassen Sie dasselbe Terminal geöffnet, damit Ihre Variablen mit den Ressourcennamen erhalten bleiben:
bash
cd /home/labex/project/r2-lab
export PATH="$PWD/.tools/node-v22.22.0-linux-x64/bin:$PATH"
node --version
npx wrangler --version
Autorisieren Sie den angezeigten Gerätecode in Ihrem eigenen Browser. Bestätigen Sie das Lernkonto sowie die angeforderten Lese-Bereiche für Konto und Benutzer, bevor Sie Ihre Zustimmung erteilen:
npx wrangler login --device --browser=false --scopes account:read user:read
npx wrangler whoami --json
Verlangen Sie loggedIn: true. Lesen Sie den Kontonamen auch dann ab, wenn nur ein Konto aufgelistet wird. Ersetzen Sie YOUR_ACCOUNT_ID unten durch die tatsächliche 32-stellige ID dieses Kontos. openssl rand -hex 6 erzeugt zwölf zufällige Hexadezimalzeichen, damit dieses Lab nicht mit einem früheren Durchlauf kollidiert. Das Here-Dokument schreibt eine Standardkonfigurationsdatei; die Shell setzt Ihre Variablen darin ein.
ACCOUNT_ID=YOUR_ACCOUNT_ID
RUN_ID=$(openssl rand -hex 6)
NAME="labex-c05-r01-$RUN_ID"
BUCKET="$NAME-docs"
cat > wrangler.jsonc <<JSON
{"name":"$NAME","account_id":"$ACCOUNT_ID","compatibility_date":"2026-07-30","r2_buckets":[{"binding":"DOCUMENTS","bucket_name":"$BUCKET"}]}
JSON
Öffnen Sie zur Bucket-Verwaltung in Ihrem Cloudflare-Profil die Seite API Tokens und erstellen Sie ein benutzerdefiniertes Token mit einem Namen, der sich auf dieses Lab bezieht. Gewähren Sie die Berechtigung Account → Workers R2 Storage → Edit und beschränken Sie Account Resources auf das Lernkonto, dessen ID Sie gespeichert haben. Legen Sie eine kurze Ablaufzeit fest. Schließen Sie keine anderen Konten und keine nicht benötigten Berechtigungen ein. Diese Berechtigung auf Kontoebene erstellt und löscht Buckets; das objektbezogene Token im nächsten Schritt kann dies nicht.
Kopieren Sie das Token einmal in die Eingabeaufforderung dieser ausgeblendeten VM. umask 077 beschränkt den Dateizugriff auf Ihren Benutzer; read -s blendet die Eingabe aus. Die Datei verwendet die Standardvariable von Wrangler und wird von Git ausgeschlossen.
umask 077
read -r -s -p 'R2 management API token: ' R2_MANAGEMENT_TOKEN; printf '\n'
printf 'CLOUDFLARE_API_TOKEN=%s\n' "$R2_MANAGEMENT_TOKEN" > .env.management
unset R2_MANAGEMENT_TOKEN
Verwenden Sie --env-file=.env.management nur für R2-Verwaltungsbefehle. whoami prüft weiterhin die Geräteautorisierung der VM.
Setzen Sie --env-file an das Ende jedes Wrangler-Befehls, damit dessen Liste von Dateiargumenten nicht auch den Befehlsnamen erfasst. Wenn Wrangler nach dem Erstellen eines Buckets anbietet, eine Bindung zur Konfiguration hinzuzufügen, geben Sie n ein und drücken Sie die Eingabetaste. Die vorgesehene Bindung ist bereits konfiguriert.
npx wrangler r2 bucket create "$BUCKET" --env-file=.env.management
Listen Sie Ihre Buckets auf und suchen Sie den exakt erzeugten Namen. Andere Buckets gehören zu anderen Arbeiten; lassen Sie sie unverändert.
npx wrangler r2 bucket list --env-file=.env.management
Öffnen Sie im Dashboard Storage & databases → R2 → Overview, wählen Sie genau diesen Bucket aus und prüfen Sie die leere Objektliste. Lassen Sie in den Einstellungen die öffentliche Entwicklungs-URL und benutzerdefinierte Domains deaktiviert. Ein Bucket-Name im Dashboard bestätigt die Identität; die späteren Download-Prüfungen weisen nach, dass die gespeicherten Bytes korrekt sind.

Das Beispiel zeigt Standard-Speicher und Public Access Disabled. Der generierte Bucket-Name wird bei dir anders sein.
Dokumente mit Metadaten hochladen
In diesem Schritt geben Sie dem SDK nur Zugriff auf diesen Bucket und speichern zwei Dokumente. Content type teilt einem Client mit, wie er Bytes interpretieren soll. Custom metadata speichert eigene kleine Kennzeichnungen zusammen mit dem Objekt. Keine der beiden Angaben ist eine Zugriffsregel.
Die S3-kompatible API ermöglicht Standard-Storage-SDKs den Zugriff auf R2. Sie verwendet ein separates Access-Key-Paar anstelle des Geräte-Tokens von Wrangler. Öffnen Sie in der R2-Übersicht Account Details → Manage API Tokens und erstellen Sie anschließend ein User API token mit einem Namen, der sich auf den generierten Ressourcennamen dieses Labs bezieht. Wählen Sie Object Read & Write, beschränken Sie das Token auf genau diesen neuen Bucket und wählen Sie eine kurze Ablaufzeit, falls das Formular eine solche Option anbietet. Wählen Sie nicht alle Buckets und keinen Admin-Zugriff aus. Lassen Sie diese Token-Seite geöffnet, bis Sie das einmalig angezeigte Secret gespeichert haben.
Verwenden Sie die folgenden Bash-Eingabeaufforderungen in der VM. read -s blendet die Eingabe aus; umask 077 macht die Zugangsdaten-Datei nur für Ihren Benutzer lesbar. Diese Namen sind die Standard-Umgebungsvariablen des AWS SDK. Fügen Sie die Access Key ID und den Secret Access Key in die jeweiligen Eingabeaufforderungen ein und drücken Sie anschließend die Eingabetaste. Fügen Sie nicht den Wert des allgemeinen API-Tokens ein.
Wählen Sie im Tokenformular unter TTL den Wert 24 hours. Prüfen Sie vor dem Erstellen den genauen Bucket und die Berechtigung Object Read & Write. Widerrufen Sie das Token am Ende des Labs; der Ablauf dient nur als Absicherung.
umask 077
read -r -s -p 'Access Key ID: ' AWS_ACCESS_KEY_ID; printf '\n'
read -r -s -p 'Secret Access Key: ' AWS_SECRET_ACCESS_KEY; printf '\n'
printf 'AWS_ACCESS_KEY_ID=%s\nAWS_SECRET_ACCESS_KEY=%s\n' "$AWS_ACCESS_KEY_ID" "$AWS_SECRET_ACCESS_KEY" > .env.s3
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY
Schreiben Sie einen wiederverwendbaren Client für das Standard-SDK. Das SDK benötigt eine Region als Zeichenfolge; R2 verwendet auto. Durch das Einlesen der vorhandenen Konfiguration richten CLI- und SDK-Operationen sich auf dasselbe Konto und denselben Bucket.
cat > storage.mjs <<'JS'
import { S3Client } from "@aws-sdk/client-s3";
import { readFileSync } from "node:fs";
const config = JSON.parse(readFileSync("wrangler.jsonc", "utf8"));
export const Bucket = config.r2_buckets[0].bucket_name;
export const s3 = new S3Client({
region: "auto",
endpoint: `https://${config.account_id}.r2.cloudflarestorage.com`,
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
}
});
JS
Erstellen Sie nun das Upload-Programm. PutObjectCommand speichert Bytes unter dem angegebenen Key. Beide Dokumente sind synthetisch. Das aufbewahrte Handbuch weist später nach, dass ein gezieltes Löschen keine anderen Keys entfernt.
cat > upload.mjs <<'JS'
import { PutObjectCommand } from "@aws-sdk/client-s3";
import { readFileSync } from "node:fs";
import { s3, Bucket } from "./storage.mjs";
await s3.send(new PutObjectCommand({
Bucket, Key: "documents/report.txt", Body: readFileSync("document.txt"),
ContentType: "text/plain", Metadata: { team: "blue", revision: "1" }
}));
await s3.send(new PutObjectCommand({
Bucket, Key: "retained/handbook.txt", Body: readFileSync("retained.txt"),
ContentType: "text/plain"
}));
console.log("Uploaded two synthetic documents");
JS
--env-file lädt die Zugangsdaten, ohne sie auszugeben:
node --env-file=.env.s3 upload.mjs
Die Erfolgsmeldung wird erst ausgegeben, nachdem beide erwarteten API-Aufrufe abgeschlossen sind. Die Plattformprüfung liest die tatsächlichen Objekte und Metadaten unabhängig davon ein.
Metadaten auflisten und heruntergeladene Bytes vergleichen
In diesem Schritt prüfen Sie die Keys, ohne jedes Objekt herunterzuladen, und rufen anschließend den Report ab. ListObjectsV2 listet Keys auf, während HeadObject nur Metadaten abruft. Dieser kleine Bucket passt auf eine Listenseite. In Produktionsumgebungen müssen Sie Fortsetzungstoken verwenden, wenn IsTruncated den Wert true hat.
cat > inspect.mjs <<'JS'
import { ListObjectsV2Command, HeadObjectCommand, GetObjectCommand } from "@aws-sdk/client-s3";
import { writeFileSync } from "node:fs";
import { s3, Bucket } from "./storage.mjs";
const page = await s3.send(new ListObjectsV2Command({ Bucket }));
console.log(page.Contents.map(object => object.Key));
const metadata = await s3.send(new HeadObjectCommand({ Bucket, Key: "documents/report.txt" }));
console.log({ contentType: metadata.ContentType, metadata: metadata.Metadata });
const object = await s3.send(new GetObjectCommand({ Bucket, Key: "documents/report.txt" }));
writeFileSync("download.txt", await object.Body.transformToByteArray());
JS
node --env-file=.env.s3 inspect.mjs
Die Liste enthält documents/report.txt und retained/handbook.txt. Der Report hat den Wert text/plain sowie die Metadaten team: blue und revision: 1. Die Reihenfolge der Metadaten in der Ausgabe kann abweichen.
cmp vergleicht Bytes und gibt nichts aus, wenn die Dateien übereinstimmen. Die folgende Meldung erscheint nur, wenn der Vergleich erfolgreich ist:
cmp document.txt download.txt && printf "Downloaded bytes match\n"
Aktualisieren Sie die Objektliste desselben Buckets im Dashboard und öffnen Sie die Details des Reports. Vergleichen Sie seinen Key und den Content-Type mit der Ausgabe des SDK. Verwenden Sie die CLI-Ausgabe als Nachweis für die Metadaten, falls das aktuelle Dashboard kein Feld für benutzerdefinierte Metadaten anzeigt.

Das Beispiel zeigt text/plain, revision 1, team blue und die Vorschau des synthetischen Berichts. Dein Bucket-Name und das Erstellungsdatum werden abweichen.
Nur den ausgewählten Report entfernen
In diesem Schritt löschen Sie genau einen vollständigen Objekt-Key und behalten das Handbuch. Ein Präfix ist kein Verzeichnis, das rekursiv gelöscht werden kann. Übergeben Sie der API exakt den Key des Reports.
cat > remove-report.mjs <<'JS'
import { DeleteObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3";
import { s3, Bucket } from "./storage.mjs";
await s3.send(new DeleteObjectCommand({ Bucket, Key: "documents/report.txt" }));
const page = await s3.send(new ListObjectsV2Command({ Bucket }));
console.log(page.Contents.map(object => object.Key));
JS
node --env-file=.env.s3 remove-report.mjs
Nur retained/handbook.txt bleibt übrig. Die Plattformprüfung lädt das Handbuch ebenfalls herunter, um zu bestätigen, dass sein Inhalt unverändert geblieben ist. Führen Sie diese Prüfung aus, bevor Sie mit der vollständigen Bereinigung fortfahren.
Den eigenen Bucket bereinigen
In diesem Schritt entfernen Sie zuerst das verbleibende Objekt und anschließend den leeren Bucket. Lassen Sie Ihre Zugangsdaten aktiv, bis das Löschen auf der Remote-Seite bestätigt wurde.
cat > cleanup.mjs <<'JS'
import { DeleteObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3";
import { s3, Bucket } from "./storage.mjs";
await s3.send(new DeleteObjectCommand({ Bucket, Key: "retained/handbook.txt" }));
const page = await s3.send(new ListObjectsV2Command({ Bucket }));
console.log("Remaining objects:", page.KeyCount);
JS
node --env-file=.env.s3 cleanup.mjs
Verlangen Sie Remaining objects: 0. Wenn Sie ein neues Terminal geöffnet haben, lesen Sie den generierten Bucket-Namen aus der Konfiguration. node -p gibt dieses einzelne Feld aus.
BUCKET=$(node -p "JSON.parse(require('fs').readFileSync('wrangler.jsonc')).r2_buckets[0].bucket_name")
npx wrangler r2 bucket delete "$BUCKET" --env-file=.env.management
Bestätigen Sie bei der Aufforderung nur den exakten Lab-Bucket. Listen Sie die Buckets anschließend erneut auf. Die erfolgreiche Liste darf diesen Namen nicht enthalten. Ein Authentifizierungs- oder Netzwerkfehler bestätigt nicht, dass das Löschen erfolgreich war.
npx wrangler r2 bucket list --env-file=.env.management
Aktualisieren Sie dieselbe Dashboard-Liste und führen Sie anschließend die Plattformprüfung dieses Schritts aus, solange Sie noch angemeldet sind.
Die Lab-Zugangsdaten widerrufen und abmelden
In diesem Schritt schließen Sie den durch diese Übung hinterlassenen Zugriff. Widerrufen Sie auf der Seite R2 API Tokens nur das Objekt-Token, das nach diesem Lab benannt ist. Widerrufen Sie auf der Seite API Tokens Ihres Profils das separate R2-Verwaltungs-Token, das Sie für dieses Lab erstellt haben. Durch das Löschen eines Buckets wird ein Token nicht widerrufen, und wrangler logout widerruft keine S3-Zugangsdaten.
Entfernen Sie nach dem Widerruf die lokale Zugangsdaten-Datei und melden Sie diese VM ab:
rm .env.s3 .env.management
npx wrangler logout
Prüfen Sie die strukturierte Identität. Der Status ungleich null ist zu erwarten, wenn Sie abgemeldet sind:
npx wrangler whoami --json || true
Verlangen Sie loggedIn: false. Lassen Sie Ihre normale Dashboard-Anmeldung bestehen. Die Plattformprüfungen kontrollieren das Entfernen der lokalen Zugangsdaten und die Abmeldung von Wrangler. Beide Token-Widerrufe sind in diesem Kandidaten manuelle Prüfungen im Dashboard; aus dem Löschen der Dateien wird nicht darauf geschlossen.
Zusammenfassung
Sie haben einen privaten R2-Bucket erstellt, Objekt-Bytes und Metadaten gespeichert, Dokumente aufgelistet und heruntergeladen, das gezielte Löschen eines Dokuments nachgewiesen und anschließend den Bucket-Zugriff bereinigt.



