Trasferimenti basati su eventi da Cloud Storage

Storage Transfer Service può ascoltare le notifiche degli eventi in Google Cloud per trasferire automaticamente i dati aggiunti o aggiornati in un bucket Cloud Storage. Scopri di più sui vantaggi dei trasferimenti basati su eventi.

I trasferimenti basati su eventi da Cloud Storage utilizzano le notifiche Pub/Sub per sapere quando gli oggetti nel bucket di origine sono stati modificati o aggiunti. Le eliminazioni di oggetti non vengono rilevate; l'eliminazione di un oggetto nell'origine non comporta l'eliminazione dell'oggetto associato nel bucket di destinazione.

Configura autorizzazioni

  1. Trova il nome dell'agente di servizio Storage Transfer Service per il tuo progetto:

    1. Vai alla pagina di riferimento googleServiceAccounts.get.

      Si apre un riquadro interattivo denominato Prova questo metodo.

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

    3. Fai clic su Execute (Esegui).

    L'indirizzo email dell'agente di servizio viene restituito come valore di accountEmail. Copia questo valore.

    L'email dell'agente di servizio utilizza il formato project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com.

  2. Concedi il ruolo Pub/Sub Subscriber all'agente di servizio Storage Transfer.

    console Cloud

    Segui le istruzioni riportate in Controllo dell'accesso tramite la console Google Cloud per concedere il ruolo Pub/Sub Subscriber al servizio Storage Transfer Service. Il ruolo può essere concesso a livello di argomento, sottoscrizione o progetto.

    gcloud CLI

    Segui le istruzioni riportate in Impostazione di un criterio per aggiungere la seguente associazione:

    {
      "role": "roles/pubsub.subscriber",
      "members": [
        "serviceAccount:project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com"
    }

Configurare Pub/Sub

  1. Assicurati di soddisfare i prerequisiti per l'utilizzo di Pub/Sub con Cloud Storage.

  2. Configura la notifica Pub/Sub per Cloud Storage:

    gcloud storage buckets notifications create gs://BUCKET_NAME --topic=TOPIC_NAME
  3. Crea una sottoscrizione pull per l'argomento:

    gcloud pubsub subscriptions create SUBSCRIPTION_ID --topic=TOPIC_NAME --ack-deadline=300

Creare un job di trasferimento

Puoi utilizzare l'API REST o la console Google Cloud per creare un job di trasferimento basato su eventi.

Non includere nel nome del job di trasferimento informazioni sensibili come quelle che consentono l'identificazione personale (PII) o dati di sicurezza. I nomi delle risorse possono essere propagati ai nomi di altre risorse Google Cloud e possono essere esposti ai sistemi interni di Google al di fuori del progetto.

console Cloud

  1. Vai alla pagina Crea job di trasferimento nella console Google Cloud.

    Vai a Crea job di trasferimento

  2. Seleziona Cloud Storage sia come origine che come destinazione.

  3. Come Modalità di pianificazione, seleziona In base agli eventi e fai clic su Passaggio successivo.

  4. Seleziona il bucket di origine per questo trasferimento.

  5. Nella sezione Stream di eventi, inserisci il nome della sottoscrizione:

    projects/PROJECT_NAME/subscriptions/SUBSCRIPTION_ID

  6. Se vuoi, definisci i filtri, poi fai clic su Passaggio successivo.

  7. Seleziona il bucket di destinazione per questo trasferimento.

  8. Facoltativamente, inserisci un'ora di inizio e di fine per il trasferimento. Se non specifichi un orario, il trasferimento inizierà immediatamente e verrà eseguito finché non verrà interrotto manualmente.

  9. Specifica eventuali opzioni di trasferimento. Maggiori informazioni sono disponibili nella pagina Crea trasferimenti.

  10. Fai clic su Crea.

Una volta creato, il job di trasferimento inizia a essere eseguito e un gestore eventi attende le notifiche sull'abbonamento Pub/Sub. La pagina dei dettagli del job mostra una operazione ogni ora e include i dettagli sui dati trasferiti per ogni job.

REST

Per creare un trasferimento basato su eventi utilizzando l'API REST, invia il seguente oggetto JSON all'endpoint transferJobs.create:

transfer_job {
  "description": "YOUR DESCRIPTION",
  "status": "ENABLED",
  "projectId": "PROJECT_ID",
  "transferSpec" {
    "gcsDataSource" {
      "bucketName": "GCS_SOURCE_NAME"
    },
    "gcsDataSink": {
        "bucketName": "GCS_SINK_NAME"
    }
  }
  "eventStream" {
    "name": "projects/PROJECT_NAME/subscriptions/SUBSCRIPTION_ID",
    "eventStreamStartTime": "2022-12-02T01:00:00+00:00",
    "eventStreamExpirationTime": "2023-01-31T01:00:00+00:00"
  }
}

eventStreamStartTime e eventStreamExpirationTime sono facoltativi. Se l'ora di inizio viene omessa, il trasferimento inizia immediatamente; se l'ora di fine viene omessa, il trasferimento continua finché non viene interrotto manualmente.

Librerie client

Go

Per scoprire come installare e utilizzare la libreria client per Storage Transfer Service, consulta Librerie client di Storage Transfer Service. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Go Storage Transfer Service.

Per autenticarti a Storage Transfer Service, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.


func createEventDrivenGCSTransfer(w io.Writer, projectID string, gcsSourceBucket string, gcsSinkBucket string, pubSubId string) (*storagetransferpb.TransferJob, error) {
	// Your Google Cloud Project ID.
	// projectID := "my-project-id"

	// The name of the source GCS bucket.
	// gcsSourceBucket := "my-source-bucket"

	// The name of the GCS bucket to transfer objects to.
	// gcsSinkBucket := "my-sink-bucket"

	// The Pub/Sub topic to subscribe the event driven transfer to.
	// pubSubID := "projects/PROJECT_NAME/subscriptions/SUBSCRIPTION_ID"

	ctx := context.Background()
	client, err := storagetransfer.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("storagetransfer.NewClient: %w", err)
	}
	defer client.Close()

	req := &storagetransferpb.CreateTransferJobRequest{
		TransferJob: &storagetransferpb.TransferJob{
			ProjectId: projectID,
			TransferSpec: &storagetransferpb.TransferSpec{
				DataSource: &storagetransferpb.TransferSpec_GcsDataSource{
					GcsDataSource: &storagetransferpb.GcsData{BucketName: gcsSourceBucket}},
				DataSink: &storagetransferpb.TransferSpec_GcsDataSink{
					GcsDataSink: &storagetransferpb.GcsData{BucketName: gcsSinkBucket}},
			},
			EventStream: &storagetransferpb.EventStream{Name: pubSubId},
			Status:      storagetransferpb.TransferJob_ENABLED,
		},
	}
	resp, err := client.CreateTransferJob(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("failed to create transfer job: %w", err)
	}

	fmt.Fprintf(w, "Created an event driven transfer job from %v to %v subscribed to %v with name %v", gcsSourceBucket, gcsSinkBucket, pubSubId, resp.Name)
	return resp, nil
}

Java

Per scoprire come installare e utilizzare la libreria client per Storage Transfer Service, consulta Librerie client di Storage Transfer Service. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java Storage Transfer Service.

Per autenticarti a Storage Transfer Service, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.


import com.google.storagetransfer.v1.proto.StorageTransferServiceClient;
import com.google.storagetransfer.v1.proto.TransferProto;
import com.google.storagetransfer.v1.proto.TransferTypes;

public class CreateEventDrivenGcsTransfer {
  public static void main(String[] args) throws Exception {
    // Your Google Cloud Project ID
    String projectId = "your-project-id";

    // The name of the GCS AWS bucket to transfer data from
    String gcsSourceBucket = "your-gcs-source-bucket";

    // The name of the GCS bucket to transfer data to
    String gcsSinkBucket = "your-gcs-sink-bucket";

    // The ARN of the PubSub queue to subscribe to
    String sqsQueueArn = "projects/PROJECT_NAME/subscriptions/SUBSCRIPTION_ID";

    createEventDrivenGcsTransfer(projectId, gcsSourceBucket, gcsSinkBucket, sqsQueueArn);
  }

  public static void createEventDrivenGcsTransfer(
      String projectId, String gcsSourceBucket, String gcsSinkBucket, String pubSubId)
      throws Exception {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources,
    // or use "try-with-close" statement to do this automatically.
    try (StorageTransferServiceClient storageTransfer = StorageTransferServiceClient.create()) {

      TransferTypes.TransferJob transferJob =
          TransferTypes.TransferJob.newBuilder()
              .setProjectId(projectId)
              .setTransferSpec(
                  TransferTypes.TransferSpec.newBuilder()
                      .setGcsDataSource(
                          TransferTypes.GcsData.newBuilder().setBucketName(gcsSourceBucket))
                      .setGcsDataSink(
                          TransferTypes.GcsData.newBuilder().setBucketName(gcsSinkBucket)))
              .setStatus(TransferTypes.TransferJob.Status.ENABLED)
              .setEventStream(TransferTypes.EventStream.newBuilder().setName(pubSubId).build())
              .build();

      TransferTypes.TransferJob response =
          storageTransfer.createTransferJob(
              TransferProto.CreateTransferJobRequest.newBuilder()
                  .setTransferJob(transferJob)
                  .build());

      System.out.println(
          "Created a transfer job between from "
              + gcsSourceBucket
              + " to "
              + gcsSinkBucket
              + " subscribed to "
              + pubSubId
              + " with name "
              + response.getName());
    }
  }
}

Node.js

Per scoprire come installare e utilizzare la libreria client per Storage Transfer Service, consulta Librerie client di Storage Transfer Service. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Node.js Storage Transfer Service.

Per autenticarti a Storage Transfer Service, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.


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

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of the Google Cloud Platform Project that owns the job
// projectId = 'my-project-id'

// Google Cloud Storage source bucket name
// gcsSourceBucket = 'my-gcs-source-bucket'

// Google Cloud Storage destination bucket name
// gcsSinkBucket = 'my-gcs-destination-bucket'

// The subscription ID to a Pubsub queue to track
// pubsubId = 'projects/PROJECT_NAME/subscriptions/SUBSCRIPTION_ID'

// Creates a client
const client = new StorageTransferServiceClient();

/**
 * Creates an event driven transfer that tracks a Pubsub subscription.
 */
async function createEventDrivenGcsTransfer() {
  const [transferJob] = await client.createTransferJob({
    transferJob: {
      projectId,
      status: 'ENABLED',
      transferSpec: {
        gcsDataSource: {
          bucketName: gcsSourceBucket,
        },
        gcsDataSink: {
          bucketName: gcsSinkBucket,
        },
      },
      eventStream: {
        name: pubsubId,
      },
    },
  });

  console.log(
    `Created an event driven transfer from '${gcsSourceBucket}' to '${gcsSinkBucket}' with name ${transferJob.name}`
  );
}

createEventDrivenGcsTransfer();

Python

Per scoprire come installare e utilizzare la libreria client per Storage Transfer Service, consulta Librerie client di Storage Transfer Service. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Python Storage Transfer Service.

Per autenticarti a Storage Transfer Service, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.


from google.cloud import storage_transfer


def create_event_driven_gcs_transfer(
    project_id: str,
    description: str,
    source_bucket: str,
    sink_bucket: str,
    pubsub_id: str,
):
    """Create an event driven transfer between two GCS buckets that tracks a PubSub subscription"""

    client = storage_transfer.StorageTransferServiceClient()

    # The ID of the Google Cloud Platform Project that owns the job
    # project_id = 'my-project-id'

    # A description of this job
    # description = 'Creates an event-driven transfer that tracks a pubsub subscription'

    # Google Cloud Storage source bucket name
    # source_bucket = 'my-gcs-source-bucket'

    # Google Cloud Storage destination bucket name
    # sink_bucket = 'my-gcs-destination-bucket'

    # The Pubsub Subscription ID to track
    # pubsub_id = 'projects/PROJECT_NAME/subscriptions/SUBSCRIPTION_ID'

    transfer_job_request = storage_transfer.CreateTransferJobRequest(
        {
            "transfer_job": {
                "project_id": project_id,
                "description": description,
                "status": storage_transfer.TransferJob.Status.ENABLED,
                "transfer_spec": {
                    "gcs_data_source": {
                        "bucket_name": source_bucket,
                    },
                    "gcs_data_sink": {
                        "bucket_name": sink_bucket,
                    },
                },
                "event_stream": {
                    "name": pubsub_id,
                },
            },
        }
    )

    result = client.create_transfer_job(transfer_job_request)
    print(f"Created transferJob: {result.name}")