【问题标题】:Is it possible to turn the access_logs block on and off via the environment_name variable?是否可以通过 environment_name 变量打开和关闭 access_logs 块?
【发布时间】:2021-06-26 03:04:11
【问题描述】:

我正在考虑使用 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 块?如果这不可能,是否有解决方法?

【问题讨论】:

    标签: if-statement conditional-statements terraform


    【解决方案1】:

    使用 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"
      }
    }
    

    这将根据 var.environment_name 的值创建一个或零个 access_logs 块。

    【讨论】:

    • 我必须将属性包装在 content 块中,否则这非常有效! content { bucket = "my-bucket" prefix = "${var.environment_name}-alb" }
    【解决方案2】:

    在当前的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 }"
    }
    

    另见:

    【讨论】:

    • 很好,看来我的用例很幸运。
    • 有些资源可以通过将 count 设置为 0 或 1 来获得类似的效果。
    【解决方案3】:

    对 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

    【讨论】:

    • 我不能也使用 count 属性,比如说,aws 资源以类似的方式来表达它们是否应该存在于环境中(产生计数 eq 1)或不存在(产生计数 eq 0)?
    • 当然,这是标准的做法。它比这个关于动态配置块的问题更容易混淆,因为它只是一个简单的count = 0 or 1 语句,而不是for_each,其中数组长度决定了构建的内容(空或长度 1)
    • 如果您想扩展答案,您也可以点击“编辑”按钮。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多