使用跨存储桶复制

本页简要介绍了跨存储桶复制功能,并提供了有关如何使用该功能的说明。

跨存储桶复制概览

在某些情况下,您可能需要将数据从一个 Cloud Storage 存储桶复制到另一个存储分区。跨存储桶复制会将新对象和更新后的对象从源存储桶异步复制到目标存储桶。

跨存储桶复制与默认复制和增强型复制不同,因为您的数据存在于两个存储桶中,每个存储桶都有自己的配置,例如存储位置、加密、访问权限和存储类别。因此,跨存储桶复制不仅能提供数据恢复和可用性,还适合:

  • 数据主权:在相距甚远的地理区域内维护数据。
  • 分别维护开发版本和生产版本:创建不同的存储桶和命名空间,以免开发工作影响您的生产工作负载。
  • 共享数据:将数据复制到供应商或合作伙伴拥有的存储桶。
  • 数据汇总:将不同存储桶中的数据合并到单个存储桶中,以运行分析工作负载。
  • 管理费用、安全性和合规性:在不同的所有权、存储类别和保留期限下维护数据。

跨存储桶复制功能使用 Storage Transfer Service 复制对象,并使用 Pub/Sub 在源存储桶和目标存储桶发生更改时发送提醒。您可以在创建的新存储桶和现有存储桶上启用跨存储桶复制。大多数对象可以在几分钟内复制完毕,而大于 1 GiB 的对象可能需要数小时。

准备工作

在开始之前,请完成以下步骤。

启用 Storage Transfer Service API

启用 Storage Transfer Service API(如果尚未启用)。

获取所需角色

如需获得使用跨存储桶复制所需的权限,请让您的管理员为您授予存储桶或项目的 Storage Transfer User (roles/storagetransfer.user) IAM 角色。

此预定义角色可提供使用跨存储桶复制所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

使用跨存储桶复制需要以下权限:

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

如需了解如何授予存储桶的角色,请参阅将 IAM 与存储桶搭配使用。 如需了解如何授予项目的角色,请参阅管理对项目的访问权限

授予必需的角色

跨存储桶复制功能使用 Pub/Sub 接收有关源存储桶更改的通知,并使用 Storage Transfer Service 将对象从源存储桶复制到目标存储桶。如需使用跨存储桶复制,您还必须向 Storage Transfer Service 用于复制数据的服务代理以及 Pub/Sub 用于写入通知的服务代理授予必要的权限。

为 Storage Transfer Service 服务代理授予所需的角色

Storage Transfer Service 使用 Google 代管式服务代理来复制数据。此服务代理的电子邮件地址遵循命名格式 project-PROJECT_NUMBER@storage-transfer-service.。您可以使用 Storage Transfer Service googleServiceAccounts.get API 获取 Storage Transfer Service 服务代理的电子邮件地址。

Storage Transfer Service 服务代理需要拥有以下权限,才能复制您的对象并为源存储桶设置 Pub/Sub 通知:

所需权限

  • 针对源存储桶和目标存储桶的 storage.buckets.get 权限
  • 针对源存储桶的 storage.buckets.update
  • 针对源存储桶的 storage.objects.list
  • 针对源存储桶的 storage.objects.get
  • 针对目标存储桶的 storage.objects.rewrite
  • 针对项目的 pubsub.topics.create 权限

您可以通过 Pub/Sub Editor (roles/pubsub.editor) 角色和 Storage Admin (roles/storage.admin) 角色授予这些权限。如果您需要的角色权限比 Storage Admin 角色宽松,也可以使用自定义角色

向 Cloud Storage 服务代理授予所需角色

Cloud Storage 使用 Google 代管式服务代理来管理 Pub/Sub 通知。此服务代理的电子邮件地址遵循命名格式 service-PROJECT_NUMBER@gs-project-accounts.

Cloud Storage 服务代理需要拥有以下权限才能设置 Pub/Sub 并将消息发布到主题:

所需权限

  • 针对 Pub/Sub 主题的 pubsub.topics.publish 权限
  • 针对 Pub/Sub 主题的 pubsub.subscriptions.consume 权限
  • 针对项目的 pubsub.subscriptions.create 权限

您可以通过 Pub/Sub Publisher (roles/pubsub.publisher) 角色授予这些权限。

创建复制作业

控制台

如需了解如何在 Google Cloud 控制台中创建复制作业,请参阅使用 Google Cloud 控制台创建复制作业

命令行

使用 Google Cloud CLI 时,您可以为现有存储分区创建复制作业。

如需创建复制作业,请将 gcloud alpha transfer jobs create 命令与 --replication 标志结合使用:

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. 创建一个 JSON 文件,其中包含具有初始化 ReplicationSpec 资源TransferJob 对象

    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 控制台列出复制作业

命令行

使用带有 --job-type 标志的 gcloud alpha transfer jobs list 命令:

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

您需要进行如下替换:

  • JOB_NAME 替换为复制作业的唯一 ID。例如 1234567890。如需查找转移作业的 ID,请列出复制作业

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"

    您需要进行如下替换:

    • JOB_NAME 替换为复制作业的唯一 ID。例如 1234567890。如需查找复制作业的 ID,请列出复制作业

更新复制作业

您可以更新复制作业的以下字段:

  • 复制作业的说明

  • 用于运行复制作业的配置

  • 发布到 Pub/Sub 的通知的配置

  • 复制作业操作的日志记录行为

  • 复制作业的状态(已启用、已停用或已删除)

控制台

如需了解如何在 Google Cloud 控制台中更新复制作业,请参阅使用 Google Cloud 控制台更新复制作业

命令行

gcloud alpha transfer jobs update 命令与用于控制您要更新的复制作业属性的标志结合使用。如需查看可能标志的列表,请参阅 gcloud alpha transfer jobs update 文档

例如,如需更新复制作业的对象覆盖行为,请在运行 gcloud alpha transfer jobs update 命令时使用 --overwrite-when 标志:

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. 创建一个 JSON 文件,其中包含以下结构,其中包含您要更新的 TransferJob 对象的字段:

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

    其中:

    • object (TransferJob) 会替换为您要更新的复制作业的字段。如需了解详情,请参阅 TransferJob 资源表示法

    • UPDATE_MASK 是您要更新的字段名称的英文逗号分隔列表。可以是以下一个或多个值:descriptiontransferSpecnotificationConfigloggingConfigstatus

    如需详细了解您可以添加的字段名称,请参阅 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"

    您需要进行如下替换:

    • JOB_NAME 替换为复制作业的唯一 ID。例如 1234567890。如需查找复制作业的 ID,请列出复制作业

删除复制作业

控制台

如需了解如何在 Google Cloud 控制台中删除复制作业,请参阅使用 Google Cloud 控制台删除复制作业

命令行

使用 gcloud alpha transfer jobs delete 命令:

gcloud alpha transfer jobs delete JOB_NAME

您需要进行如下替换:

  • JOB_NAME 替换为复制作业的唯一 ID。例如 1234567890。如需查找复制作业的 ID,请列出复制作业

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"

    您需要进行如下替换:

    • JOB_NAME 替换为复制作业的唯一 ID。例如 1234567890。如需查找复制作业的 ID,请列出复制作业