Используйте другое значение, если создан другой ресурс

# #google-cloud-platform #terraform #terraform-provider-gcp #terraform0.12

Вопрос:

У меня есть модуль терраформирования, который я хотел бы изменить. В настоящее время мой модуль создает учетную запись службы. Я хотел бы изменить его так, чтобы кто-то мог передать существующую учетную запись службы, или если она не передана, то модуль создает учетную запись службы, как это было бы изначально.

Первоначально моя учетная запись службы выглядела так:

 resource "google_service_account" "scheduler" {
  account_id = "${var.prefix}-scheduler"
  project    = var.project
}
 

Я добавил в свой variables.tf файл следующую переменную:

 variable "service_account_email" {
  default = null
  description = "Existing service account for running ... jobs.  If null a new service account will be created."
}
 

То, что я изначально думал сделать, это добавить несколько местных жителей

 locals {
  service_account_count = var.service_account_email == null ? 1 : 0
  service_account_email = var.service_account_email == null ? google_service_account.scheduler.email : var.service_account_email
}
 

Тогда я мог бы изменить свою учетную запись службы, чтобы она выглядела так

 resource "google_service_account" "scheduler" {
  count = local.service_account_count
  account_id = "${var.prefix}-scheduler"
  project    = var.project
}

 

И затем, куда бы я ни ссылался google_service_account.scheduler.email , я могу вместо этого ссылаться local.service_account_email .. Однако, похоже, я не в состоянии это сделать по нескольким причинам.

Я получаю следующую ошибку, если пытаюсь использовать блок locals, упомянутый выше:

 │ Because google_service_account.scheduler has "count" set, its attributes must be accessed on specific instances.
│ 
│ F`or example, to correlate with indices of a referring resource, use:
│     google_service_account.scheduler[count.index]
╵
 

Если я изменю его так, чтобы использовать google_service_account.scheduler[count.index].email вместо этого, я получу следующую ошибку:

 │ Because google_service_account.scheduler has "count" set, its attributes must be accessed on specific instances.
│ 
│ For example, to correlate with indices of a referring resource, use:
│     google_service_account.scheduler[count.index]
╵
 

Теперь я как бы застрял, потому что я не могу заставить какие-либо ресурсы, на которые изначально ссылались google_service_account.scheduler.email бы, вместо этого ссылаться на var.service_account_email переменную, которая передается в тех случаях, когда мы предпочли бы использовать существующую учетную запись службы.

Ответ №1:

Поскольку вы используете count , вы должны использовать [0] для доступа к своему ресурсу:

 service_account_email = var.service_account_email == null ? google_service_account.scheduler[0].email : var.service_account_email