使用跨存储桶复制

本页面介绍如何使用跨存储桶复制,该功能使用 Storage Transfer Service 将新对象和更新后的对象从源存储桶异步复制到目标存储桶。使用跨存储桶复制时,您需要创建和管理复制作业,这是 Storage Transfer Service 中的一种作业类型。

准备工作

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

启用 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.iam.gserviceaccount.com。您可以使用 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.iam.gserviceaccount.com

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 控制台时,您可以在创建存储桶过程中为现有存储桶或新存储桶创建复制作业。

如需为新存储桶创建复制作业,请按照创建新存储桶的说明操作。

如需为现有存储桶创建复制作业,请完成以下步骤:

  1. 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 在存储桶列表中,点击要复制其对象的源存储桶的名称。

  3. 存储桶详情页面上,点击配置标签页。

  4. 找到跨存储桶复制选项,然后点击 修改

  5. 在打开的修改跨存储桶复制窗格中,点击添加目标

  6. 选择目标部分中,选择目标存储桶,然后点击下一步

  7. 选择复制设置部分中,执行以下操作:

    • 可选:如需按对象名称前缀过滤要复制的对象,请在 Choose which objects to replicate 部分中选中根据前缀复制对象复选框。

      • 如需按前缀包含对象,请在包含带前缀的对象部分中输入前缀,然后点击 添加前缀

      • 如需按前缀排除对象,请在排除带前缀的对象部分中输入前缀,然后点击 添加前缀

    • 可选:如需为复制的对象设置存储类别,请从为复制的对象设置存储类别部分的相应菜单中选择一个存储类别。

      如果您跳过此步骤,复制的对象默认使用目标存储桶的存储类别。

    1. 点击保存

命令行

使用 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 标头生成访问令牌。

    或者,您可以使用 OAuth 2.0 Playground 创建访问令牌,并将其包含在 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 控制台列出复制作业。如需了解如何一次查看单个复制作业,请参阅查看复制作业

命令行

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

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

REST API

JSON API

  1. 安装并初始化 gcloud CLI,以便为 Authorization 标头生成访问令牌。

    或者,您可以使用 OAuth 2.0 Playground 创建访问令牌,并将其包含在 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"

查看复制作业

控制台

  1. 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 在存储桶列表中,点击您要查看其跨存储桶复制作业的源存储桶的名称。

  3. 存储桶详情页面上,点击配置标签页。

  4. 找到跨存储桶复制选项,然后点击 修改

    系统会显示修改跨存储桶复制窗格,其中显示了每个目标存储桶的复制作业。

存储桶页面上,您可以查看复制列,该列显示了存储桶是否正在运行增强型复制作业或跨存储桶复制作业。如需了解如何显示复制列,请参阅显示列

命令行

使用 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 标头生成访问令牌。

    或者,您可以使用 OAuth 2.0 Playground 创建访问令牌,并将其包含在 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 控制台时,您只能通过暂停或解除暂停复制作业来更新复制作业。

  1. 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 在存储桶列表中,点击您要暂停或解除暂停复制的源存储桶的名称。

  3. 存储桶详情页面上,点击配置标签页。

  4. 找到跨存储桶复制选项,然后点击 修改

  5. 在显示的修改跨存储桶复制窗格中,点击您要更新的复制作业旁边的 暂停 解除暂停

命令行

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 标头生成访问令牌。

    或者,您可以使用 OAuth 2.0 Playground 创建访问令牌,并将其包含在 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,请列出复制作业

删除复制作业

控制台

  1. 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 在存储桶列表中,点击您要停止复制的源存储桶的名称。

  3. 存储桶详情页面上,点击配置标签页。

  4. 找到跨存储桶复制选项,然后点击 修改

  5. 在显示的修改跨存储桶复制窗格中,点击您要删除的复制作业旁边的 删除

  6. 在显示的对话框中,点击确认

命令行

使用 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 标头生成访问令牌。

    或者,您可以使用 OAuth 2.0 Playground 创建访问令牌,并将其包含在 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,请列出复制作业