【问题标题】:Conditional Dynamic block in TerraformTerraform 中的条件动态块
【发布时间】:2021-08-11 03:25:37
【问题描述】:

我有一个像这样的动态块:

 dynamic "origin" {
        for_each = var.ordered_cache_behaviors

        content {
            domain_name = "${origin.value.s3_target}.s3.amazonaws.com"
            origin_id   = "S3-${origin.value.s3_target}"    
        }
    }

我的列表是这样定义的:

  "ordered_cache_behaviors": [
    {
      "path_pattern": "/my-app*",
      "s3_target": "${local.default_s3_target}",
      "ingress": "external"
    }
  ]

在我的动态块中,我只想在此条件为真时渲染块origin.value.s3_target !== var.default_s3_target

如何以及在何处将条件添加到我的动态块中?请注意,块的渲染是由当前迭代对象的值控制的,而不是完全排除 for 循环的某个变量。

我想遍历所有内容并有条件地排除某些项目。所以用 Javascript 编写它看起来像这样:

for (origin in ordered_cache_behaviors) {
  if (origin.s3_target !== default_s3_target) {
     renderContent();
  } else {
     console.log('Content was skipped!');
  }
}

【问题讨论】:

    标签: terraform


    【解决方案1】:

    dynamicfor_each 参数期望接收一个集合,该集合对于您要生成的每个块都有一个元素,因此考虑您的问题的最佳方法是考虑生成 var.ordered_cached_behaviors 的过滤版本仅包含您要用于创建块的元素。

    过滤集合元素的常用方法是for expression,其中包括if clause。例如:

      dynamic "origin" {
        for_each = [
          for b in var.ordered_cache_behaviors : b
          if b.s3_target == var.default_s3_target
        ]
    
        content {
          domain_name = "${origin.value.s3_target}.s3.amazonaws.com"
          origin_id   = "S3-${origin.value.s3_target}"    
        }
      }
    

    for 表达式的结果将是一个新列表,其中仅包含具有预期 s3_target 属性值的源元素子集。如果它们都不具有该值,则结果列表的长度为零,因此 Terraform 根本不会生成 origin 块。

    【讨论】:

    • 优秀的解决方案,正是我想要的,谢谢!
    猜你喜欢
    • 2021-11-28
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多