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

If statement 是否可以通过environment_name变量打开和关闭access_logs块?,if-statement,conditional-statements,terraform,If Statement,Conditional Statements,Terraform,我正在考虑使用Terraform v0.11中的基本上根据EVNIR环境打开或关闭配置块 这里是我想变成条件的块,例如,如果我有一个变量要为生产打开 access_logs { bucket = "my-bucket" prefix = "${var.environment_name}-alb" } 我认为我有检查环境条件的逻辑,但我不知道如何将上述配置粘贴到逻辑中 "${var.environment_name == "production" ? 1 : 0 }" 是否可以

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

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

access_logs {
    bucket = "my-bucket"
    prefix = "${var.environment_name}-alb"
}
我认为我有检查环境条件的逻辑,但我不知道如何将上述配置粘贴到逻辑中

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

是否可以通过
environment\u name
变量打开和关闭
access\u logs
块?如果这是不可能的,是否有解决办法?

terraform中的条件当前仅用于确定值,而不是用作包装块的
语句

您还可以使用条件根据某些逻辑确定值


在当前地形中,
if
语句只是一个值,不能用于块

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

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


TF 0.12以后实现这一点的一种方法是使用动态块:

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

这将根据var.environment\u name的值创建一个或零访问日志块。

扩展Juho Rutila的答案,因为它太多,无法放入注释中

这可以使用v0.12中的动态块,但我发现属性必须包含在嵌套的
内容
块中。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"
  }
}

您可以在这里阅读有关动态块的更多信息:

也扩展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元素列表。

不错,看起来我在我的用例中很幸运。有些资源可以通过将count设置为0或1来获得类似的效果。我必须将属性包装在
content
块中,否则效果很好
content{bucket=“my bucket”prefix=“${var.environment_name}-alb”}
我不能以类似的方式对aws资源使用count属性来表示它们是否应该存在于环境中(产生count eq 1)或者不存在(产生count eq 0)?这绝对是标准的方法。与这个关于动态配置块的问题相比,它不那么令人困惑,因为它只是一个普通的
count=0或1
语句,而不是
for_each
,其中数组长度决定生成什么(空,或长度1)