如何在 Terraform 中引用现有组织文件夹或其他资源(适用于 GCP)

How to reference an existing organization folder, or other resources, in Terraform (For GCP)

我是 Terraform 的新手,如果这个问题有一个明显的答案,我很抱歉我错过了。

我正在尝试为现有组织创建 Terraform 配置文件。除了该组织中已存在的 Shared 文件夹外,我能够提供下面概述的 main.tf 中的所有内容。

相关 github 问题:

以下是我遵循的步骤:

  1. 在组织管理中手动创建 Shared 文件夹 UI。
  2. Shared 文件夹的根目录下手动创建 Terraform 管理项目 <redacted-project-name>
  3. terraform 管理项目
  4. 手动创建名为 terraform@<redacted-project-name> 的服务帐户
  5. terraform@<redacted-project-name> 服务帐户创建、下载并安全地存储密钥。
  6. terraform 管理项目[=66= 中启用 API:cloudresourcemanager.googleapis.comcloudbilling.googleapis.comiam.googleapis.comserviceusage.googleapis.com ]
  7. 设置服务账号权限为role/owner,roles/resourcemanager.organizationAdmin,roles/resourcemanager.folderAdminroles/resourcemanager.projectCreator.
  8. 创建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 配置文件中包含现有资源?

为了在 terraform 模板中包含已经存在的资源,请使用 import 语句。

对于文件夹

Terraform documentation for google_folder中:

# Both syntaxes are valid
$ terraform import google_folder.department1 1234567
$ terraform import google_folder.department1 folders/1234567

所以对于上面的例子,

  1. 使用 gcloud alpha resource-manager folders list --organization=<redacted_org_id> 提供组织 ID 获取 文件夹 ID
  2. 将文件夹 ID 保存在某处,如果尚未完成,请将文件夹声明为 main.tf 中的资源
    resource "google_folder" "shared" {
    display_name = "Shared"
    parent       = data.google_organization.org.name
    }
    
  3. 运行 命令:terraform import google_folder.shared folders/<redacted_folder_id>。您应该得到类似 google_folder.shared: Import prepared!
  4. 的输出
  5. 确保您的基础设施已通过 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.