A regravação de um objeto no Cloud Storage copia ou transforma um objeto existente,
como movê-lo entre locais, alternar a chave de criptografia ou alterar a
classe de armazenamento. Dependendo do tamanho do objeto e dos
parâmetros de regravação, o Cloud Storage pode concluir a
operação em uma única chamada ou retornar o progresso intermediário com um
rewrite_token. Quando uma chamada retornar um rewrite_token, transmita esse token para
as solicitações subsequentes até que a regravação seja concluída.
Neste documento, mostramos como configurar uma solicitação de reescrita e conduzir o loop de reescrita
usando o auxiliar rewrite_until_done ou um loop manual nas
bibliotecas de cliente do Cloud para Rust. Se você não conhece a biblioteca de cliente, consulte
Como usar o Cloud Storage com Rust primeiro.
Antes de começar
Antes de executar o código neste documento, conclua os seguintes pré-requisitos:
- Crie ou selecione um projeto doGoogle Cloud com o faturamento ativado.
- Crie um bucket do Cloud Storage dedicado de teste no seu projeto.
- Configure o Application Default Credentials para seu ambiente.
- Conceda ao principal um papel do Identity and Access Management (IAM) com permissão para
ler, gravar e excluir objetos no bucket, como Administrador do Storage
(
roles/storage.admin).
Dependências
Adicione a biblioteca de cliente do Cloud Storage e os crates de suporte ao arquivo
Cargo.toml:
cargo add google-cloud-storage google-cloud-gax anyhow bytes
cargo add tokio --features macros,rt-multi-thread
Preparar o cliente e reescrever a solicitação
O assistente automático e o loop manual começam com um cliente StorageControl e um builder de solicitações RewriteObject configurados. Em um escopo que
aceite bucket_name no formato
projects/_/buckets/BUCKET_ID, siga estas
etapas:
Inicialize um cliente
StorageControlcom uma política de repetição. Recomendamos permitir pelo menos 30 segundos por solicitação. Este exemplo usaRetryableErrorscom um limite de cinco tentativas e sem limite de tempo geral por operação:Crie o builder de solicitações
rewrite_object, marque a solicitação como idempotente para que o cliente possa repetir erros temporários e defina os nomes de bucket e objeto de origem e destino:Opcional: limite o número máximo de bytes reescritos por chamada para que as solicitações individuais retornem o progresso mais rapidamente, em vez de exigir um tempo limite de solicitação mais longo. Este exemplo define um limite pequeno de 1 MiB para forçar várias iterações. Use um valor maior na produção:
Opcional: especifique os metadados do objeto de destino, como alterar a classe de armazenamento para Nearline (
NEARLINE):
Executar o loop de reescrita automaticamente
Na maioria dos casos de uso, inclua a característica RewriteObjectExt no escopo e chame
rewrite_until_done no builder de solicitações. Esse auxiliar gerencia o
rewrite_token em todas as iterações e resolve os metadados Object
de destino após a conclusão da regravação:
Executar o loop de reescrita manualmente
Se você precisar registrar contagens de bytes intermediárias, verificar o progresso ou retomar uma regravação de outro processo, controle o loop de regravação manualmente:
Defina uma função auxiliar que envie uma única solicitação
RewriteObject, registre o progresso e retorne os metadadosObjectconcluídos quandoresp.donefortrueou o próximorewrite_token:Chame o auxiliar em um loop, clonando o builder de solicitação em cada iteração e transmitindo o token retornado para
set_rewrite_tokensempre quemake_one_requestretornarRewriteProgress::Incomplete:
Preencher código
O exemplo a seguir faz upload de um objeto de origem de 3 MiB e o reescreve na classe de armazenamento Nearline Storage em incrementos de 1 MiB usando o loop manual. Depois que a regravação é concluída, o exemplo exclui os objetos de teste e o bucket de teste vazio:
A saída é semelhante à seguinte, mostrando o progresso em três iterações e os metadados do 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", ... }
Limpar
Se a amostra for encerrada antes do tempo ou se você executar snippets individuais sem o assistente de limpeza, exclua todos os objetos de teste restantes e exclua o bucket de teste quando terminar para não gerar cobranças contínuas na sua conta do Google Cloud .