Übertragung zwischen Cloud Storage-Buckets

Storage Transfer Service kann zum Übertragen großer Datenmengen zwischen Cloud Storage-Buckets verwendet werden, entweder innerhalb desselben Google Cloud-Projekts oder zwischen verschiedenen Projekten.

Bucket-Migrationen sind in verschiedenen Szenarien hilfreich. Sie können verwendet werden, um Daten aus separaten Projekten zu konsolidieren, Daten an einen Sicherungsspeicherort zu verschieben oder den Standort Ihrer Daten zu ändern.

Wann sollte der Storage Transfer Service verwendet werden?

Google Cloud bietet mehrere Optionen, um Daten zwischen Cloud Storage-Buckets zu übertragen. Wir empfehlen folgende Richtlinien:

  • Weniger als 1 TB übertragen: Verwenden Sie gcloud. Eine Anleitung dazu finden Sie unter siehe Buckets verschieben und umbenennen.

  • Mehr als 1 TB übertragen: Verwenden Sie Storage Transfer Service. Storage Transfer Service ist eine verwaltete Übertragungsoption, die sofort Sicherheit, Zuverlässigkeit und Leistung bietet. Es ist nicht mehr erforderlich, Skripts zu optimieren und zu verwalten und Wiederholungsversuche zu verarbeiten.

In dieser Anleitung werden Best Practices für die Übertragung von Daten zwischen Cloud Storage-Buckets mit dem Storage Transfer Service erläutert.

Übertragungsstrategie definieren

Wie Ihre Übertragungsstrategie aussieht, hängt von der Komplexität Ihrer Situation ab. Berücksichtigen Sie in Ihrem Plan die folgenden Punkte.

Bucket-Namen auswählen

Wenn Sie Ihre Daten in einen Storage-Bucket mit einem anderen Speicherort verschieben möchten, haben Sie zwei Möglichkeiten:

  • Neuer Bucket-Name : Aktualisieren Sie Ihre Anwendungen, sodass sie auf einen Storage-Bucket mit einem anderen Namen verweisen.
  • Bucket-Namen beibehalten : Ersetzen Sie Ihren Storage-Bucket, um den aktuellen Namen beizubehalten. So müssen Sie Ihre Anwendungen nicht aktualisieren.

In beiden Fällen sollten Sie Ausfallzeiten einplanen und Ihre Nutzer rechtzeitig darüber informieren. Lesen Sie die folgenden Erklärungen, um zu erfahren, welche Option für Sie am besten geeignet ist.

Neuer Bucket-Name

Wenn Sie einen neuen Bucket-Namen verwenden, müssen Sie den gesamten Code und alle Dienste aktualisieren, die Ihren aktuellen Bucket verwenden. Wie Sie das tun, hängt davon ab, wie Ihre Anwendungen erstellt und bereitgestellt werden.

Bei bestimmten Setups kann dieser Ansatz zu weniger Ausfallzeiten führen, erfordert aber mehr Aufwand, um einen reibungslosen Übergang zu gewährleisten. Er umfasst die folgenden Schritte:

  1. Kopieren Sie Ihre Daten in einen neuen Storage-Bucket.
  2. Starten Sie die Ausfallzeit.
  3. Aktualisieren Sie Ihre Anwendungen, sodass sie auf den neuen Bucket verweisen.
  4. Prüfen Sie, ob alles wie erwartet funktioniert und ob alle relevanten Systeme und Konten Zugriff auf den Bucket haben.
  5. Löschen Sie den ursprünglichen Bucket.
  6. Beenden Sie die Ausfallzeit.

Bucket-Namen beibehalten

Verwenden Sie diesen Ansatz, wenn Sie Ihren Code nicht ändern möchten, um auf einen neuen Bucket-Namen zu verweisen. Er umfasst die folgenden Schritte:

  1. Kopieren Sie Ihre Daten in einen temporären Storage-Bucket.
  2. Starten Sie die Ausfallzeit.
  3. Löschen Sie den ursprünglichen Bucket.
  4. Erstellen Sie einen neuen Bucket mit demselben Namen wie der ursprüngliche Bucket.
  5. Kopieren Sie die Daten aus dem temporären Bucket in den neuen Bucket.
  6. Löschen Sie den temporären Bucket.
  7. Prüfen Sie, ob alles wie erwartet funktioniert und ob alle relevanten Systeme und Konten Zugriff auf den Bucket haben.
  8. Beenden Sie die Ausfallzeit.

Ausfallzeiten minimieren

Storage Transfer Service sperrt Lese- oder Schreibvorgänge in den Quell- oder Ziel-Buckets während einer Übertragung nicht.

Wenn Sie Lese-/Schreibzugriff auf Ihrem Bucket manuell sperren, können Sie die Ausfallzeiten minimieren, indem Sie Ihre Daten in zwei Schritten übertragen: Seed und Synchronisierung.

  1. Seed-Übertragung: Führen Sie eine Bulk-Übertragung durch, ohne die Lese-/Schreibvorgänge für die Quelle zu sperren.

  2. Synchronisierungsübertragung: Nach Abschluss der ersten Ausführung sperren Sie den Lese-/Schreibvorgang für den Quell-Bucket und führen Sie eine weitere Übertragung durch. Storage Transfer Service-Übertragungen sind standardmäßig inkrementell. Daher werden bei dieser zweiten Übertragung nur Daten übertragen, die sich während der Seed-Übertragung geändert haben.

Übertragungsgeschwindigkeit optimieren

Berücksichtigen Sie bei der Schätzung der Dauer eines Übertragungsjobs die möglichen Engpässe. Wenn die Quelle beispielsweise Milliarden kleiner Dateien enthält, ist die Übertragungsgeschwindigkeit pro Sekunde gebunden. Wenn die Objektgröße groß ist, kann die Bandbreite der Engpass sein.

Bandbreitenlimits werden auf Regionsebene festgelegt und gleichmäßig auf alle Projekte verteilt. Wenn genügend Bandbreite verfügbar ist, kann der Storage Transfer Service etwa 1.000 Aufgaben pro Übertragungsjob pro Sekunde ausführen. Sie können eine Übertragung in diesem Fall beschleunigen. Teilen Sie dazu Ihren Job in mehrere kleine Übertragungsjobs auf. Verwenden Sie beispielsweise einschließende und ausschließende Präfixe, um bestimmte Dateien zu übertragen.

Wenn der Speicherort, die Speicherklasse und der Verschlüsselungsschlüssel identisch sind, erstellt der Storage Transfer Service keine neue Kopie der Byte. Stattdessen wird ein neuer Metadateneintrag erstellt, der auf das Quell-Blob verweist. Daher werden Kopien eines großen Korpus am selben Standort oder derselben Klasse sehr schnell ausgeführt und sind nur pro Sekunde gebunden.

Löschvorgänge sind auch Metadatenvorgänge. Bei diesen Übertragungen kann die Geschwindigkeit durch Parallelisieren der Übertragung durch Aufteilen auf mehrere kleine Jobs erhöht werden.

Metadaten beibehalten

Die folgenden Objektmetadaten bleiben bei der Übertragung von Daten zwischen Cloud Storage-Buckets mit Storage Transfer Service erhalten:

  • Vom Nutzer erstellte benutzerdefinierte Metadaten.
  • Cloud Storage-Metadatenfelder mit festem Schlüssel, z. B. Cache-Control, Content-Disposition, Content-Type und Custom-Time.
  • Objektgröße.
  • Die Generierungsnummer wird als benutzerdefiniertes Metadatenfeld mit dem Schlüssel x-goog-reserved-source-generation beibehalten, das Sie später bearbeiten oder entfernen können.

Die folgenden Metadatenfelder können optional beibehalten werden, wenn Sie die API für die Übertragung verwenden:

  • ACLs (acl)
  • Speicherklasse (storageClass)
  • CMEK (kmsKey)
  • Vorläufige Sperrung (temporaryHold)
  • Zeitpunkt der Objekterstellung (customTime)

Weitere Informationen finden Sie in der TransferSpec API-Referenz.

Die folgenden Metadatenfelder werden nicht beibehalten:

  • Zeitpunkt der letzten Aktualisierung (updated)
  • etag
  • componentCount

Wenn der Zeitpunkt der Objekterstellung beibehalten wird, wird er als benutzerdefiniertes Feld customTime gespeichert. Die Zeit updated des Objekts wird bei der Übertragung zurückgesetzt, sodass auch die Zeit des Objekts in der Speicherklasse zurückgesetzt wird. Das bedeutet, dass ein Objekt nach der Übertragung in Coldline Storage 90 Tage lang am Ziel vorhanden sein muss, um Gebühren für vorzeitiges Löschen zu vermeiden.

Sie können Ihre createTime-basierten Lebenszyklusrichtlinien mit customTime anwenden. Vorhandene customTime-Werte werden überschrieben.

Weitere Informationen dazu, was beibehalten wird und was nicht, finden Sie unter Metadatenaufbewahrung.

Versionierte Objekte verarbeiten

Wenn Sie alle Versionen Ihrer Storage-Objekte und nicht nur die neueste übertragen möchten, können Sie die Manifestfunktion des Storage Transfer Service verwenden.

So übertragen Sie alle Objektversionen:

  1. Listen Sie die Bucket-Objekte auf und kopieren Sie sie in eine JSON-Datei:

    gcloud storage ls --all-versions --recursive --json [SOURCE_BUCKET] > object-listing.json
    

    Dieser Befehl listet in der Regel etwa 1.000 Objekte pro Sekunde auf.

  2. Kopieren Sie die nicht aktuellen Objekte in eine CSV-Datei:

    jq -r '.[] | select( .type=="cloud_object" and (.metadata | has("timeDeleted"))) | [.metadata.name, .metadata.generation] | @csv' object-listing.json > non-current-object-manifest.csv
    
  3. Aktivieren Sie die Objektversionierung für den Ziel-Bucket.

  4. Übertragen Sie die nicht aktuellen Versionen mit den folgenden Übertragungsoptionen:

    • Geben Sie die Manifest datei an.
    • Wählen Sie aus, dass Objekte in der Senke immer überschrieben werden sollen (OVERWRITE_WHEN=always). Beachten Sie, dass dadurch in seltenen Fällen doppelte Versionen einer Datei erstellt werden können.
    • Behalten Sie die timeCreated-Metadaten bei (MetdataOptions.timeCreated=TIME_CREATED_PRESERVE_AS_CUSTOM_TIME).
  5. Übertragen Sie die Live-Versionen mit einem regulären Übertragungsjob.

Übertragungsoptionen konfigurieren

Einige der Optionen, die Ihnen beim Einrichten der Übertragung zur Verfügung stehen, sind:

  • Logging: Cloud Logging bietet detaillierte Logs einzelner Objekte, damit Sie den Übertragungsstatus und zusätzliche Datenintegritätsprüfungen prüfen können.

  • Filter: Sie können Präfixe zum Einschließen und Ausschließen verwenden, um die Objekte einzuschränken, mit denen Storage Transfer Service arbeitet. Mit dieser Option können Sie eine Übertragung in mehrere Übertragungsjobs aufteilen, damit sie parallel ausgeführt werden können. Weitere Informationen finden Sie unter Übertragungsgeschwindigkeit optimieren.

  • Übertragungsoptionen: Sie können Ihre Übertragung so konfigurieren, dass vorhandene Objekte im Zielbereich überschrieben werden, dass Objekte im Zielbereich gelöscht werden, die in der Übertragungsgruppe nicht vorhanden sind, oder dass übertragene Objekte in der Quelle gelöscht werden.

Daten übertragen

Nachdem Sie Ihre Übertragungsstrategie definiert haben, können Sie die Übertragung selbst ausführen.

Neuen Bucket erstellen

Bevor Sie die Übertragung starten, erstellen Sie einen Storage-Bucket. Informationen zur Auswahl eines geeigneten Bucket-Speicherorts finden Sie unter location_considerations.

Sie können beim Erstellen des neuen Buckets einige der Bucket-Metadaten kopieren. Unter Bucket-Metadaten abrufen erfahren Sie, wie Sie die Metadaten des Quell-Buckets anzeigen lassen, damit Sie dieselben Einstellungen auf Ihren neuen Bucket anwenden können.

Objekte in den neuen Bucket kopieren

Sie können Objekte aus dem Quell-Bucket in einen neuen Bucket kopieren. Verwenden Sie dazu die Google Cloud Console, die gcloud CLI, die REST API oder Clientbibliotheken. Welchen Ansatz Sie wählen, hängt von Ihrer Übertragungsstrategie ab.

Die folgende Anleitung gilt für den grundlegenden Anwendungsfall der Übertragung von Objekten von einem Bucket in einen anderen und sollte an Ihre Bedürfnisse angepasst werden.

Der Name des Übertragungsjobs darf keine vertraulichen Informationen wie personenidentifizierbare Informationen oder Sicherheitsdaten enthalten. Ressourcennamen können an die Namen anderer Google Cloud-Ressourcen weitergegeben und für Google-interne Systeme außerhalb Ihres Projekts sichtbar gemacht werden.

Google Cloud Console

Verwenden Sie den Cloud Storage Transfer Service in der Google Cloud Console:

  1. Öffnen Sie in der Google Cloud Console die Seite „Übertragen“.

    Öffnen Sie die Seite Übertragen.

  2. Klicken Sie auf Übertragung erstellen.
  3. Führen Sie die folgenden Schritte aus und klicken Sie dabei nach jedem Schritt auf Nächster Schritt:

    • Erste Schritte: Verwenden Sie Google Cloud Storage sowohl als Quelltyp als auch als Zieltyp.

    • Quelle auswählen: Geben Sie entweder den Namen des gewünschten Buckets direkt ein oder klicken Sie auf Durchsuchen, um den gewünschten Bucket zu suchen und auszuwählen.

    • Ziel auswählen: Geben Sie entweder den Namen des gewünschten Buckets direkt ein oder klicken Sie auf Durchsuchen, um den gewünschten Bucket zu suchen und auszuwählen.

    • Einstellungen auswählen: Wählen Sie die Option Dateien nach der Übertragung aus der Quelle löschen aus.

    • Planungsoptionen: Diesen Abschnitt können Sie ignorieren.

  4. Nachdem Sie alle Schritte ausgeführt haben, klicken Sie auf Erstellen.

    Damit beginnt das Kopieren der Objekte aus dem alten Bucket in den neuen. Der Vorgang kann einige Zeit in Anspruch nehmen. Nachdem Sie auf Erstellen geklickt haben, können Sie die Google Cloud Console aber verlassen.

    So sehen Sie den Fortschritt der Übertragung:

    Öffnen Sie in der Google Cloud Console die Seite „Übertragen“.

    Öffnen Sie die Seite Übertragen

    Unter Fehlerbehebung erfahren Sie, wie Sie detaillierte Fehlerinformationen zu fehlgeschlagenen Storage Transfer Service Vorgängen in der Google Cloud Console abrufen.

  5. Sie müssen nichts unternehmen, um die Objekte aus dem alten Bucket zu löschen, sobald die Übertragung abgeschlossen ist. Dazu müssen Sie bei der Einrichtung das Kästchen Quellobjekte nach Übertragung löschen ausgewählt haben. Sie können jedoch auch Ihren alten Bucket löschen, was Sie separat machen müssen.

gcloud CLI

gcloud-CLI installieren

Installieren Sie das gcloud-Befehlszeilentool, falls noch nicht geschehen.

Rufen Sie dann gcloud init auf, um das Tool zu initialisieren und Ihre Projekt-ID und Ihr Nutzerkonto anzugeben. Weitere Informationen finden Sie unter gcloud-CLI initialisieren.

gcloud init

Dienstkonto dem Zielordner hinzufügen

Sie müssen das Storage Transfer Service-Dienstkonto Ihrem Ziel-Bucket hinzufügen, bevor Sie eine Übertragung erstellen. Verwenden Sie dazu gcloud storage buckets add-iam-policy-binding:

gcloud storage buckets add-iam-policy-binding gs://bucket_name \
--member=serviceAccount:project-12345678@storage-transfer-service.iam.gserviceaccount.com \
--role=roles/storage.admin

Eine Anleitung zur Verwendung der Google Cloud Console oder der API finden Sie unter IAM-Berechtigungen verwenden in der Cloud Storage-Dokumentation.

Übertragungsjob erstellen

Verwenden Sie zum Erstellen eines neuen Übertragungsjobs den Befehl gcloud transfer jobs create. Das Erstellen eines neuen Jobs initiiert die angegebene Übertragung, sofern weder ein Zeitplan noch --do-not-run angegeben ist.

gcloud transfer jobs create SOURCE DESTINATION

Ersetzen Sie Folgendes:

  • SOURCE ist die Datenquelle für diese Übertragung, im Format gs://BUCKET_NAME.

  • DESTINATION ist Ihr neuer Bucket, im Format gs://BUCKET_NAME.

Weitere Optionen:

  • Jobinformationen: Sie können --name und --description angeben.

  • Zeitplan: Geben Sie --schedule-starts, --schedule-repeats-every und --schedule-repeats-until oder --do-not-run an.

  • Objektbedingungen: Mit Bedingungen können Sie bestimmen, welche Objekte übertragen werden. Dazu gehören --include-prefixes, --exclude-prefixes und --match-glob sowie die zeitbasierten Bedingungen in --include-modified-[before | after]-[absolute | relative].

  • Übertragungsoptionen: Bestimmen Sie, ob Zieldateien überschrieben werden sollen (--overwrite-when=different oder always) und ob bestimmte Dateien während oder nach der Übertragung gelöscht werden sollen (--delete-from=destination-if-unique oder source-after-transfer); bestimmen Sie welche Metadatenwerte beibehalten werden sollen (--preserve-metadata); und legen Sie optional eine Speicherklasse für übertragene Objekte fest (--custom-storage-class).

  • Benachrichtigungen: Konfigurieren Sie Pub/Sub-Benachrichtigungen für Übertragungen mit --notification-pubsub-topic, --notification-event-types und --notification-payload-format.

Führen Sie gcloud transfer jobs create --help aus, um alle Optionen anzuzeigen.

So übertragen Sie beispielsweise alle Objekte mit dem Präfix folder1:

gcloud transfer jobs create gs://old-bucket gs://new-bucket \
  --include-prefixes="folder1/"

REST

In diesem Beispiel erfahren Sie, wie Sie Dateien von einem Cloud Storage-Bucket in einen anderen verschieben. Sie können beispielsweise Daten in einen Bucket an einem anderen Speicherort bewegen.

Anfrage mit transferJobs create:

POST https://storagetransfer.googleapis.com/v1/transferJobs
{
  "description": "YOUR DESCRIPTION",
  "status": "ENABLED",
  "projectId": "PROJECT_ID",
  "schedule": {
      "scheduleStartDate": {
          "day": 1,
          "month": 1,
          "year": 2025
      },
      "startTimeOfDay": {
          "hours": 1,
          "minutes": 1
      },
      "scheduleEndDate": {
          "day": 1,
          "month": 1,
          "year": 2025
      }
  },
  "transferSpec": {
      "gcsDataSource": {
          "bucketName": "GCS_SOURCE_NAME"
      },
      "gcsDataSink": {
          "bucketName": "GCS_SINK_NAME"
      },
      "transferOptions": {
          "deleteObjectsFromSourceAfterTransfer": true
      }
  }
}

Lösung:

200 OK
{
  "transferJob": [
      {
          "creationTime": "2015-01-01T01:01:00.000000000Z",
          "description": "YOUR DESCRIPTION",
          "name": "transferJobs/JOB_ID",
          "status": "ENABLED",
          "lastModificationTime": "2015-01-01T01:01:00.000000000Z",
          "projectId": "PROJECT_ID",
          "schedule": {
              "scheduleStartDate": {
                  "day": 1,
                  "month": 1,
                  "year": 2015
              },
              "startTimeOfDay": {
                  "hours": 1,
                  "minutes": 1
              }
          },
          "transferSpec": {
              "gcsDataSource": {
                  "bucketName": "GCS_SOURCE_NAME",
              },
              "gcsDataSink": {
                  "bucketName": "GCS_NEARLINE_SINK_NAME"
              },
              "objectConditions": {
                  "minTimeElapsedSinceLastModification": "2592000.000s"
              },
              "transferOptions": {
                  "deleteObjectsFromSourceAfterTransfer": true
              }
          }
      }
  ]
}

Clientbibliotheken

In diesem Beispiel erfahren Sie, wie Sie Dateien von einem Cloud Storage-Bucket in einen anderen verschieben. Sie können beispielsweise Daten in einen Bucket an einem anderen Speicherort replizieren.

Weitere Informationen zu den Storage Transfer Service-Clientbibliotheken finden Sie unter Erste Schritte mit Storage Transfer Service-Clientbibliotheken.

Java

Sie suchen nach älteren Beispielen? Weitere Informationen finden Sie im Storage Transfer Service-Migrationsleit1}.

import com.google.protobuf.Duration;
import com.google.storagetransfer.v1.proto.StorageTransferServiceClient;
import com.google.storagetransfer.v1.proto.TransferProto.CreateTransferJobRequest;
import com.google.storagetransfer.v1.proto.TransferTypes.GcsData;
import com.google.storagetransfer.v1.proto.TransferTypes.ObjectConditions;
import com.google.storagetransfer.v1.proto.TransferTypes.Schedule;
import com.google.storagetransfer.v1.proto.TransferTypes.TransferJob;
import com.google.storagetransfer.v1.proto.TransferTypes.TransferJob.Status;
import com.google.storagetransfer.v1.proto.TransferTypes.TransferOptions;
import com.google.storagetransfer.v1.proto.TransferTypes.TransferSpec;
import com.google.type.Date;
import com.google.type.TimeOfDay;
import java.io.IOException;
import java.util.Calendar;

public class TransferToNearline {
  /**
   * Creates a one-off transfer job that transfers objects in a standard GCS bucket that are more
   * than 30 days old to a Nearline GCS bucket.
   */
  public static void transferToNearline(
      String projectId,
      String jobDescription,
      String gcsSourceBucket,
      String gcsNearlineSinkBucket,
      long startDateTime)
      throws IOException {

    // Your Google Cloud Project ID
    // String projectId = "your-project-id";

    // A short description of this job
    // String jobDescription = "Sample transfer job of old objects to a Nearline GCS bucket.";

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

    // The name of the Nearline GCS bucket to transfer old objects to
    // String gcsSinkBucket = "your-nearline-gcs-bucket";

    // What day and time in UTC to start the transfer, expressed as an epoch date timestamp.
    // If this is in the past relative to when the job is created, it will run the next day.
    // long startDateTime =
    //     new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2000-01-01 00:00:00").getTime();

    // Parse epoch timestamp into the model classes
    Calendar startCalendar = Calendar.getInstance();
    startCalendar.setTimeInMillis(startDateTime);
    // Note that this is a Date from the model class package, not a java.util.Date
    Date date =
        Date.newBuilder()
            .setYear(startCalendar.get(Calendar.YEAR))
            .setMonth(startCalendar.get(Calendar.MONTH) + 1)
            .setDay(startCalendar.get(Calendar.DAY_OF_MONTH))
            .build();
    TimeOfDay time =
        TimeOfDay.newBuilder()
            .setHours(startCalendar.get(Calendar.HOUR_OF_DAY))
            .setMinutes(startCalendar.get(Calendar.MINUTE))
            .setSeconds(startCalendar.get(Calendar.SECOND))
            .build();

    TransferJob transferJob =
        TransferJob.newBuilder()
            .setDescription(jobDescription)
            .setProjectId(projectId)
            .setTransferSpec(
                TransferSpec.newBuilder()
                    .setGcsDataSource(GcsData.newBuilder().setBucketName(gcsSourceBucket))
                    .setGcsDataSink(GcsData.newBuilder().setBucketName(gcsNearlineSinkBucket))
                    .setObjectConditions(
                        ObjectConditions.newBuilder()
                            .setMinTimeElapsedSinceLastModification(
                                Duration.newBuilder().setSeconds(2592000 /* 30 days */)))
                    .setTransferOptions(
                        TransferOptions.newBuilder().setDeleteObjectsFromSourceAfterTransfer(true)))
            .setSchedule(Schedule.newBuilder().setScheduleStartDate(date).setStartTimeOfDay(time))
            .setStatus(Status.ENABLED)
            .build();

    // Create a Transfer Service client
    StorageTransferServiceClient storageTransfer = StorageTransferServiceClient.create();

    // Create the transfer job
    TransferJob response =
        storageTransfer.createTransferJob(
            CreateTransferJobRequest.newBuilder().setTransferJob(transferJob).build());

    System.out.println("Created transfer job from standard bucket to Nearline bucket:");
    System.out.println(response.toString());
  }
}

Python

Sie suchen nach älteren Beispielen? Weitere Informationen finden Sie im Storage Transfer Service-Migrationsleit1}.

from datetime import datetime

from google.cloud import storage_transfer
from google.protobuf.duration_pb2 import Duration


def create_daily_nearline_30_day_migration(
    project_id: str,
    description: str,
    source_bucket: str,
    sink_bucket: str,
    start_date: datetime,
):
    """Create a daily migration from a GCS bucket to a Nearline GCS bucket
    for objects untouched for 30 days."""

    client = storage_transfer.StorageTransferServiceClient()

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

    # A useful description for your transfer job
    # description = 'My transfer job'

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

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

    transfer_job_request = storage_transfer.CreateTransferJobRequest(
        {
            "transfer_job": {
                "project_id": project_id,
                "description": description,
                "status": storage_transfer.TransferJob.Status.ENABLED,
                "schedule": {
                    "schedule_start_date": {
                        "day": start_date.day,
                        "month": start_date.month,
                        "year": start_date.year,
                    }
                },
                "transfer_spec": {
                    "gcs_data_source": {
                        "bucket_name": source_bucket,
                    },
                    "gcs_data_sink": {
                        "bucket_name": sink_bucket,
                    },
                    "object_conditions": {
                        "min_time_elapsed_since_last_modification": Duration(
                            seconds=2592000  # 30 days
                        )
                    },
                    "transfer_options": {
                        "delete_objects_from_source_after_transfer": True
                    },
                },
            }
        }
    )

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

Kopierte Objekte überprüfen

Wenn die Übertragung abgeschlossen ist, sollten Sie zusätzliche Datenintegritätsprüfungen durchführen.

  • Prüfen Sie, ob die Objekte korrekt kopiert wurden. Prüfen Sie dazu die Metadaten der Objekte wie Prüfsummen und Größe.

  • Prüfen Sie, ob die richtige Version der Objekte kopiert wurde. Storage Transfer Service bietet eine sofort einsatzbereite Option, um zu prüfen, ob Objekte Kopien sind. Wenn Sie das Logging aktiviert haben, können Sie anhand der Logs prüfen, ob alle Objekte einschließlich der entsprechenden Metadatenfelder erfolgreich kopiert wurden.

Ziel-Bucket verwenden

Wenn die Migration abgeschlossen und geprüft ist, aktualisieren Sie alle vorhandenen Anwendungen oder Arbeitslasten so, dass sie den Namen des Ziel-Buckets verwenden. Prüfen Sie die Datenzugriffslogs in den Cloud-Audit-Logs, damit Ihre Operationen Objekte korrekt ändern und lesen.

Ursprünglichen Bucket löschen

Wenn alles gut funktioniert, löschen Sie den ursprünglichen Bucket.

Storage Transfer Service bietet die Möglichkeit, Objekte nach der Übertragung zu löschen. Geben Sie dazu in der Jobkonfiguration deleteObjectsFromSourceAfterTransfer: true an oder wählen Sie die Option in der Google Cloud Console aus.

Löschen von Objekten planen

Um das Löschen Ihrer Objekte zu einem späteren Zeitpunkt zu planen, verwenden Sie eine Kombination aus einem geplanten Übertragungsjob und der deleteObjectsUniqueInSink = true Option.

Der Übertragungsjob sollte so eingerichtet sein, dass ein leerer Bucket in den Bucket mit Ihren Objekten übertragen wird. Dadurch führt der Storage Transfer Service die Objekte auf und beginnt mit dem Löschen. Da Löschvorgänge nur Metadaten sind, ist der Übertragungsjob nur an die Abfragen pro Sekunde gebunden. Um den Prozess zu beschleunigen, teilen Sie die Übertragung in mehrere Jobs auf, die jeweils mit einem bestimmten Satz von Präfixen arbeiten.

Alternativ bietet Google Cloud einen verwalteten Cronjob-Planer. Weitere Informationen finden Sie unter Google Cloud STS-Übertragungsjob mit Cloud Scheduler planen.