Configurare l'accesso a una sorgente: Cloud Storage

Storage Transfer Service utilizza un service agent per spostare i dati da un bucket di origine Cloud Storage. Questo service agent viene creato la prima volta che chiami googleServiceAccounts.get.

Il bucket di origine non deve necessariamente appartenere allo stesso progetto del service agent. I passaggi sono gli stessi indipendentemente dal progetto in cui si trova il bucket.

Autorizzazioni utente

Per concedere le autorizzazioni richieste al service agent, devi disporre delle autorizzazioni pertinenti per il bucket di origine:

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

Il ruolo Proprietario bucket legacy Storage (roles/storage.legacyBucketOwner) o il ruolo Amministratore Storage (roles/storage.admin) forniscono le autorizzazioni richieste.

Concessione automatica delle autorizzazioni nella Google Cloud console

Se utilizzi la Google Cloud console per creare il trasferimento e disponi delle autorizzazioni elencate in Autorizzazioni utente, al service agent verranno concesse automaticamente le autorizzazioni richieste per il bucket di origine.

Puoi saltare i passaggi di questa pagina e passare direttamente alla creazione di un trasferimento.

Autorizzazioni obbligatorie

Il service agent deve disporre delle seguenti autorizzazioni per il bucket di origine:

Autorizzazione Descrizione
storage.buckets.get Consente al service agent di ottenere la località del bucket.
storage.objects.list Consente al service agent di elencare gli oggetti nel bucket.
storage.objects.get Consente al service agent di leggere gli oggetti nel bucket.
storage.objects.create

Consente al service agent di creare oggetti nel bucket. Obbligatorio se il trasferimento avviene a un file system.

Storage Transfer Service creates and populates two folders in the source bucket: cloud-ingest/ contains file system information, and storage-transfer/ contains transfer logs.

storage.objects.delete Consente al service agent di eliminare gli oggetti nel bucket. Obbligatorio se imposti deleteObjectsFromSourceAfterTransfer su true.
storage.objects.getIamPolicy Consente al service agent di leggere gli ACL sugli oggetti di origine. Obbligatorio se la conservazione degli ACL degli oggetti (ACL_PRESERVE) è abilitata.

I seguenti ruoli predefiniti concedono insieme le autorizzazioni richieste:

  • Uno dei seguenti:
    • Storage Object Viewer (roles/storage.objectViewer) se il trasferimento avviene a un altro bucket Cloud Storage.
    • Creatore oggetti Storage (roles/storage.objectCreator) se il trasferimento avviene a un file system.
  • Più uno dei seguenti:
    • Writer bucket legacy Storage (roles/storage.legacyBucketWriter) se è richiesta l'autorizzazione di eliminazione degli oggetti.
    • Storage Legacy Bucket Reader (roles/storage.legacyBucketReader) se non è richiesta l'autorizzazione di eliminazione degli oggetti.
  • Inoltre, se conservi gli ACL degli oggetti con ACL_PRESERVE:
    • Proprietario oggetti legacy Storage (roles/storage.legacyObjectOwner)

Qualsiasi ruolo Cloud Storage contrassegnato come ruolo legacy può essere concesso solo a livello di bucket.

Per un elenco completo dei ruoli Cloud Storage e delle autorizzazioni che contengono, consulta Ruoli IAM.

Concedi le autorizzazioni richieste

Per concedere le autorizzazioni richieste al service agent, segui questi passaggi.

Trova l'indirizzo email del service agent

  1. Vai alla pagina di riferimento googleServiceAccounts.get.

    Si apre un riquadro interattivo intitolato Prova questo metodo.

  2. Nel riquadro, in Parametri della richiesta, inserisci il tuo ID progetto. Il progetto che specifichi qui deve essere il progetto che utilizzi per gestire Storage Transfer Service, che potrebbe essere diverso dal progetto del bucket di origine.

  3. Fai clic su Esegui.

    L'indirizzo email del service agent viene restituito come valore di accountEmail. Copia questo valore.

    L'indirizzo email del service agent utilizza il formato project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com.

Aggiungi il service agent a un criterio a livello di bucket

Console

  1. Nella Google Cloud console, vai alla pagina Bucket di Cloud Storage.

    Vai a Bucket

  2. Fai clic sul menu Overflow bucket () associato a l bucket a cui vuoi concedere un ruolo a un'entità.

  3. Scegli accesso in modifica.

  4. Fai clic sul pulsante + Aggiungi entità.

  5. Nel campo Nuove entità, inserisci l'indirizzo email dell'account del service agent.

  6. Seleziona Storage Object Viewer o Storage Object Creator dal menu a discesa Seleziona un ruolo.

  7. Fai clic su Aggiungi un altro ruolo.

  8. Seleziona Storage Legacy Bucket Writer o Storage Legacy Bucket Reader.

  9. Fai clic su Salva.

gcloud

Utilizza il 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

Sostituisci quanto segue:

  • BUCKET_NAME è il nome del bucket a cui stai concedendo l'accesso all'entità. Ad esempio, my-bucket.
  • YOUR_AGENT_EMAIL è l'indirizzo email dell'account dell'agente che hai copiato in Trova l'indirizzo email del service agent.

Esempi di codice

C++

Per scoprire come installare e utilizzare la libreria client per Cloud Storage, consulta Librerie client di Cloud Storage. Per saperne di più, consulta la documentazione di riferimento dell'APIC++ di Cloud Storage.

Per eseguire l'autenticazione in Cloud Storage, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configura l'autenticazione per le librerie client.

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 (auto& binding : policy->bindings()) {
    if (binding.role() != role || binding.has_condition()) {
      continue;
    }
    auto& members = binding.members();
    if (std::find(members.begin(), members.end(), member) == members.end()) {
      members.emplace_back(member);
    }
  }

  auto updated = client