Террасный условный блок на основе среды

Я собираюсь использовать новые условные выражения в 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