У меня есть список переменных среды, которые я хочу сделать доступными для экземпляров Google Cloud Run (1 служба, 4 задания).
Переменные среды широко распределяются между этими заданиями, и если мне нужно добавить/изменить/удалить какую-либо из них, мне нужно сделать это 5 раз, очевидно, это создает возможности для возникновения ошибок, и я много повторяюсь.
Я подумал о переменной, содержащей все эти значения, а затем распаковал их в раздел containers
объявления terraform.
resource "google_cloud_run_v2_job" "example_cloud_run_job" {
# project, location, name, dependency info in here
template {
# template info such as parallelism and task count here
template {
# more info in here
containers {
# image, networking info, resources in here, but also a lot of environment variables!
env {
name = "foo"
value = var.bar
}
env {
name = "baz"
value = var.qux
}
env {
name = "quux"
value = var.corge
}
env {
name = "grault"
value = var.garply
}
}
}
}
}
Я надеюсь, что смогу что-нибудь сделать, чтобы распаковать эти переменные в объект containers
, аналогично тому, как мы могли бы сделать это в JavaScript/Typescript с помощью оператора ...
или с помощью оператора *
в Python. Я не могу найти это в документации Terraform и уверен, что я не первый, кто столкнулся с этой проблемой!
Я читал документацию и немного поигрался с кодом, но не нашел надежного подхода к этому.
Что вы можете сделать, так это использовать метааргумент for_each в сочетании с Dynamic. Вам также потребуется создать переменную, которая будет использоваться для перебора:
variable "env_vars" {
type = map(string)
description = "Map of environment variables."
default = {
foo = "some value"
baz = "some value"
quux = "some value"
grault = "some value"
}
}
resource "google_cloud_run_v2_job" "example_cloud_run_job" {
# project, location, name, dependency info in here
template {
# template info such as parallelism and task count here
template {
# more info in here
containers {
dynamic "env" {
for_each = var.env_vars
content {
name = env.key
value = env.value
}
}
}
}
}
}
Это определенно похоже на ответ на истинный вопрос выше. Текущее содержание вопроса подразумевает, что type
в настоящее время может быть list(map(string))
, и в этом случае его следует преобразовать в map(string)
, как показано в этом ответе для повышения эффективности.
Для меня это просто настоящее удовольствие! Я также адаптировал его для случаев, когда мы получаем переменные среды из секретов — я приму и обновлю ответ.
Аналогично в HCL2 TF есть оператор для преобразования в
tuple
(и это тоже...
), но неясно, как это связано с проблемой, которую вы пытаетесь здесь решить. Пожалуйста, продемонстрируйте это на примере ввода и желаемого результата.