Террасный условный блок на основе среды
Я собираюсь использовать новые условные выражения в Terraform v0.11, чтобы включить или выключить блок конфигурации в зависимости от среды.
Вот блок, который я хотел бы превратить в условный, если, например, у меня есть переменная, которую нужно включить для производства.
access_logs {
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
}
Я думаю, что у меня есть логика для проверки условной среды, но я не знаю, как вставить вышеуказанную конфигурацию в логику.
"${var.environment_name == "production" ? 1 : 0 }"
Можно ли включать и выключать блок access_logs
с помощью переменной environment_name
? Если это невозможно, есть ли обходной путь?
Ответы
Ответ 1
В текущем terraform оператор if
является только значением и не может использоваться для блока.
В этом случае есть обходной путь. Вы можете установить для enabled
атрибута блока access_log
значение false
. Обратите внимание, что это не общее решение, но его можно использовать только с блоком access_log
.
access_logs {
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
enabled = "${var.environment_name == "production" ? true : false }"
}
Смотрите также:
Ответ 2
Один из способов добиться этого с TF 0.12 и выше - это использовать динамические блоки:
dynamic "access_logs" {
for_each = var.environment_name == "production" ? [var.environment_name] : []
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
}
Это создаст один или ноль блоков access_logs в зависимости от значения var.environment_name.
Ответ 3
Подробно расскажу о Юхо Рутиле, поскольку это слишком много, чтобы уместиться в комментарии.
Это возможно при использовании динамических блоков из v0.12, но я обнаружил, что свойства должны были быть включены во вложенный блок content
. Оператор for_each
также немного сложен, поэтому я счел целесообразным извлечь его в локальный каталог, чтобы сделать важные вещи более читабельными:
locals {
isProd = var.environment_name == "production" ? [1] : []
// Not necessary, but just illustrating that the reverse is possible
isNotProd = var.environment_name == "production" ? [] : [1]
}
dynamic "access_logs" {
for_each = local.isProd
content {
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
}
}
Вы можете узнать больше о динамических блоках здесь: https://www.terraform.io/docs/configuration/expressions.html#dynamic-blocks
Ответ 4
Условные в terraform в настоящее время используются только для определения значения, а не для использования в качестве оператора if
обертывает блок.
И вы также можете использовать условные выражения для определения значения на основе некоторой логики.
https://www.terraform.io/docs/configuration/interpolation.html#conditionals