首页 > 解决方案 > 如何在 Terraform 中引用现有的组织文件夹或其他资源(对于 GCP)

问题描述

我对 Terraform 很陌生,如果这个问题有一个明显的答案,我很抱歉。

我正在尝试为现有组织创建一个 terraform 配置文件。除了该组织中已经存在的文件夹外,我可以在main.tf下面概述的情况下配置我拥有的所有内容。Shared

相关的github问题:

以下是我遵循的步骤:

  1. Shared在组织管理 UI 中手动创建文件夹。
  2. 在文件夹的根目录下手动创建一个Terraform 管理项目<redacted-project-name>Shared
  3. 手动创建一个terraform@<redacted-project-name>terraform admin 项目命名的服务帐户
  4. terraform@<redacted-project-name>为服务帐户创建、下载和安全存储密钥。
  5. terraform 管理项目中启用 API : cloudresourcemanager.googleapis.com, cloudbilling.googleapis.com, iam.googleapis.com,serviceusage.googleapis.com
  6. 将服务帐户的权限设置为role/ownerroles/resourcemanager.organizationAdminroles/resourcemanager.folderAdminroles/resourcemanager.projectCreator
  7. 创建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 配置文件中包含现有资源?

标签: google-cloud-platformterraformterraform-provider-gcp

解决方案


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

对于文件夹

google_folder 的 Terraform 文档中

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

所以对于上面的例子,

  1. 使用提供组织 ID获取文件夹ID。gcloud alpha resource-manager folders list --organization=<redacted_org_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. 确保您的基础架构通过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.
    

推荐阅读