本页面简要介绍了跨存储桶复制,并提供了有关如何使用此功能的说明。
跨存储桶复制概览
在某些情况下,您可能希望将数据从一个 Cloud Storage 存储桶复制到另一个存储分区。跨存储桶复制会将新对象和更新后的对象从源存储桶异步复制到目标存储桶。
跨存储桶复制与默认复制和增强型复制不同,因为您的数据存在于两个存储桶中,每个存储桶都有自己的配置,例如存储位置、加密、访问权限和存储类别。因此,跨存储桶复制不仅能提供数据恢复和可用性,还适合:
- 数据主权:跨地理位置相距较远的区域维护数据。
- 分别维护开发版本和生产版本:创建不同的存储桶和命名空间,以免开发工作影响您的生产工作负载。
- 共享数据:将数据复制到供应商或合作伙伴拥有的存储桶。
- 数据汇总:将不同存储桶中的数据合并到一个存储桶中,以运行分析工作负载。
- 管理费用、安全性和合规性:在不同的所有权、存储类别和保留期限下维护数据。
跨存储桶复制使用 Storage Transfer Service 来复制对象,并使用 Pub/Sub 在源存储桶和目标存储桶发生更改时发出提醒。您可以在您创建的新存储桶和现有存储桶上启用跨存储桶复制。大多数对象可以在几分钟内复制完成,但大于 1 GiB 的对象可能需要数小时。
限制
分层命名空间存储桶不支持跨存储桶复制。
源存储桶中的对象删除操作不会复制到目标存储桶。
系统不会复制对象生命周期配置。
复制对象后,系统不会保留时间戳元数据(例如
timeCreated
和timeUpdated
)。如需详细了解元数据保留,请参阅在 Cloud Storage 存储桶之间转移数据。由于跨存储桶复制可用于在位于任何 Google Cloud 位置的存储桶之间复制数据,跨存储桶复制的性能因所选位置而异。因此,跨存储桶复制不提供恢复点目标 (RPO)。
准备工作
在开始之前,请完成以下步骤。
启用 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 与存储桶搭配使用。 如需了解如何授予项目的角色,请参阅管理对项目的访问权限。
授予必需的角色
跨存储桶复制使用 Storage Transfer Service 将对象从源存储桶复制到目标存储桶,并使用 Pub/Sub 接收有关源存储桶更改的通知。
为了让跨存储桶复制功能可以使用这些服务,您必须向 Storage Transfer Service 用于复制数据的服务账号以及 Pub/Sub 用于写入通知的服务代理授予所需权限。
为 Storage Transfer Service 授予所需的角色
如需使用 Storage Transfer Service 复制数据,您可以向以下两个服务账号之一授予所需权限:
Storage Transfer Service 服务代理,由 Google 自动创建和管理。此服务代理的电子邮件地址遵循命名格式
project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com
。您可以使用 Storage Transfer ServicegoogleServiceAccounts.get
API 获取 Storage Transfer Service 服务代理的电子邮件地址。用户代管式服务账号。此服务账号的电子邮件地址遵循命名格式
SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
。您可以创建自己的服务账号并授予必要权限来复制数据。
Storage Transfer Service 服务代理或用户服务账号需要以下权限才能复制对象并为源存储桶设置 Pub/Sub 通知:
所需权限
必须在源项目中授予以下权限:
pubsub.topics.create
pubsub.subscriptions.create
pubsub.subscriptions.consume
iam.serviceAccounts.actAs
如果您使用的是用户代管式服务账号。对于 Storage Transfer Service 服务代理,此角色不是必需的。
必须在源存储桶上授予以下权限:
storage.buckets.get
storage.buckets.update
storage.objects.get
必须向目标存储桶授予以下权限:
storage.buckets.get
storage.objects.create
storage.objects.get
您可以通过自定义角色或授予以下所有预定义角色来授予这些权限:
- 源项目的 Pub/Sub Editor (
roles/pubsub.editor
) 角色 - 源存储桶上的 Storage Legacy Bucket Owner (
roles/storage.legacyBucketOwner
) 和 Storage Object Viewer (roles/storage.objectViewer
) 角色 - 目标存储桶上的 Storage Legacy Bucket Writer (
roles/storage.legacyBucketWriter
) 和 Storage Object Viewer (roles/storage.objectViewer
) 角色 - 如果您使用的是用户代管式服务账号,则需要源项目中的 Service Account Token Creator (
roles/iam.serviceAccountTokenCreator
) 角色。对于 Storage Transfer Service 服务代理,此角色不是必需的。
为 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 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 时,您可以为现有存储分区创建复制作业。
安装并初始化 gcloud CLI,以便为
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 控制台列出复制作业,请参阅使用 Google Cloud 控制台列出复制作业。
命令行
使用带有 --job-type
标志的 gcloud alpha transfer jobs list
命令:
gcloud alpha transfer jobs list --job-type=replication
REST API
JSON API
安装并初始化 gcloud CLI,以便为
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 控制台查看复制作业,请参阅使用 Google Cloud 控制台查看复制作业。
命令行
使用 gcloud alpha transfer jobs describe
命令:
gcloud alpha transfer jobs describe JOB_NAME
您需要进行如下替换:
- 将
JOB_NAME
替换为复制作业的唯一 ID。例如1234567890
。如需查找转移作业的 ID,请列出复制作业。
REST API
JSON API
安装并初始化 gcloud CLI,以便为
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 控制台更新复制作业。
命令行
将 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
标头生成访问令牌。创建一个 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 控制台删除复制作业,请参阅使用 Google Cloud 控制台删除复制作业。
命令行
使用 gcloud alpha transfer jobs delete
命令:
gcloud alpha transfer jobs delete JOB_NAME
您需要进行如下替换:
- 将
JOB_NAME
替换为复制作业的唯一 ID。例如1234567890
。如需查找复制作业的 ID,请列出复制作业。
REST API
JSON API
安装并初始化 gcloud CLI,以便为
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,请列出复制作业。
- 将