如何在 Terraform 中引用现有组织文件夹或其他资源(适用于 GCP)
How to reference an existing organization folder, or other resources, in Terraform (For GCP)
我是 Terraform 的新手,如果这个问题有一个明显的答案,我很抱歉我错过了。
我正在尝试为现有组织创建 Terraform 配置文件。除了该组织中已存在的 Shared
文件夹外,我能够提供下面概述的 main.tf
中的所有内容。
相关 github 问题:
- The folder operation violates display name uniqueness within the parent.
- Generic error message when folder rename matches existing folder
以下是我遵循的步骤:
- 在组织管理中手动创建
Shared
文件夹 UI。
- 在
Shared
文件夹的根目录下手动创建 Terraform 管理项目 <redacted-project-name>
。
- 从 terraform 管理项目
手动创建名为 terraform@<redacted-project-name>
的服务帐户
- 为
terraform@<redacted-project-name>
服务帐户创建、下载并安全地存储密钥。
- 在 terraform 管理项目[=66= 中启用 API:
cloudresourcemanager.googleapis.com
、cloudbilling.googleapis.com
、iam.googleapis.com
、serviceusage.googleapis.com
]
- 设置服务账号权限为role/owner,roles/resourcemanager.organizationAdmin,roles/resourcemanager.folderAdmin 和 roles/resourcemanager.projectCreator.
- 创建
main.tf
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "3.85.0"
}
}
}
provider "google" {
credentials = file(var.credentials_file)
region = var.region
zone = var.zone
}
data "google_organization" "org" {
organization = var.organization.id
}
resource "google_folder" "shared" {
display_name = "Shared"
parent = data.google_organization.org.name
}
resource "google_folder" "ddm" {
display_name = "Data and Digital Marketing"
parent = data.google_organization.org.name
}
resource "google_folder" "dtl" {
display_name = "DTL"
parent = google_folder.ddm.name
}
我收到的错误:
Error: Error creating folder 'Shared' in 'organizations/<redacted-org-id>': Error waiting for creating folder: Error code 9, message: Folder reservation failed for parent [organizations/<redacted-org-id>], folder [] due to constraint: The folder operation violates display name uniqueness within the parent.
我如何在 terraform 配置文件中包含现有资源?
- 对于(组织)文件夹(如上例)
- 对于计费帐户
- 对于项目,即我是否应该在
main.tf
中声明或导入 terraform 管理项目?
- 对于服务帐户,如何处理 运行
terraform apply
帐户的现有密钥和权限
- 对于现有政策和启用 API
为了在 terraform 模板中包含已经存在的资源,请使用 import
语句。
对于文件夹
在Terraform documentation for google_folder中:
# Both syntaxes are valid
$ terraform import google_folder.department1 1234567
$ terraform import google_folder.department1 folders/1234567
所以对于上面的例子,
- 使用
gcloud alpha resource-manager folders list --organization=<redacted_org_id>
提供组织 ID 获取 文件夹 ID。
- 将文件夹 ID 保存在某处,如果尚未完成,请将文件夹声明为
main.tf
中的资源
resource "google_folder" "shared" {
display_name = "Shared"
parent = data.google_organization.org.name
}
- 运行 命令:
terraform import google_folder.shared folders/<redacted_folder_id>
。您应该得到类似 google_folder.shared: Import prepared!
的输出
- 确保您的基础设施已通过
terraform plan
更新。
No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration
and found no differences, so no changes are needed.
我是 Terraform 的新手,如果这个问题有一个明显的答案,我很抱歉我错过了。
我正在尝试为现有组织创建 Terraform 配置文件。除了该组织中已存在的 Shared
文件夹外,我能够提供下面概述的 main.tf
中的所有内容。
相关 github 问题:
- The folder operation violates display name uniqueness within the parent.
- Generic error message when folder rename matches existing folder
以下是我遵循的步骤:
- 在组织管理中手动创建
Shared
文件夹 UI。 - 在
Shared
文件夹的根目录下手动创建 Terraform 管理项目<redacted-project-name>
。 - 从 terraform 管理项目 手动创建名为
- 为
terraform@<redacted-project-name>
服务帐户创建、下载并安全地存储密钥。 - 在 terraform 管理项目[=66= 中启用 API:
cloudresourcemanager.googleapis.com
、cloudbilling.googleapis.com
、iam.googleapis.com
、serviceusage.googleapis.com
] - 设置服务账号权限为role/owner,roles/resourcemanager.organizationAdmin,roles/resourcemanager.folderAdmin 和 roles/resourcemanager.projectCreator.
- 创建
main.tf
terraform@<redacted-project-name>
的服务帐户
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "3.85.0"
}
}
}
provider "google" {
credentials = file(var.credentials_file)
region = var.region
zone = var.zone
}
data "google_organization" "org" {
organization = var.organization.id
}
resource "google_folder" "shared" {
display_name = "Shared"
parent = data.google_organization.org.name
}
resource "google_folder" "ddm" {
display_name = "Data and Digital Marketing"
parent = data.google_organization.org.name
}
resource "google_folder" "dtl" {
display_name = "DTL"
parent = google_folder.ddm.name
}
我收到的错误:
Error: Error creating folder 'Shared' in 'organizations/<redacted-org-id>': Error waiting for creating folder: Error code 9, message: Folder reservation failed for parent [organizations/<redacted-org-id>], folder [] due to constraint: The folder operation violates display name uniqueness within the parent.
我如何在 terraform 配置文件中包含现有资源?
- 对于(组织)文件夹(如上例)
- 对于计费帐户
- 对于项目,即我是否应该在
main.tf
中声明或导入 terraform 管理项目? - 对于服务帐户,如何处理 运行
terraform apply
帐户的现有密钥和权限
- 对于现有政策和启用 API
为了在 terraform 模板中包含已经存在的资源,请使用 import
语句。
对于文件夹
在Terraform documentation for google_folder中:
# Both syntaxes are valid
$ terraform import google_folder.department1 1234567
$ terraform import google_folder.department1 folders/1234567
所以对于上面的例子,
- 使用
gcloud alpha resource-manager folders list --organization=<redacted_org_id>
提供组织 ID 获取 文件夹 ID。 - 将文件夹 ID 保存在某处,如果尚未完成,请将文件夹声明为
main.tf
中的资源resource "google_folder" "shared" { display_name = "Shared" parent = data.google_organization.org.name }
- 运行 命令:
terraform import google_folder.shared folders/<redacted_folder_id>
。您应该得到类似google_folder.shared: Import prepared!
的输出
- 确保您的基础设施已通过
terraform plan
更新。No changes. Your infrastructure matches the configuration. Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.