是否可以通过 environment_name 变量打开和关闭 access_logs 块?

Is it possible to turn the access_logs block on and off via the environment_name variable?

我正在考虑使用 Terraform v0.11 中的 new conditionals 基本上根据环境打开或关闭配置块。

这是我想变成条件的块,例如,如果我有一个变量要打开用于生产。

access_logs {
    bucket = "my-bucket"
    prefix = "${var.environment_name}-alb"
}

我想我有检查环境条件的逻辑,但我不知道如何将上面的配置粘贴到逻辑中。

"${var.environment_name == "production" ? 1 : 0 }"

是否可以通过 environment_name 变量打开和关闭 access_logs 块?如果这不可能,是否有解决方法?

terraform 中的条件目前仅用于确定一个值,不能用作包装块的 if 语句。

And you can also use conditionals to determine a value based on some logic.

https://www.terraform.io/docs/configuration/interpolation.html#conditionals

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

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

access_logs {
    bucket  = "my-bucket"
    prefix  = "${var.environment_name}-alb"
    enabled = "${var.environment_name == "production" ? true : false }"
}

另请参阅:

从 TF 0.12 开始实现此目的的一种方法是使用 dynamic blocks:

dynamic "access_logs" {
  for_each = var.environment_name == "production" ? [var.environment_name] : []
  content {
    bucket  = "my-bucket"
    prefix  = "${var.environment_name}-alb"
  }
}

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

扩展 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"
  }
}

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

也扩展了 Juho Rutila 的回答;对于这个用例,我喜欢使用 range 函数:

dynamic "access_logs" {
  for_each = range(var.environment_name == "production" ? 1 : 0)

  contents {
    bucket  = "my-bucket"
    prefix  = "${var.environment_name}-alb"
  }
}

range(n) 生成一个 n 元素列表。