Вычисляемые атрибуты не могут быть установлены : org_id

#terraform #terraform-provider-gcp

Вопрос:

Я учусь использовать Терраформирование. Моя цель-развернуть архитектуру на GCP, так что вот мой 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" {
  domain                = var.organization.display_name
  org_id                = var.organization.id
  directory_customer_id = var.organization.directory_customer_id
}
resource "google_folder" "shared" {
  display_name = "Shared"
  parent       = google_organization.org_id
}

resource "google_folder" "ddm" {
  display_name = "Data and Digital Marketing"
  parent       = google_folder.shared.name
}

resource "google_folder" "dtl" {
  display_name = "DTL"
  parent       = google_folder.ddm.name
}
 

Согласно документации, org_id находится в пределах ссылки на атрибуты

Но я получаю следующие ошибки:

 ╷
│ Error: Computed attributes cannot be set
│
│   with data.google_organization.org,
│   on main.tf line 17, in data "google_organization" "org":
│   17:   org_id                = var.organization.id
│
│ Computed attributes cannot be set, but a value was set for "org_id".
╵
╷
│ Error: Computed attributes cannot be set
│
│   with data.google_organization.org,
│   on main.tf line 18, in data "google_organization" "org":
│   18:   directory_customer_id = var.organization.directory_customer_id
│
│ Computed attributes cannot be set, but a value was set for "directory_customer_id".
╵
╷
│ Error: Reference to undeclared resource
│
│   on main.tf line 22, in resource "google_folder" "shared":
│   22:   parent       = google_organization.org_id
│
│ A managed resource "google_organization" "org_id" has not been declared in the root module.
 

Что я делаю не так?

Комментарии:

1. Я предполагаю, что вы можете быть после импорта существующего идентификатора организации в Terraform? Вы пытаетесь создать новую организацию или у вас уже есть существующая организация, и вы хотите создать ее в Terraform?

2. У меня есть существующая организация в terraform, но я хотел бы описать ее и иерархию папок в main.tf

3. @GrzegorzOledzki, честно говоря, я не уверен, что смогу сделать это с помощью учетной записи службы. Возможно, мне нужна терраформа «начальной загрузки», которая применяется через учетную запись суперадминистратора, которая импортирует организацию и создает структуру папок. Отдельно у меня был бы еще один, который создает проекты и ресурсы в рамках проектов с помощью учетной записи службы… а ты как думаешь?

Ответ №1:

Организация задана в качестве data источника, но в предыдущем коде она использовалась как resource блок.

Что нужно сделать, чтобы ссылаться на организацию, так это :

 data "google_organization" "org" {
  organization          = var.organization.id
}
 

org_id это выход, а не вход. Единственными приемлемыми входными данными являются organization или domain ; они взаимоисключающие.

И используйте его результаты таким образом :

 resource "google_folder" "shared" {
  display_name = "Shared"
  parent       = data.google_organization.org.org_id
}
 

ИЗМЕНИТЬ : Это, хотя и синтаксически правильно, может не сработать, поскольку используемая учетная запись должна быть администратором организации на уровне организации. Я не рекомендую использовать google_organization источник данных только для получения идентификатора и другой информации, в итоге я записал их в переменную и просто назвал ее так :

 resource "google_folder" "shared" {
  display_name = "Shared"
  parent       = "organizations/${var.organization.id}"
}