在GCP中用Terraform创建组织级文件夹遇权限及API报错咨询
场景与代码
已创建名为terraform的文件夹及拥有其所有者权限的服务账号,并在组织层级为该账号配置了所有者权限,尝试通过Terraform 1.3.4在GCP组织下创建名为department1的文件夹,Terraform代码如下:
# Top-level folder under an organization. resource "google_folder" "department1" { parent = "organizations/70497122" display_name = "department1" } provider "google" { #project = "terraform-project-0" #region = "us-central1" credentials = file("c:/terraform/credentials/terraform-day1.json") }
报错信息
执行时出现403错误,提示一个不存在的项目未启用Cloud Resource Manager API,报错内容如下:
Error: Error creating folder 'department1' in 'organizations/70497122': googleapi: Error 403: Cloud Resource Manager API has not been used in project 1003453129743 before or it is disabled. Enable it by visiting ... then retry.
Details:
[
{
"@type": "type.googleapis.com/google.rpc.Help",
"links": [
{
"description": "Google developers console API activation",
"url": "..."
}
]
},
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"domain": "googleapis.com",
"metadata": {
"consumer": "projects/1003453129743",
"service": "cloudresourcemanager.googleapis.com"
},
"reason": "SERVICE_DISABLED"
}
]
, accessNotConfiguredwith google_folder.department1,
on main.tf line 5, in resource "google_folder" "department1":
5: resource "google_folder" "department1" {
问题解答
1. 组织层级为服务账号分配roles/resourcemanager.folderCreator权限的步骤
- 打开GCP控制台的组织层级IAM页面
- 点击页面顶部的「添加」按钮
- 在「新成员」输入框中填入目标服务账号的完整邮箱(格式如:
terraform@[你的组织ID].iam.gserviceaccount.com) - 在「角色」下拉搜索框中输入
Folder Creator,选择「Resource Manager > Folder Creator」角色 - 点击「保存」完成权限分配
2. 不存在项目的误导性报错原因
报错中的项目ID是GCP内部的默认消费者项目,当Terraform调用组织层级的API但未在provider中指定关联项目时,GCP会自动绑定这个隐藏的内部项目作为API调用的载体,而这个内部项目默认未启用Cloud Resource Manager API,因此报错里的项目并非你实际使用的项目,属于GCP API调用机制导致的误导提示。
3. 解决报错并成功创建组织级文件夹的方法
核心是给Google Provider指定一个已存在且启用了Cloud Resource Manager API的GCP项目(该项目仅作为API调用的载体,无需与文件夹创建有直接关联),具体操作:
- 选取一个你拥有权限的已存在GCP项目(比如代码中注释的
terraform-project-0) - 在GCP控制台中为该项目启用Cloud Resource Manager API
- 修改Terraform的provider配置,取消注释
project = "terraform-project-0"这一行,确保provider有明确的项目关联 - 重新执行
terraform init、terraform plan、terraform apply
内容的提问来源于stack exchange,提问作者d.s

