无法通过API创建GCP存储传输作业:预条件检查失败
我来帮你捋捋这个FAILED_PRECONDITION(预条件检查失败)的问题——这种错误大多和权限、配置细节或者资源状态有关,结合你提到源和目标桶不在sample-project里,咱们从几个核心方向排查:
可能的原因及解决方法
1. Transfer Service专用服务账号权限不足
谷歌云的Storage Transfer Service会用一个专属的服务账号(格式是project-<你的项目编号>@storage-transfer-service.iam.gserviceaccount.com)来读写源和目标桶。因为你的桶不在作业所在的sample-project,这个服务账号大概率没被授权访问跨项目的桶:
- 给这个服务账号在源桶添加
Storage Object Viewer角色(需要storage.objects.list和storage.objects.get权限); - 在目标桶添加
Storage Object Creator角色(如果需要覆盖已有文件,再加Storage Object Admin); - 操作路径:云控制台→存储桶→权限→添加成员,输入上述服务账号邮箱,分配对应角色。
2. 源/目标桶的状态或配置异常
- 先确认源桶和目标桶都存在,桶名拼写完全正确(GCS桶名大小写不敏感,但要和创建时一致,别多打空格);
- 检查源桶有没有设置特殊的ACL或VPC服务控制策略,限制了外部服务账号的访问;
- 目标桶如果启用了保留策略(Retention Policy),要确保Transfer服务账号有绕过保留的权限,或者作业配置里没有要求删除目标桶的唯一文件。
3. API请求参数的细节错误
仔细核对你发送的JSON:
projectId必须是你用来创建Transfer作业的项目ID(也就是sample-project),不是源或目标桶所在的项目;- 检查
transferSpec里的gcsDataSource.bucketName和gcsDataSink.bucketName是否准确,有没有遗漏区域后缀(比如多区域桶不需要,但单区域桶的桶名本身不带区域,这点不用慌); - 如果设置了
transferOptions(比如deleteObjectsUniqueInSink),确认目标桶允许执行对应的操作(比如删除权限)。
4. 跨项目访问的额外限制
如果源或目标桶所在的项目启用了VPC Service Controls,需要把Transfer Service的服务账号添加到对应的访问允许列表里,否则会被拦截,触发预条件失败。
快速验证步骤
- 先找到你sample-project的Transfer服务账号:在云控制台→IAM与管理员→IAM,搜索
storage-transfer-service就能找到; - 手动给这个账号授权源和目标桶的权限;
- 重新提交API请求,看是否解决问题。
内容的提问来源于stack exchange,提问作者Matt Wilbert
相关产品推荐
相关产品推荐

