You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python执行GCS跨地域传输时遇'Failed to rewrite object'错误

解决Storage Transfer Job跨地域复制时的PERMISSION_DENIED错误

看起来你遇到的是Storage Transfer Service在执行跨地域对象重写时的权限问题,虽然你已经给服务账号加了常规的读写权限,但可能漏了几个关键的配置点,我来一步步帮你排查:

1. 先确认你给对了服务账号权限

Storage Transfer Service默认使用Google托管的服务账号,而不是你自己创建的服务账号,很多人在这里会搞错。这个账号的格式是:

service-{你的项目编号}@gcp-sa-storagetransfer.iam.gserviceaccount.com

你可以用这条命令获取项目编号:

gcloud projects describe YOUR_PROJECT_ID --format="value(projectNumber)"

拿到编号后,去云控制台的IAM页面搜索这个账号,确认你给它加了权限,而不是其他账号。

2. 补充必要的权限

跨地域复制对象需要的权限不止基础的读写,还需要这些:

  • 源存储桶:
    • 至少需要Storage Object Viewer角色(包含storage.objects.list、storage.objects.get),再加上Storage Bucket Viewer角色(获取桶配置的权限storage.buckets.get,这个很容易被忽略)
  • 目标存储桶:
    • 因为你开启了overwriteObjectsAlreadyExistingInSink: True,所以需要Storage Object Admin角色(包含创建、删除对象的权限,满足覆盖需求)
      如果用细粒度权限的话,对应是:
  • 源桶:storage.objects.list、storage.objects.get、storage.buckets.get
  • 目标桶:storage.objects.create、storage.objects.delete、storage.objects.list

3. 检查组织政策限制

如果你的项目属于某个组织,可能有组织政策禁止跨地域移动对象:

  1. 登录云控制台,进入「IAM与管理」>「组织政策」
  2. 搜索「Restrict cross-region movement of storage objects」政策
  3. 如果政策是「强制」状态,检查你的源地域和目标地域是否在允许的列表里,或者联系组织管理员调整政策

4. 验证对象级ACL权限

如果源桶里的对象有自定义ACL(没有继承桶的权限),那么即使桶权限正确,服务账号也可能无法读取对象:

  • 查看单个对象的ACL:
    gsutil acl get gs://source_bucket/file1
    
  • 给服务账号添加读取权限:
    gsutil acl ch -u service-{你的项目编号}@gcp-sa-storagetransfer.iam.gserviceaccount.com:R gs://source_bucket/file1
    
  • 批量给所有对象添加权限:
    gsutil -m acl ch -r -u service-{你的项目编号}@gcp-sa-storagetransfer.iam.gserviceaccount.com:R gs://source_bucket/
    

完成这些步骤后,重新运行你的transfer job,应该就能解决权限拒绝的问题了。

内容的提问来源于stack exchange,提问作者rdk77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:23:01