Reescribir un objeto en Cloud Storage copia o transforma un objeto existente,
como moverlo entre ubicaciones, rotar su clave de encriptación o cambiar su
clase de almacenamiento. Según el tamaño del objeto y los
parámetros de reescritura, Cloud Storage puede completar la
operación en una sola llamada o devolver el progreso intermedio con un
rewrite_token. Cuando una llamada devuelva un rewrite_token, pasa ese token a
las solicitudes posteriores hasta que finalice la reescritura.
En este documento, se muestra cómo configurar una solicitud de reescritura y controlar el bucle de reescritura
con el asistente rewrite_until_done o un bucle manual en las
bibliotecas cliente de Cloud para Rust. Si es la primera vez que usas la biblioteca cliente, consulta
Usa Cloud Storage con Rust primero.
Antes de comenzar
Antes de ejecutar el código de este documento, completa los siguientes requisitos previos:
- Crea o selecciona un proyecto deGoogle Cloud con la facturación habilitada.
- Crea un bucket de Cloud Storage de prueba dedicado en tu proyecto.
- Configura las credenciales predeterminadas de la aplicación para tu entorno.
- Otorga a tu principal un rol de Identity and Access Management (IAM) con permiso para
leer, escribir y borrar objetos en el bucket, como Administrador de almacenamiento
(
roles/storage.admin).
Dependencias
Agrega la biblioteca cliente de Cloud Storage y los crates de compatibilidad a tu
archivo Cargo.toml:
cargo add google-cloud-storage google-cloud-gax anyhow bytes
cargo add tokio --features macros,rt-multi-thread
Prepara el cliente y la solicitud de reescritura
Tanto el ayudante automático como el bucle manual comienzan desde un cliente StorageControl y un compilador de solicitudes RewriteObject configurados. Dentro de un permiso que
acepte bucket_name en el formato
projects/_/buckets/BUCKET_ID, completa los siguientes
pasos:
Inicializa un cliente de
StorageControlcon una política de reintentos. Recomendamos permitir al menos 30 segundos por solicitud. En este ejemplo, se usaRetryableErrorscon un límite de 5 intentos y sin un límite de tiempo general por operación:Crea el compilador de solicitudes
rewrite_object, marca la solicitud como idempotente para que el cliente pueda reintentar los errores transitorios y establece los nombres de bucket y objetos de origen y destino:Opcional: Limita la cantidad máxima de bytes que se reescriben por llamada para que las solicitudes individuales devuelvan el progreso más rápido en lugar de requerir un tiempo de espera de solicitud más largo. En este ejemplo, se establece un límite pequeño de 1 MiB para forzar varias iteraciones. Usa un valor mayor en producción:
Opcional: Especifica los metadatos del objeto de destino, como cambiar la clase de almacenamiento a Nearline (
NEARLINE):
Ejecuta el bucle de reescritura automáticamente
En la mayoría de los casos de uso, incluye el atributo RewriteObjectExt en el alcance y llama a rewrite_until_done en el compilador de solicitudes. Este ayudante administra el rewrite_token en las iteraciones y se resuelve en los metadatos Object de destino después de que se completa la reescritura:
Ejecuta el bucle de reescritura de forma manual
Si necesitas registrar recuentos de bytes intermedios, el progreso de los puntos de control o reanudar una reescritura desde otro proceso, controla el bucle de reescritura de forma manual:
Define una función auxiliar que envíe una sola solicitud
RewriteObject, registre el progreso y devuelva los metadatos deObjectcompletados cuandoresp.doneseatrueo el siguienterewrite_token:Llama al ayudante en un bucle, clona el compilador de solicitudes en cada iteración y pasa el token devuelto a
set_rewrite_tokencada vez quemake_one_requestdevuelvaRewriteProgress::Incomplete:
Completar código
En el siguiente ejemplo, se sube un objeto de origen de 3 MiB y se vuelve a escribir en la clase de almacenamiento Nearline Storage en incrementos de 1 MiB con el bucle manual. Una vez que finaliza la reescritura, en el ejemplo se borran los objetos de prueba y el bucket de prueba vacío:
El resultado es similar al siguiente, que muestra el progreso en tres iteraciones y los metadatos del objeto de destino:
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", ... }
Realiza una limpieza
Si la muestra se cierra antes de tiempo o ejecutas fragmentos individuales sin el asistente de limpieza, borra los objetos de prueba restantes y borra el bucket de prueba cuando termines para que no se generen cargos continuos en tu cuenta de Google Cloud .