基于环境的Terraform条件块

jmr*_*cha 20 if-statement conditional-statements terraform

我正在考虑在Terraform 中使用新的条件基本上打开或关闭配置块取决于evnironment.

这是我想要成为条件的块,例如,我有一个变量可以打开生产.

access_logs {
    bucket = "my-bucket"
    prefix = "${var.environment_name}-alb"
}
Run Code Online (Sandbox Code Playgroud)

我认为我有条件检查环境的逻辑,但我不知道如何将上述配置粘贴到逻辑中.

"${var.environment_name == "production" ? 1 : 0 }"
Run Code Online (Sandbox Code Playgroud)

是否可以access_logs通过environment_name变量打开和关闭块?如果无法做到这一点,是否有解决方法?

min*_*oyo 16

在当前的terraform中,if语句只是一个值,不能用于块.

在这种情况下有一种解决方法.您可以将块的enabled属性设置access_logfalse.请注意,这不是一般解决方案,但只能与access_log块一起使用.

access_logs {
    bucket  = "my-bucket"
    prefix  = "${var.environment_name}-alb"
    enabled = "${var.environment_name == "production" ? true : false }"
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 在某些资源中,您可以通过将 count 设置为 0 或 1 的值来获得类似的效果。 (2认同)

Juh*_*ila 12

从TF 0.12开始,实现此目的的一种方法是使用动态块:

dynamic "access_logs" {
  for_each = var.environment_name == "production" ? [var.environment_name] : [] 
  bucket  = "my-bucket"
  prefix  = "${var.environment_name}-alb"
}
Run Code Online (Sandbox Code Playgroud)

这将创建一个或零个access_logs块,具体取决于var.environment_name的值。

  • 我必须将属性包装在“内容”块中,否则效果很好!`内容{bucket =“my-bucket”前缀=“$ {var.environment_name}-alb”}` (2认同)

Lit*_*ike 5

扩展Juho Rutila的答案,因为它太多了,无法评论。

使用来自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"
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关动态块的更多信息:https : //www.terraform.io/docs/configuration/expressions.html#dynamic-blocks