Configure o acesso a uma origem: Cloud Storage

O Storage Transfer Service usa uma conta de serviço gerida pela Google, conhecida como agente de serviço, para mover dados de um contentor de origem do Cloud Storage. Este agente de serviço é criado na primeira vez que liga para googleServiceAccounts.get.

O contentor de origem não tem de pertencer ao mesmo projeto que o agente do serviço. Os passos são os mesmos, independentemente do projeto em que o contentor se encontra.

Autorizações do utilizador

Para conceder as autorizações necessárias ao agente de serviço, tem de ter as autorizações relevantes no contentor de origem:

  • storage.buckets.getIamPolicy
  • storage.buckets.setIamPolicy

A função Proprietário de contentores antigos do Storage (roles/storage.legacyBucketOwner) ou a função Administrador do Storage (roles/storage.admin) concedem as autorizações necessárias.

Concessão automática de autorizações na Google Cloud consola

Se estiver a usar a consola para criar a transferência e tiver as autorizações indicadas em Autorizações do utilizador, o agente de serviço recebe automaticamente as autorizações necessárias no seu contentor de origem. Google Cloud

Pode ignorar os passos desta página e aceder diretamente à criação de uma transferência.

Autorizações necessárias

O agente de serviço tem de ter as seguintes autorizações para o contentor de origem:

Autorização Descrição
storage.buckets.get Permite que o agente de serviço obtenha a localização do contentor.
storage.objects.list Permite que o agente de serviço liste objetos no contentor.
storage.objects.get Permite que o agente de serviço leia objetos no contentor.
storage.objects.create

Permite que o agente de serviço crie objetos no contentor. Obrigatório se a transferência for para um sistema de ficheiros.

O serviço de transferência de armazenamento cria e preenche duas pastas no contentor de origem: cloud-ingest/ contém informações do sistema de ficheiros e storage-transfer/ contém registos de transferência.

storage.objects.delete Permite que o agente de serviço elimine objetos no contentor. Obrigatório se definir deleteObjectsFromSourceAfterTransfer como true.

As seguintes funções predefinidas concedem em conjunto as autorizações necessárias:

  • Uma das seguintes opções:
    • Storage Object Viewer (roles/storage.objectViewer) se a transferência for para outro contentor do Cloud Storage.
    • Storage Object Creator (roles/storage.objectCreator) se a transferência for para um sistema de ficheiros.
  • Além de uma das seguintes opções:
    • Storage Legacy Bucket Writer (roles/storage.legacyBucketWriter) se for necessária a autorização para eliminar objetos.
    • Leitor de buckets antigos do Storage (roles/storage.legacyBucketReader) se não for necessária a autorização de eliminação de objetos.

Qualquer função do Cloud Storage marcada como função legacy só pode ser concedida ao nível do contentor.

Para ver uma lista completa das funções do Cloud Storage e das autorizações que contêm, consulte Funções de IAM.

Para LCAs de objetos quando ACL_PRESERVE está definido, a função Proprietário de objetos antigos do Storage (roles/storage.legacyObjectOwner) também é necessária para o objeto de origem. Para ACL_PRESERVE, adicione manualmente a conta de serviço para ter a função Proprietário de objetos antigos do Storage para conceder autorização storage.objects.getIamPolicy ao objeto de origem.

Conceda as autorizações necessárias

Para conceder as autorizações necessárias ao agente de serviço, siga os passos abaixo.

Encontre o email do agente de serviço

  1. Aceda à página de referência googleServiceAccounts.get.

    É aberto um painel interativo com o título Experimente este método.

  2. No painel, em Parâmetros do pedido, introduza o seu ID do projeto. O projeto que especificar aqui tem de ser o projeto que está a usar para gerir o serviço de transferência de armazenamento, que pode ser diferente do projeto do contentor de origem.

  3. Clique em Executar.

    O email do agente de serviço é devolvido como o valor de accountEmail. Copiar este valor.

    O email do agente de serviço usa o formato project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com.

Adicione o agente do serviço a uma política ao nível do contentor

Consola

  1. Na Google Cloud consola, aceda à página Recipientes do Cloud Storage.

    Aceda a Recipientes

  2. Clique no menu Adicional do contentor () associado ao contentor ao qual quer conceder uma função a um principal.

  3. Escolha Editar acesso.

  4. Clique no botão + Adicionar principal.

  5. No campo Novos membros, introduza o email da conta do seu agente de serviço.

  6. Selecione Storage Object Viewer ou Storage Object Creator no menu pendente Selecionar uma função.

  7. Clique em Adicionar outra função.

  8. Selecione Storage Legacy Bucket Writer ou Storage Legacy Bucket Reader.

  9. Clique em Guardar.

gcloud

Use o comando gcloud storage buckets add-iam-policy-binding:

gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
--member=serviceAccount:YOUR_AGENT_EMAIL --role=roles/storage.objectViewer
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
--member=serviceAccount:YOUR_AGENT_EMAIL --role=roles/storage.legacyBucketReader

Onde:

  • BUCKET_NAME é o nome do contentor ao qual está a conceder acesso ao principal. Por exemplo, my-bucket.
  • YOUR_AGENT_EMAIL é o email da conta de agente que copiou em Encontre o email do agente de serviço.

Exemplos de código

C++

Para saber como instalar e usar a biblioteca cliente do Cloud Storage, consulte o artigo Bibliotecas cliente do Cloud Storage. Para mais informações, consulte a documentação de referência da API C++ do Cloud Storage.

Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& role, std::string const& member) {
  auto policy = client.GetNativeBucketIamPolicy(
      bucket_name, gcs::RequestedPolicyVersion(3));

  if (!policy) throw std::move(policy).status();

  policy->set_version(3);
  for (