本页面介绍如何使用跨存储桶复制,该功能使用 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 控制台时,您可以在创建存储桶过程中为现有存储桶或新存储桶创建复制作业。
如需为新存储桶创建复制作业,请按照创建新存储桶的说明操作。
如需为现有存储桶创建复制作业,请完成以下步骤:
- 在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。
在存储桶列表中,点击要复制其对象的源存储桶的名称。
在存储桶详情页面上,点击配置标签页。
找到跨存储桶复制选项,然后点击
修改。在打开的修改跨存储桶复制窗格中,点击添加目标。
在选择目标部分中,选择目标存储桶,然后点击下一步。
在选择复制设置部分中,执行以下操作:
可选:如需按对象名称前缀过滤要复制的对象,请在 Choose which objects to replicate 部分中选中根据前缀复制对象复选框。
如需按前缀包含对象,请在包含带前缀的对象部分中输入前缀,然后点击
添加前缀。如需按前缀排除对象,请在排除带前缀的对象部分中输入前缀,然后点击
添加前缀。
可选:如需为复制的对象设置存储类别,请从为复制的对象设置存储类别部分的相应菜单中选择一个存储类别。
如果您跳过此步骤,复制的对象默认使用目标存储桶的存储类别。
- 点击保存。
命令行
使用 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 时,您可以为现有存储桶创建复制作业。
安装并初始化 gcloud CLI,以便为
Authorization
标头生成访问令牌。或者,您可以使用 OAuth 2.0 Playground 创建访问令牌,并将其包含在
Authorization
标头中。创建一个 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
:永不覆盖目标存储桶中的对象
使用 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
安装并初始化 gcloud CLI,以便为
Authorization
标头生成访问令牌。或者,您可以使用 OAuth 2.0 Playground 创建访问令牌,并将其包含在
Authorization
标头中。使用 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 控制台中,进入 Cloud Storage 存储桶页面。
在存储桶列表中,点击您要查看其跨存储桶复制作业的源存储桶的名称。
在存储桶详情页面上,点击配置标签页。
找到跨存储桶复制选项,然后点击
修改。系统会显示修改跨存储桶复制窗格,其中显示了每个目标存储桶的复制作业。
在存储桶页面上,您可以查看复制列,该列显示了存储桶是否正在运行增强型复制作业或跨存储桶复制作业。如需了解如何显示复制列,请参阅显示列。
命令行
使用 gcloud alpha transfer jobs describe
命令:
gcloud alpha transfer jobs describe JOB_NAME
您需要进行如下替换:
- 将
JOB_NAME
替换为复制作业的唯一 ID。例如1234567890
。如需查找转移作业的 ID,请列出您的复制作业。
REST API
JSON API
安装并初始化 gcloud CLI,以便为
Authorization
标头生成访问令牌。或者,您可以使用 OAuth 2.0 Playground 创建访问令牌,并将其包含在
Authorization
标头中。使用
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 控制台中,进入 Cloud Storage 存储桶页面。
在存储桶列表中,点击您要暂停或解除暂停复制的源存储桶的名称。
在存储桶详情页面上,点击配置标签页。
找到跨存储桶复制选项,然后点击
修改。在显示的修改跨存储桶复制窗格中,点击您要更新的复制作业旁边的
暂停或 解除暂停。
命令行
将 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
您需要进行如下替换:
REST API
JSON API
安装并初始化 gcloud CLI,以便为
Authorization
标头生成访问令牌。或者,您可以使用 OAuth 2.0 Playground 创建访问令牌,并将其包含在
Authorization
标头中。创建一个包含以下结构的 JSON 文件,其中包含您要更新的
TransferJob
对象的字段:{ "projectId": string, "transferJob": { object (TransferJob) }, "updateTransferJobFieldMask": UPDATE_MASK }
其中:
object (TransferJob)
会替换为您要更新的复制作业的字段。如需了解详情,请参阅TransferJob
资源表示法。UPDATE_MASK
是您要更新的字段名称的英文逗号分隔列表。可以是以下一个或多个值:description
、transferSpec
、notificationConfig
、loggingConfig
、status
。
如需详细了解可以包含的字段名称,请参阅
transferJobs.patch
请求正文。使用 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 控制台中,进入 Cloud Storage 存储桶页面。
在存储桶列表中,点击您要停止复制的源存储桶的名称。
在存储桶详情页面上,点击配置标签页。
找到跨存储桶复制选项,然后点击
修改。在显示的修改跨存储桶复制窗格中,点击您要删除的复制作业旁边的
删除。在显示的对话框中,点击确认。
命令行
使用 gcloud alpha transfer jobs delete
命令:
gcloud alpha transfer jobs delete JOB_NAME
您需要进行如下替换:
- 将
JOB_NAME
替换为复制作业的唯一 ID。例如1234567890
。如需查找复制作业的 ID,请列出复制作业。
REST API
JSON API
安装并初始化 gcloud CLI,以便为
Authorization
标头生成访问令牌。或者,您可以使用 OAuth 2.0 Playground 创建访问令牌,并将其包含在
Authorization
标头中。使用 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,请列出复制作业。
- 将