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

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

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

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

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

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

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

制限事項

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

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

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

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

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

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

始める前に

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

Storage Transfer Service API を有効にする

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

必要なロールを取得する

クロスバケット レプリケーションを使用するために必要な権限を取得するには、バケットまたはソース プロジェクトに対するストレージ転送ユーザー roles/storagetransfer.user)IAM ロールを付与するよう管理者に依頼してください。

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

必要な権限

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

  • storagetransfer.jobs.create
  • storagetransfer.jobs.delete
  • storagetransfer.jobs.get
  • storagetransfer.jobs.list
  • storagetransfer.jobs.run
  • storagetransfer.jobs.update

バケットに対してロールを付与する手順については、バケットで 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.iam.gserviceaccount.com という命名形式になります。Storage Transfer Service googleServiceAccounts.get API を使用して、Storage Transfer Service サービス エージェントのメールアドレスを取得できます。

または

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

    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 Legacy Bucket Owner(roles/storage.legacyBucketOwner)ロールと Storage Object Viewer(roles/storage.objectViewer)ロール
  • 転送先バケットに対する Storage レガシー バケット書き込み(roles/storage.legacyBucketWriter)ロールと Storage オブジェクト閲覧者(roles/storage.objectViewer)ロール

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

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

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

必要な権限
  • Pub/Sub トピックに対する pubsub.topics.publish
  • Pub/Sub トピックに対する pubsub.subscriptions.consume
  • 移動元プロジェクトに対する pubsub.subscriptions.create

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

  • ソース プロジェクトに対する 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

REST API

JSON API

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

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

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

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

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

    • TRANSFER_JOB_NAME は、レプリケーション ジョブに割り当てる名前に置き換えます。命名要件については、transferJobs のリファレンス ドキュメントをご覧ください。

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

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

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

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

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

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

  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 は、更新するフィールド名のカンマ区切りのリストです。値は、descriptiontransferSpecnotificationConfigloggingConfigstatus のいずれか 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"

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