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

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角色,无法理解为何能创建项目却无法读取项目数据。

问题原因

核心矛盾在于创建项目与读取项目元数据的权限要求存在差异:

  1. 项目创建依赖的是Development文件夹层级的Project Creator权限,该权限足够调用Projects.Create接口完成创建;
  2. 刷新状态时Terraform调用Projects.GetProject接口读取项目详情,此时存在几个可能的问题:
    • 权限生效层级问题:Projects.GetProject接口的权限校验不仅会检查项目层级权限,还会验证调用者在文件夹/组织层级是否拥有读取项目元数据的权限。仅靠项目层级的Owner角色,跨项目SA调用时可能无法通过校验;
    • Scope覆盖问题:部分场景下,GOOGLE_CREDENTIALS对应的SA密钥文件自带默认Scope限制,即使Terraform Provider中指定了cloud-platform Scope,也可能被凭据本身的Scope覆盖;
    • 权限同步延迟:GCP IAM权限变更存在几分钟的同步延迟,若刚添加Owner角色就执行刷新,权限可能未完全生效。

解决方法

针对上述原因,可尝试以下方案:

  • 添加文件夹层级读取权限:给该SA在Development文件夹层级添加Resource Manager Viewer角色,该角色包含resourcemanager.projects.get权限,确保SA能读取文件夹下所有项目的元数据;
  • 强制验证Scope与凭据:
    1. 确认Terraform Provider的scopes配置未被其他环境变量(如GOOGLE_OAUTH_ACCESS_TOKEN)覆盖;
    2. 手动生成带cloud-platform Scope的访问令牌,验证是否能正常调用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
      
  • 等待权限同步:若刚添加Owner角色,等待5-10分钟后再执行Terraform刷新操作;
  • 重新生成SA密钥:若原SA密钥存在Scope限制,重新生成无Scope限制的密钥文件,替换GOOGLE_CREDENTIALS的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:07:50