我是 Terraform 的新手,如果这个问题有一个明显的答案我错过了,我很抱歉。
我正在尝试为现有组织创建 Terraform 配置文件。我能够提供我在 main.tf
中拥有的一切除 Shared
外概述如下此组织中已存在的文件夹。
相关github问题:
- The folder operation violates display name uniqueness within the parent.
- Generic error message when folder rename matches existing folder
以下是我遵循的步骤:
- 手动创建
Shared
组织管理 UI 中的文件夹。 - 手动创建Terraform 管理项目
<redacted-project-name>
在Shared
的根目录文件夹。 - 手动创建名为
terraform@<redacted-project-name>
的服务帐户来自 terraform 管理项目 - 为
terraform@<redacted-project-name>
创建、下载并安全地存储 key 服务帐户。 - 启用 API:
cloudresourcemanager.googleapis.com
,cloudbilling.googleapis.com
,iam.googleapis.com
,serviceusage.googleapis.com
在 terraform 管理项目 中
- 将服务帐户的权限设置为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
的帐户的现有 key 和权限 - 针对现有政策和启用 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
所以对于上面的例子,
- 使用提供组织 ID 的
gcloud alpha resource-manager folders list --organization=<redacted_org_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.
关于google-cloud-platform - 如何在 Terraform 中引用现有组织文件夹或其他资源(适用于 GCP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69405785/