Como mover e renomear intervalos

Ao criar um intervalo, você define permanentemente o nome, a localização geográfica e o projeto de que esse intervalo faz parte. No entanto, é possível mover ou renomear o intervalo com eficiência:

  • Se não houver dados no intervalo antigo, exclua-o e crie outro intervalo com um novo nome, em um novo local ou em um novo projeto.

  • Se houver dados no intervalo antigo, crie um novo com o nome, local e/ou projeto que você quer, copie os dados do intervalo antigo para o novo e exclua o antigo e o conteúdo dele. Veja a descrição desse processo nas etapas abaixo.

    Se quiser que o novo intervalo tenha o mesmo nome do antigo, mova os dados duas vezes: um intervalo intermediário armazena temporariamente os dados para que você possa excluir o intervalo original e liberar o nome do intervalo final.

Para mover seus dados de um intervalo para outro, siga estas etapas:

Etapa 1) Criar um novo intervalo

Console

  1. Abra o navegador do Cloud Storage no Console do Google Cloud.
    Abrir o navegador do Cloud Storage
  2. Clique em Criar intervalo para abrir o formulário de criação do intervalo.
  3. Novo intervalo.

  4. Insira as informações do intervalo e clique em Continuar para concluir cada etapa:
    • Especifique um Nome, sujeito aos requisitos de nomenclatura do intervalo.
    • Selecione uma classe de armazenamento padrão para o intervalo. A classe de armazenamento padrão será atribuída por padrão a todos os objetos carregados no intervalo. Em seguida, selecione um Local onde os dados do intervalo serão armazenados permanentemente.

      Observação: o painel à direita Estimativa de custo mensal estima os custos mensais do intervalo com base na classe e no local de armazenamento selecionados, assim como no tamanho e nas operações dos dados.

    • Selecione um modelo de controle de acesso para determinar como controlar o acesso aos objetos do intervalo.
    • Opcionalmente, é possível adicionar rótulos de intervalos, definir uma política de retenção e escolher um método de criptografia.
  5. Clique em Concluir.

gsutil

Use o comando gsutil mb:

gsutil mb gs://[BUCKET_NAME]/

Em que:

Para ter mais controle sobre a criação do intervalo, defina as seguintes sinalizações opcionais:

Por exemplo:

  gsutil mb -p [PROJECT_NAME] -c [STORAGE_CLASS] -l [BUCKET_LOCATION] -b on gs://[BUCKET_NAME]/

Amostras de código

.

C++

Para mais informações, consulte a documentação de referência da API do Cloud Storage para C++.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string bucket_name) {
  StatusOr<gcs::BucketMetadata> bucket_metadata =
      client.CreateBucket(bucket_name, gcs::BucketMetadata());

  if (!bucket_metadata) {
    throw std::runtime_error(bucket_metadata.status().message());
  }

  std::cout << "Bucket " << bucket_metadata->name() << " created."
            << "\nFull Metadata: " << *bucket_metadata << "\n";
}

C#

Para mais informações, consulte a documentação de referência da API do Cloud Storage para C#.

private void CreateBucket(string bucketName)
{
    var storage = StorageClient.Create();
    storage.CreateBucket(s_projectId, bucketName);
    Console.WriteLine($"Created {bucketName}.");
}

Go

Para mais informações, consulte a documentação de referência da API do Cloud Storage para Go.

bucket := client.Bucket(bucketName)
if err := bucket.Create(ctx, projectID, &storage.BucketAttrs{
	StorageClass: "COLDLINE",
	Location:     "asia",
}); err != nil {
	return err
}

Java

Para mais informações, consulte a documentação de referência da API do Cloud Storage para Java.

Bucket bucket =
    storage.create(
        BucketInfo.newBuilder(bucketName)
            // See here for possible values: http://g.co/cloud/storage/docs/storage-classes
            .setStorageClass(StorageClass.COLDLINE)
            // Possible values: http://g.co/cloud/storage/docs/bucket-locations#location-mr
            .setLocation("asia")
            .build());

Node.js

Para mais informações, consulte a documentação de referência da API do Cloud Storage para Node.js.

/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function createBucket() {
  // Creates a new bucket in the Asia region with the coldline default storage
  // class. Leave the second argument blank for default settings.
  //
  // For default values see: https://cloud.google.com/storage/docs/locations and
  // https://cloud.google.com/storage/docs/storage-classes

  const [bucket] = await storage.createBucket(bucketName, {
    location: 'ASIA',
    storageClass: 'COLDLINE',
  });

  console.log(`Bucket ${bucket.name} created.`);
}

createBucket();

PHP

Para mais informações, consulte a documentação de referência da API do Cloud Storage para PHP.

use Google\Cloud\Storage\StorageClient;

/**
 * Create a Cloud Storage Bucket.
 *
 * @param string $bucketName name of the bucket to create.
 * @param string $options options for the new bucket.
 *
 */
function create_bucket($bucketName, $options = [])
{
    $storage = new StorageClient();
    $bucket = $storage->createBucket($bucketName, $options);
    printf('Bucket created: %s' . PHP_EOL, $bucket->name());
}

Python

Para mais informações, consulte a documentação de referência da API do Cloud Storage para Python.

from google.cloud import storage

def create_bucket(bucket_name):
    """Creates a new bucket."""
    # bucket_name = "your-new-bucket-name"

    storage_client = storage.Client()

    bucket = storage_client.create_bucket(bucket_name)

    print("Bucket {} created".format(bucket.name))

Ruby

Para mais informações, consulte a documentação de referência da API do Cloud Storage para Ruby.

# project_id    = "Your Google Cloud project ID"
# bucket_name   = "Name of Google Cloud Storage bucket to create"
# location      = "Location of where to create Cloud Storage bucket"
# storage_class = "Storage class of Cloud Storage bucket"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new project_id: project_id
bucket  = storage.create_bucket bucket_name,
                                location:      location,
                                storage_class: storage_class

puts "Created bucket #{bucket.name} in #{location}" +
     " with #{storage_class} class"

APIs REST

API JSON

  1. Receba um token de acesso de autorização do OAuth 2.0 Playground. Configure o Playground para usar suas credenciais do OAuth.
  2. Crie um arquivo .json com as informações a seguir:
  3. {
      "name": "[BUCKET_NAME]",
      "location": "[BUCKET_LOCATION]",
      "storageClass": "[STORAGE_CLASS]"
    }

    Em que:

  4. Use cURL (em inglês) para chamar a API JSON:
    curl -X POST --data-binary @[JSON_FILE_NAME].json \
         -H "Authorization: Bearer [OAUTH2_TOKEN]" \
         -H "Content-Type: application/json" \
         "https://storage.googleapis.com/storage/v1/b?project=[PROJECT_ID]"

    Em que:

    • [JSON_FILE_NAME] é o nome do arquivo JSON criado na Etapa 2;
    • [OAUTH2_TOKEN] é o token de acesso gerado na Etapa 1.
    • [PROJECT_ID] é o ID do projeto ao qual o intervalo será associado. Por exemplo, my-project.

API XML

  1. Receba um token de acesso de autorização do OAuth 2.0 Playground. Configure o Playground para usar suas credenciais do OAuth.
  2. Crie um arquivo .xml com as informações a seguir:
  3. <CreateBucketConfiguration>
       <LocationConstraint>[BUCKET_LOCATION]</LocationConstraint>
       <StorageClass>[STORAGE_CLASS]</StorageClass>
    </CreateBucketConfiguration>

    Em que:

  4. Use cURL (em inglês) para chamar a API XML:
    curl -X PUT --data-binary @[XML_FILE_NAME].xml \
         -H "Authorization: Bearer [OAUTH2_TOKEN]" \
         -H "x-goog-project-id: [PROJECT_ID]" \
         "https://storage.googleapis.com/[BUCKET_NAME]"

    Em que:

    • [XML_FILE_NAME] é o nome do arquivo XML criado na Etapa 2;
    • [OAUTH2_TOKEN] é o token de acesso gerado na Etapa 1.
    • [PROJECT_ID] é o ID do projeto ao qual o intervalo será associado. Por exemplo, my-project.
    • [BUCKET_NAME] é o nome que você quer dar ao intervalo, sujeito a requisitos de nomenclatura. Por exemplo, my-bucket.

Etapa 2) Copiar objetos do intervalo antigo para o novo

Console

Use o Serviço de transferência do Cloud Storage no Console do Google Cloud para copiar dados de um intervalo do Cloud Storage para outro:

  1. Abra a página "Transferir" no Console do Google Cloud.

    Abrir a página Transferir

  2. Clique em Criar job de transferência.
  3. Siga as instruções detalhadas e clique em Continuar ao concluir cada etapa:

    • Selecione a origem: use o Intervalo do Google Cloud Storage como a origem selecionada e clique em Procurar para localizar e selecionar o intervalo do qual quer mover os objetos.

    • Selecione Destino: clique em Procurar para localizar e selecionar o intervalo para o qual quer mover os objetos.

      Marque a caixa de seleção Excluir objetos de origem após a conclusão da transferência.

    • Configurar transferência: ignore essa seção.

  4. Depois de concluir as instruções, clique em Criar.

    Isso inicia o processo de cópia dos objetos do intervalo antigo para o novo. Esse processo pode levar algum tempo. No entanto, depois de clicar em Criar, será possível sair do Console do Google Cloud.

Para visualizar o progresso da transferência: abra a página "Transferir" no Console do Google Cloud.

Abrir a página Transferir

gsutil

  1. Verifique se pelo menos o gsutil 4.12 está instalado.
  2. Use o comando gsutil cp, com a opção -r, para copiar recursivamente todos os objetos do intervalo de origem para o intervalo de destino:

    gsutil cp -r gs://[SOURCE_BUCKET]/* gs://[DESTINATION_BUCKET]

    Em que:

    • [SOURCE_BUCKET] é o nome do intervalo original. Por exemplo, old-bucket.
    • [DESTINATION_BUCKET] é o nome do novo intervalo criado na Etapa 1) Criar um novo intervalo. Por exemplo, my-bucket.

APIs REST

API JSON

Use o método rewriteda API JSON para copiar dados em blocos de tamanho limitado em várias solicitações. Ao fazer isso, é preciso estabelecer um loop e chamar o método rewrite até que todos os dados tenham sido movidos:

  1. Use cURL e o método da API JSON rewrite para copiar dados de um intervalo de origem para um intervalo de destino:

    curl -X POST \
    -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    -H "Content-Length: 0" \
    "https://storage.googleapis.com/storage/v1/b/[SOURCE_BUCKET]/o/[OBJECT_NAME]/rewriteTo/b/[DESTINATION_BUCKET]/o/[OBJECT_NAME]"

    Em que:

    • [OAUTH2_TOKEN] é o token de acesso gerado na Etapa 1) Criar um novo intervalo;
    • [SOURCE_BUCKET] é o nome do intervalo original. Por exemplo, old-bucket.
    • [OBJECT_NAME] é o nome do objeto que você quer copiar. Por exemplo, pets/dog.png.
    • [DESTINATION_BUCKET] é o nome do novo intervalo criado na Etapa 1) Criar um novo intervalo. Por exemplo, my-bucket.

    Se o objeto tiver, por exemplo, 10 GB de tamanho, a resposta a essa solicitação será semelhante ao seguinte exemplo:

    {
    "kind": "storage#rewriteResponse",
    "totalBytesRewritten": 1048576,
    "objectSize": 10000000000,
    "done": false,
    "rewriteToken": [TOKEN_VALUE]
    }
  2. Use o rewriteToken em uma solicitação subsequente para continuar copiando dados:

    curl -X POST \
    -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    -H "Content-Length: 0" \
    -d '{"rewriteToken": "[TOKEN_VALUE]"}' \
    "https://storage.googleapis.com/storage/v1/b/[SOURCE_BUCKET]/o/[OBJECT_NAME]/rewriteTo/b/[DESTINATION_BUCKET]/o/[OBJECT_NAME]"

    Em que:

    • [OAUTH2_TOKEN] é o token de acesso gerado na Etapa 1) Criar um novo intervalo;
    • [TOKEN_VALUE] é o valor de rewriteToken retornado na Etapa 1.
    • [SOURCE_BUCKET] é o nome do intervalo original. Por exemplo, old-bucket.
    • [OBJECT_NAME] é o nome do objeto que você quer copiar. Por exemplo, pets/bunny.png.
    • [DESTINATION_BUCKET] é o nome do novo intervalo criado na Etapa 1) Criar um novo intervalo. Por exemplo, my-bucket.

Quando todos os dados são copiados, a última resposta tem uma propriedade done igual a true, não há propriedade rewriteToken e os metadados do objeto copiado são incluídos na propriedade resource.

{
  "kind": "storage#rewriteResponse",
  "totalBytesRewritten": 10000000000,
  "objectSize": 10000000000,
  "done": true,
  "resource": objects Resource
}

Etapa 3) Excluir os objetos do intervalo antigo

Console

Não é necessário fazer nada para excluir os objetos do intervalo antigo: como parte da cópia de objetos com o Serviço de transferência, os objetos antigos são excluídos automaticamente (pressupondo que a caixa de seleção "Excluir objetos da origem após a conclusão da transferência" está marcada).

gsutil

Use o comando gsutil rm, com a opção -r, para excluir recursivamente todos os objetos do intervalo de origem, assim como o próprio intervalo de origem:

gsutil rm -r gs://[SOURCE_BUCKET]

Em que [SOURCE_BUCKET] é o nome do intervalo original. Por exemplo, old-bucket.

Ou, para excluir os objetos, mas manter o intervalo de origem:

gsutil rm -a gs://[SOURCE_BUCKET]/**

APIs REST

API JSON

  • Use cURL e o método da API JSONdelete para remover a versão original dos dados com o seguinte comando:

    curl -X DELETE \
    -H "Authorization: Bearer [OAUTH2_TOKEN]" \
    "https://storage.googleapis.com/storage/v1/b/[SOURCE_BUCKET]/o/[OBJECT_NAME]"

    Em que:

    • [OAUTH2_TOKEN] é o token de acesso gerado na Etapa 1) Criar um novo intervalo;
    • [SOURCE_BUCKET] é o nome do intervalo original. Por exemplo, old-bucket.
    • [OBJECT_NAME] é o nome do objeto que você quer excluir. Por exemplo, pets/dog.png.

Se for bem-sucedido, o método retornará uma resposta vazia.

A seguir