google-cloud-platform - 如何在 Terraform 中引用现有的组织文件夹或其他资源(对于 GCP)
问题描述
我对 Terraform 很陌生,如果这个问题有一个明显的答案,我很抱歉。
我正在尝试为现有组织创建一个 terraform 配置文件。除了该组织中已经存在的文件夹外,我可以在main.tf
下面概述的情况下配置我拥有的所有内容。Shared
相关的github问题:
以下是我遵循的步骤:
Shared
在组织管理 UI 中手动创建文件夹。- 在文件夹的根目录下手动创建一个Terraform 管理项目 。
<redacted-project-name>
Shared
- 手动创建一个
terraform@<redacted-project-name>
从terraform admin 项目命名的服务帐户 terraform@<redacted-project-name>
为服务帐户创建、下载和安全存储密钥。- 在terraform 管理项目中启用 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 配置文件中包含现有资源?
- 对于(组织)文件夹(例如上面的示例)
- 对于结算帐号
- 对于项目,即我应该在 ? 中声明或导入terraform管理项目
main.tf
? - 对于服务帐户,如何处理正在运行的帐户的现有密钥和权限
terraform apply
- 对于现有策略和启用 API
解决方案
为了在 terraform 模板中包含已经存在的资源,请使用import
语句。
对于文件夹
在google_folder 的 Terraform 文档中:
# Both syntaxes are valid
$ terraform import google_folder.department1 1234567
$ terraform import google_folder.department1 folders/1234567
所以对于上面的例子,
- 使用提供组织 ID获取文件夹ID。
gcloud alpha resource-manager folders list --organization=<redacted_org_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.