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

标签 google-cloud-platform terraform terraform-provider-gcp

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

我正在尝试为现有组织创建 Terraform 配置文件。我能够提供我在 main.tf 中拥有的一切除 Shared 外概述如下此组织中已存在的文件夹。

相关github问题:

以下是我遵循的步骤:

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

  • 对于(组织)文件夹(如上例)
  • 对于计费帐户
  • 对于项目,即我是否应该在 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

所以对于上面的例子,

  1. 使用提供组织 ID 的 gcloud alpha resource-manager folders list --organization=<redacted_org_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. 确保您的基础设施已通过 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/

相关文章:

python - 如何通过 dev_appserver.py 在 Google App Engine 上使用 BeautifulSoup 和 lxml

java - Objectify 单元测试将数据持久保存到 Google Cloud Datastore

python - 谷歌云物联网 Python MQTT "out of memory"错误

amazon-web-services - Terraform 破坏 API 网关且 VPC 链接失败

amazon-web-services - 如何将 "aws_apigatewayv2_route"与 "aws_apigatewayv2_integration"链接起来?

google-cloud-platform - 使用Terraform,如何在不破坏实例的情况下增加GCP实例的根磁盘

python - 自动上传训练数据标签 csv 和训练处理 AutoML Vision 图像分类中的模型

amazon-web-services - 如何使用 Terraform 为 AWS 指定 Dockerrun.aws.json

google-cloud-platform - 想要使用 terraform 在 GCP 中部署具有公共(public)可读存储对象权限的存储桶

terraform - 如何在同一个列表上迭代多个资源?