GCP服务账户可创建项目但无法读取项目的权限问题
GCP Terraform项目创建后刷新状态报403权限不足问题
环境与配置
GCP组织架构
mydomain.com - Root-project - Development - my-project-name
IAM配置
为实现Terraform自动化在Development文件夹创建项目,我在Root-project中创建了服务账户(SA),并在Development文件夹层级为该SA添加IAM主体,授予Project Creator与Project Deleter权限。
Terraform脚本
terraform { required_providers { google = { source = "hashicorp/google" version = "4.68.0" } } } provider "google" { scopes = [ "https://www.googleapis.com/auth/cloud-platform" ] } resource "google_project" "project" { name = var.project_name folder_id = var.folder_id project_id = var.project_id billing_account = var.billing_account_id }
问题现象
- 本地通过gcloud CLI使用个人账号或该服务账户认证时,Terraform脚本运行完全正常;
- 通过环境变量
GOOGLE_CREDENTIALS设置SA凭据后,首次运行可成功创建项目,但再次执行Terraform刷新状态时,抛出以下403错误:
Error: Error when reading or editing Project "my-project-id": googleapi: Error 403: Request had insufficient authentication scopes. │ Details: │ [ │ { │ "@type": "type.googleapis.com/google.rpc.ErrorInfo", │ "domain": "googleapis.com", │ "metadata": { │ "method": "google.cloudresourcemanager.v1.Projects.GetProject", │ "service": "cloudresourcemanager.googleapis.com" │ }, │ "reason": "ACCESS_TOKEN_SCOPE_INSUFFICIENT" │ } │ ] │ │ More details: │ Reason: insufficientPermissions, Message: Insufficient Permission
我已在my-project-name项目的IAM中给该SA授予Owner角色,无法理解为何能创建项目却无法读取项目数据。
问题原因
核心矛盾在于创建项目与读取项目元数据的权限要求存在差异:
- 项目创建依赖的是
Development文件夹层级的Project Creator权限,该权限足够调用Projects.Create接口完成创建; - 刷新状态时Terraform调用
Projects.GetProject接口读取项目详情,此时存在几个可能的问题:- 权限生效层级问题:
Projects.GetProject接口的权限校验不仅会检查项目层级权限,还会验证调用者在文件夹/组织层级是否拥有读取项目元数据的权限。仅靠项目层级的Owner角色,跨项目SA调用时可能无法通过校验; - Scope覆盖问题:部分场景下,
GOOGLE_CREDENTIALS对应的SA密钥文件自带默认Scope限制,即使Terraform Provider中指定了cloud-platformScope,也可能被凭据本身的Scope覆盖; - 权限同步延迟:GCP IAM权限变更存在几分钟的同步延迟,若刚添加Owner角色就执行刷新,权限可能未完全生效。
- 权限生效层级问题:
解决方法
针对上述原因,可尝试以下方案:
- 添加文件夹层级读取权限:给该SA在
Development文件夹层级添加Resource Manager Viewer角色,该角色包含resourcemanager.projects.get权限,确保SA能读取文件夹下所有项目的元数据; - 强制验证Scope与凭据:
- 确认Terraform Provider的
scopes配置未被其他环境变量(如GOOGLE_OAUTH_ACCESS_TOKEN)覆盖; - 手动生成带
cloud-platformScope的访问令牌,验证是否能正常调用Projects.GetProject接口:gcloud auth activate-service-account --key-file=your-sa-key.json gcloud auth print-access-token --scopes=https://www.googleapis.com/auth/cloud-platform # 替换<token>后执行以下命令测试 curl -H "Authorization: Bearer <token>" https://cloudresourcemanager.googleapis.com/v1/projects/my-project-id
- 确认Terraform Provider的
- 等待权限同步:若刚添加Owner角色,等待5-10分钟后再执行Terraform刷新操作;
- 重新生成SA密钥:若原SA密钥存在Scope限制,重新生成无Scope限制的密钥文件,替换
GOOGLE_CREDENTIALS的值。
内容的提问来源于stack exchange,提问作者Hervé
相关产品推荐
相关产品推荐

