クロスバケット レプリケーションを使用する

このページでは、クロスバケット レプリケーションの概要と、この機能の使用方法について説明します。

クロスバケット レプリケーションの概要

場合によっては、ある Cloud Storage バケットから別のバケットにデータをコピーすることがあります。クロスバケット レプリケーションは、新規オブジェクトと更新されたオブジェクトをソースバケットから宛先バケットに非同期でコピーします。

クロスバケット レプリケーションは、データが 2 つのバケットに存在し、それぞれにストレージのロケーション、暗号化、アクセス、ストレージ クラスなどの独自の構成がある点で、デフォルトのレプリケーションやターボ レプリケーションとは異なります。その結果、データ復旧と可用性が実現されるだけでなく、次のような場合にも適しています。

  • データ主権: 地理的に離れたリージョンにまたがるデータを維持します。
  • 開発環境と製品版で異なるバージョンを維持: 別個のバケットと名前空間を作成して、開発環境が製品版のワークロードに影響しないようにします。
  • データ共有: ベンダーまたはパートナーが所有するバケットにデータを複製します。
  • データ集約: さまざまなバケットのデータを 1 つのバケットに結合して、分析ワークロードを実行します。
  • 費用、セキュリティ、コンプライアンスの管理: さまざまな所有権、ストレージ クラス、保持期間でデータを維持します。

クロスバケット レプリケーションでは、Storage Transfer Service を使用してオブジェクトを複製し、Pub/Sub を使用してソースバケットと宛先バケットの変更に関するアラートを受信します。クロスバケット レプリケーションは、作成した新しいバケットと既存のバケットで有効にできます。ほとんどのオブジェクトは数分で複製できますが、1 GiB を超えるオブジェクトでは数時間かかることがあります。

制限事項

  • バケット間のレプリケーション ジョブでは、カスタム名はサポートされていません。name フィールドの値を含む作成リクエストはエラーを返します。

  • 階層名前空間バケットまたはゾーンバケットでは、バケット間のレプリケーションはサポートされていません。

  • ソースバケットでオブジェクトを削除しても、転送先バケットには複製されません。

  • オブジェクトのライフサイクル構成は複製されません。

  • オブジェクトが複製される際、タイムスタンプ メタデータ(timeCreated や timeUpdated など)は保持されません。メタデータの保持の詳細については、Cloud Storage バケット間の転送をご覧ください。

  • クロスバケット レプリケーションを使用して、任意の Google Cloud ロケーションにあるバケット間でデータを複製できるため、クロスバケット レプリケーションのパフォーマンスは、選択したロケーションによって異なります。したがって、クロスバケット レプリケーションでは目標復旧時点(RPO)は提供されません。

  • レプリケーション ジョブの作成時にバケットにすでに存在しているオブジェクトは、自動的に複製されません。新規オブジェクトまたは更新されたオブジェクトのみが複製されます。既存のオブジェクトを複製するには、既存のバケットから新しいバケットへの 1 回限りの Storage Transfer Service 転送ジョブを作成します。手順については、転送を作成するをご覧ください。

  • クロスバケット レプリケーションは、ライブ オブジェクトの作成と更新のみを複製し、非現行バージョンのオブジェクトは複製しません。1 回限りの移行中に既存の非現行バージョンを転送するには、バージョニングされたオブジェクトを処理するで説明されているように、オブジェクト マニフェストを使用します。

始める前に

始める前に、次の手順を行います。

Storage Transfer Service API を有効にする

まだ有効にしていない場合は、Storage Transfer Service API を有効にします。

必要なロールを取得する

クロスバケット レプリケーションを使用するために必要な権限を取得するには、レプリケーション ジョブを作成するプロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

これらの事前定義ロールには、クロスバケット レプリケーションの使用に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

クロスバケット レプリケーションを使用するには、次の権限が必要です。

  • ジョブを作成、実行、更新する:
    • storagetransfer.jobs.create
    • storagetransfer.jobs.get
    • storagetransfer.jobs.list
    • storagetransfer.jobs.run
    • storagetransfer.jobs.update
  • ジョブを削除します。 storagetransfer.jobs.delete

バケットに対してロールを付与する手順については、バケットで IAM を使用するをご覧ください。 プロジェクトにロールを付与する手順については、プロジェクトへのアクセス権を管理するをご覧ください。

必要なロールを付与する

クロスバケット レプリケーションは、Storage Transfer Service を使用してソースバケットから宛先バケットにオブジェクトを複製し、Pub/Sub を使用してソースバケットの変更通知を受け取ります。

クロスバケット レプリケーションでこれらのサービスを使用できるようにするには、Storage Transfer Service がデータのレプリケーションに使用するサービス アカウントと、Pub/Sub が通知の書き込みに使用するサービス エージェントに必要な権限を付与する必要があります。

Storage Transfer Service に必要なロールを付与する

Storage Transfer Service を使用してデータを複製するために必要な権限は、2 つのサービス アカウントのいずれかに付与できます。次のいずれかを行います。

  • Storage Transfer Service サービス エージェント。Google によって自動的に作成、管理されます。このサービス エージェントのメールアドレスは、project-PROJECT_NUMBER@storage-transfer-service. の命名形式に従います。Storage Transfer Service サービス エージェントのメールアドレスは、Storage Transfer Service googleServiceAccounts.get API を使用して取得できます。

または

  • ユーザー管理のサービス アカウント。このサービス アカウントのメールアドレスは、SERVICE_ACCOUNT_NAME@PROJECT_ID. の命名形式に従います。独自のサービス アカウントを作成し、データの複製に必要な権限を付与できます。

    Storage Transfer Service でユーザー管理のサービス アカウントを使用する手順については、サービス エージェントの権限をユーザー管理のサービス アカウントに委任するをご覧ください。次のリストに記載されている権限以外にも、追加の権限が必要です。特に、サービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を割り当てて、サービス エージェントにユーザー管理のサービス アカウントへのアクセス権を付与する必要があります。サービス エージェントにアクセス権を付与するをご覧ください。

Storage Transfer Service サービス エージェントまたはユーザー サービス アカウントには、オブジェクトを複製し、ソースバケットの Pub/Sub 通知を設定するために、次の権限が必要です。

必要な権限

ソース プロジェクトには次の権限を付与する必要があります。

  • pubsub.topics.create
  • pubsub.subscriptions.create
  • pubsub.subscriptions.consume

ソースバケットには次の権限を付与する必要があります。

  • storage.buckets.get
  • storage.buckets.update
  • storage.objects.get

宛先バケットに次の権限を付与する必要があります。

  • storage.buckets.get
  • storage.objects.create
  • storage.objects.get

これらの権限は、カスタムロールを介して付与することも、次の事前定義ロールをすべて付与することでも付与できます。

  • ソース プロジェクトに対する Pub/Sub 編集者(roles/pubsub.editor)ロール
  • ソースバケットに対する Storage レガシー バケット オーナー(roles/storage.legacyBucketOwner)ロールと Storage オブジェクト閲覧者(roles/storage.objectViewer)ロール
  • 転送先バケットに対する Storage オブジェクト ユーザー(roles/storage.objectUser)ロールと Storage レガシー バケット読み取り(roles/storage.legacyBucketReader)ロール

Pub/Sub に必要なロールを付与する

Cloud Storage は、サービス エージェントを使用して Pub/Sub 通知を管理します。このサービス エージェントのメールアドレスは、service-PROJECT_NUMBER@gs-project-accounts. の命名形式に従います。

Cloud Storage サービス エージェントには、Pub/Sub を設定してトピックにメッセージをパブリッシュするために、次の権限が必要です。

必要な権限
  • Pub/Sub トピックに対する pubsub.topics.publish

これらの権限は、カスタムロールを介して付与することも、次の事前定義ロールを付与することで付与することもできます。

  • ソース プロジェクトに対する Pub/Sub パブリッシャー(roles/pubsub.publisher)

レプリケーション ジョブを作成する

コンソール

レプリケーション ジョブを作成する Google Cloud コンソールの手順については、 Google Cloud コンソールを使用してレプリケーション ジョブを作成するをご覧ください。

コマンドライン

Google Cloud CLI を使用する場合は、既存のバケットに対してレプリケーション ジョブを作成できます。

レプリケーション ジョブを作成するには、--replication フラグを指定して gcloud alpha transfer jobs create コマンドを使用します。

gcloud alpha transfer jobs create gs://SOURCE_BUCKET_NAME gs://DESTINATION_BUCKET_NAME --replication

以下のように置き換えます。

  • SOURCE_BUCKET_NAME は、複製するソースバケットの名前に置き換えます。例: my-source-bucket

  • DESTINATION_BUCKET_NAME は、宛先バケットの名前に置き換えます。 例: my-destination-bucket

--name フラグは、クロスバケット レプリケーション ジョブではサポートされていません。

REST API

JSON API

JSON API を使用する場合は、既存のバケットに対してレプリケーション ジョブを作成できます。

  1. gcloud CLI のインストールと初期化を行います。これにより、Authorization ヘッダーのアクセス トークンを生成できます。

  2. 初期化された ReplicationSpec リソースが含まれる TransferJob オブジェクトを含む JSON ファイルを作成します。

    TransferJob {
     ReplicationSpec: {
       "gcsDataSource": {
         "bucketName": "SOURCE_BUCKET_NAME"
       },
       "gcsDataSink" {
         "bucketName": "DESTINATION_BUCKET_NAME"
       },
       "objectConditions": {
       },
       "transferOptions": {
         "overwriteWhen": "OVERWRITE_OPTION"
       }
     }
     ...
    }

    次のように置き換えます。

    • SOURCE_BUCKET_NAME は、複製するオブジェクトを含むソースバケットの名前に置き換えます。(例: example-source-bucket)です。

    • DESTINATION_BUCKET_NAME は、オブジェクトが複製される宛先バケットの名前に置き換えます。(例: example-destination-bucket)です。

    • OVERWRITE_OPTION: レプリケーション ジョブの結果として宛先バケット内の既存のオブジェクトを上書きする方法のオプション。宛先オブジェクトとソース オブジェクトが同じ名前の場合に発生する可能性があります。値は次のいずれかにする必要があります。

      • ALWAYS: 転送先バケット内のオブジェクトを常に上書きします

      • DIFFERENT: 宛先オブジェクトのデータがソース オブジェクトのデータと異なる場合にのみ、宛先バケット内のオブジェクトを上書きします

      • NEVER: 転送先バケット内のオブジェクトを上書きしません

    name フィールドは、バケット間のレプリケーション ジョブではサポートされていません。

  3. cURL を使用して、transferJobs.create リクエストで Storage Transfer Service REST API を呼び出します。

    curl -X POST --data-binary @JSON_FILE_NAME \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://storagetransfer.googleapis.com/v1/transferJobs"

    次のように置き換えます。

    • JSON_FILE_NAME は、手順 2 で作成した JSON ファイルの名前です。

レプリケーション ジョブのステータスを確認するには、Storage Transfer Service のサービスログの Cloud Logging を表示します。

レプリケーション ジョブを一覧表示する

コンソール

レプリケーション ジョブを一覧表示する Google Cloud コンソールの手順については、 Google Cloud コンソールを使用してレプリケーション ジョブを一覧表示するをご覧ください。

コマンドライン

gcloud alpha transfer jobs list コマンドを使用し、--job-type フラグを指定します。

gcloud alpha transfer jobs list --job-type=replication

REST API

JSON API

  1. gcloud CLI のインストールと初期化を行います。これにより、Authorization ヘッダーのアクセス トークンを生成できます。

  2. cURL を使用して、transferJobs.list リクエストで Storage Transfer Service REST API を呼び出します。

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://storagetransfer.googleapis.com/v1/transferJobs"

レプリケーション ジョブを表示する

コンソール

レプリケーション ジョブを表示する Google Cloud コンソールの手順については、 Google Cloud コンソールを使用してレプリケーション ジョブを表示するをご覧ください。

コマンドライン

gcloud alpha transfer jobs describe コマンドを使用します。

gcloud alpha transfer jobs describe JOB_NAME

以下のように置き換えます。

REST API

JSON API

  1. gcloud CLI のインストールと初期化を行います。これにより、Authorization ヘッダーのアクセス トークンを生成できます。

  2. cURL を使用して、transferJobs.get リクエストで Storage Transfer Service REST API を呼び出します。

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://storagetransfer.googleapis.com/v1/transferJobs/JOB_NAME"

    以下のように置き換えます。

レプリケーション ジョブを更新する

レプリケーション ジョブの次のフィールドを更新できます。

  • レプリケーション ジョブの説明
  • レプリケーション ジョブ実行の構成
  • Pub/Sub に公開される通知の構成
  • レプリケーション ジョブ オペレーションのロギング動作
  • レプリケーション ジョブのステータス(有効、無効、削除済み)

コンソール

レプリケーション ジョブを更新する Google Cloud コンソールの手順については、 Google Cloud コンソールを使用してレプリケーション ジョブを更新するをご覧ください。

コマンドライン

更新するレプリケーション ジョブのプロパティを制御するフラグを指定して、gcloud alpha transfer jobs update コマンドを使用します。使用可能なフラグの一覧については、gcloud alpha transfer jobs update のドキュメントをご覧ください。

たとえば、レプリケーション ジョブのオブジェクト上書き動作を更新するには、--overwrite-when フラグを指定して gcloud alpha transfer jobs update コマンドを実行します。

gcloud alpha transfer jobs update JOB_NAME --overwrite-when=OVERWRITE_OPTION

以下のように置き換えます。

  • JOB_NAME は、レプリケーション ジョブの一意の ID に置き換えます。例: 1234567890転送ジョブの ID を確認するには、転送ジョブを一覧表示または表示します。

  • OVERWRITE_OPTION: レプリケーション ジョブの結果として宛先バケット内の既存のオブジェクトを上書きする方法のオプション。宛先オブジェクトとソース オブジェクトが同じ名前の場合に発生する可能性があります。値は次のいずれかにする必要があります。

    • always: 宛先オブジェクトを常に上書きします。

    • different: 宛先オブジェクトのデータがソース オブジェクトのデータと異なる場合にのみ、宛先バケット内のオブジェクトを上書きします。

    • never: 宛先オブジェクトを上書きしません。

REST API

JSON API

  1. gcloud CLI のインストールと初期化を行います。これにより、Authorization ヘッダーのアクセス トークンを生成できます。

  2. 更新する TransferJob オブジェクトのフィールドを含む次の構造を含む JSON ファイルを作成します。

    {
     "projectId": string,
     "transferJob": {
       object (TransferJob)
     },
       "updateTransferJobFieldMask": UPDATE_MASK
    }

    次のように置き換えます。

    • object (TransferJob) は、更新するレプリケーション ジョブのフィールドに置き換えられます。詳細については、TransferJob リソースの表現をご覧ください。

    • UPDATE_MASK は、更新するフィールド名のカンマ区切りのリストです。値は、description、transferSpec、notificationConfig、loggingConfig、status のいずれか 1 つ以上です。

    指定できるフィールド名の詳細については、transferJobs.patch リクエスト本文をご覧ください。

  3. cURL を使用して、transferJobs.patch リクエストで Storage Transfer Service REST API を呼び出します。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://storagetransfer.googleapis.com/v1/transferJobs/JOB_NAME"

    以下のように置き換えます。

レプリケーション ジョブを削除する

コンソール

レプリケーション ジョブを削除する Google Cloud コンソールの手順については、 Google Cloud コンソールを使用してレプリケーション ジョブを削除するをご覧ください。

コマンドライン

gcloud alpha transfer jobs delete コマンドを使用します。

gcloud alpha transfer jobs delete JOB_NAME

以下のように置き換えます。

REST API

JSON API

  1. gcloud CLI のインストールと初期化を行います。これにより、Authorization ヘッダーのアクセス トークンを生成できます。

  2. cURL を使用して、transferJobs.delete リクエストで Storage Transfer Service REST API を呼び出します。

    curl -X DELETE \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://storagetransfer.googleapis.com/v1/transferJobs/JOB_NAME"

    以下のように置き換えます。