У меня есть модуль для служебных учетных записей в GCP, который используется для заполнения секретов kubernetes
Вот мой модуль
resource "google_service_account" "service_account" {
count = var.enabled ? 1 : 0
account_id = var.account_id
display_name = var.display_name
}
resource "google_project_iam_member" "service_account_roles" {
count = var.enabled ? length(var.roles) : 0
role = "roles/${element(var.roles, count.index)}"
member = "serviceAccount:${google_service_account.service_account[0].email}"
}
resource "google_service_account_key" "service_account_key" {
count = var.enabled ? 1 : 0
service_account_id = google_service_account.service_account[0].name
}
'output.tf' содержит следующее
output "private_decoded_key" {
value = base64decode(
element(
concat(
google_service_account_key.service_account_key.*.private_key,
[""],
),
0,
),
)
description = "The base 64 decoded version of the credentials"
}
Поскольку существует условие, что ни один из этих ресурсов не создается без флага enabled
, мне пришлось обрабатывать его в TF 0.11.14 таким образом, и инструмент автообновления tf0.12 не внес много изменений.
Как я могу упростить это в Terraform 0.12.24, я попытался изменить вывод просто на
value = base64decode(google_service_account_key.service_account_key[0].private_key)
Но проблема в том, что если соответствующий кластер kubernetes удаляется во время удаления, и на полпути есть ошибки, потому что terraform, я не смогу очистить состояние terraform остальных ресурсов, используя `terraform destroy '
Попытки преобразовать count
в for_each
, как показано ниже, дали мне следующие ошибки
resource "google_service_account" "service_account" {
# count = var.enabled ? 1 : 0
for_each = var.enabled ? 1 : 0
account_id = var.account_id
display_name = var.display_name
}
resource "google_project_iam_member" "service_account_roles" {
# count = var.enabled ? length(var.roles) : 0
for_each = var.enabled ? toset(var.roles) : 0
# role = "roles/${element(var.roles, count.index)}"
role = "roles/${each.value}"
member = "serviceAccount:${google_service_account.service_account[0].email}"
}
for_each = var.enabled ? toset(var.roles) : 0
The true and false result expressions must have consistent types. The given
expressions are set of dynamic and number, respectively.
Что я не так делаю выше?