Beim Umschreiben eines Objekts in Cloud Storage wird ein vorhandenes Objekt kopiert oder transformiert, z. B. durch Verschieben an einen anderen Standort, Rotieren des Verschlüsselungsschlüssels oder Ändern der Speicherklasse. Je nach Objektgröße und Rewrite-Parametern schließt Cloud Storage den Vorgang möglicherweise in einem einzigen Aufruf ab oder gibt den Zwischenfortschritt mit einem rewrite_token zurück. Wenn ein Aufruf ein rewrite_token zurückgibt, übergeben Sie dieses Token an nachfolgende Anfragen, bis die Neuerstellung abgeschlossen ist.
In diesem Dokument wird beschrieben, wie Sie eine Rewrite-Anfrage konfigurieren und die Rewrite-Schleife mit dem rewrite_until_done-Hilfsprogramm oder einer manuellen Schleife in den Cloud-Clientbibliotheken für Rust steuern. Wenn Sie die Clientbibliothek noch nicht kennen, lesen Sie zuerst Cloud Storage mit Rust verwenden.
Hinweis
Bevor Sie den Code in diesem Dokument ausführen, müssen die folgenden Voraussetzungen erfüllt sein:
- Erstellen oder wählen Sie ein Google Cloud -Projekt mit aktivierter Abrechnung aus.
- Erstellen Sie einen dedizierten Cloud Storage-Bucket für Tests in Ihrem Projekt.
- Konfigurieren Sie Standardanmeldedaten für Anwendungen für Ihre Umgebung.
- Weisen Sie Ihrem Hauptkonto eine IAM-Rolle (Identity and Access Management) mit der Berechtigung zum Lesen, Schreiben und Löschen von Objekten im Bucket zu, z. B. Storage-Administrator (
roles/storage.admin).
Abhängigkeiten
Fügen Sie die Cloud Storage-Clientbibliothek und die unterstützenden Crates der Datei Cargo.toml hinzu:
cargo add google-cloud-storage google-cloud-gax anyhow bytes
cargo add tokio --features macros,rt-multi-thread
Client und Rewrite-Anfrage vorbereiten
Sowohl der automatische Helfer als auch die manuelle Schleife beginnen mit einem konfigurierten StorageControl-Client und einem RewriteObject-Anfrage-Builder. Führen Sie in einem Bereich, der bucket_name im Format projects/_/buckets/BUCKET_ID akzeptiert, die folgenden Schritte aus:
Initialisieren Sie einen
StorageControl-Client mit einer Wiederholungsrichtlinie. Wir empfehlen, mindestens 30 Sekunden pro Anfrage einzuplanen. In diesem Beispiel wirdRetryableErrorsmit einem Limit von 5 Versuchen und ohne Gesamtzeitlimit pro Vorgang verwendet:Erstellen Sie den
rewrite_object-Anfrage-Builder, markieren Sie die Anfrage als idempotent, damit der Client vorübergehende Fehler wiederholen kann, und legen Sie die Namen des Quell- und Ziel-Buckets sowie des Objekts fest:Optional: Begrenzen Sie die maximale Anzahl von Bytes, die pro Aufruf neu geschrieben werden, damit einzelne Anfragen den Fortschritt schneller zurückgeben, anstatt ein längeres Zeitlimit für Anfragen zu erfordern. In diesem Beispiel wird ein kleines Limit von 1 MiB festgelegt, um mehrere Iterationen zu erzwingen. Verwenden Sie in der Produktion einen größeren Wert:
Optional: Geben Sie Metadaten für das Zielobjekt an, z. B. die Änderung der Speicherklasse in Nearline (
NEARLINE):
Rewrite-Schleife automatisch ausführen
In den meisten Anwendungsfällen müssen Sie das Merkmal RewriteObjectExt in den Bereich einbeziehen und rewrite_until_done für den Request Builder aufrufen. Dieser Helfer verwaltet das rewrite_token über Iterationen hinweg und löst die Metadaten des Ziels Object auf, nachdem das Umschreiben abgeschlossen ist:
Rewrite-Schleife manuell ausführen
Wenn Sie Zwischenbytezahlen protokollieren, den Prüfpunktfortschritt speichern oder einen Rewrite aus einem anderen Prozess fortsetzen müssen, führen Sie die Rewrite-Schleife manuell aus:
Definieren Sie eine Hilfsfunktion, die eine einzelne
RewriteObject-Anfrage sendet, den Fortschritt protokolliert und entweder die abgeschlossenenObject-Metadaten zurückgibt, wennresp.doneden Werttruehat, oder die nächsterewrite_token:Rufen Sie den Helper in einer Schleife auf. Klonen Sie den Request Builder bei jeder Iteration und übergeben Sie das zurückgegebene Token an
set_rewrite_token, wennmake_one_requestden WertRewriteProgress::Incompletezurückgibt:
Vollständiger Code
Im folgenden Beispiel wird ein 3 MiB großes Quellobjekt hochgeladen und mit der manuellen Schleife in 1 MiB-Schritten in die Nearline Storage-Klasse umgeschrieben. Nach Abschluss des Umschreibens werden im Beispiel die Testobjekte und der leere Test-Bucket gelöscht:
Die Ausgabe sieht in etwa so aus und zeigt den Fortschritt über drei Iterationen und die Metadaten des Zielobjekts:
PROGRESS: total_bytes_rewritten=1048576; object_size=3145728
PROGRESS: total_bytes_rewritten=2097152; object_size=3145728
DONE: total_bytes_rewritten=3145728; object_size=3145728
dest_object=Object { name: "rewrite-object-clone", ... }
Bereinigen
Wenn das Beispiel vorzeitig beendet wird oder Sie einzelne Snippets ohne den Bereinigungs-Helper ausführen, löschen Sie alle verbleibenden Testobjekte und löschen Sie Ihren Test-Bucket, wenn Sie fertig sind, damit Ihnen keine laufenden Kosten für Ihr Google Cloud -Konto entstehen.