Terraform 中的条件动态块

SBK*_*per 10 terraform

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

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

我的列表定义如下:

  "ordered_cache_behaviors": [
    {
      "path_pattern": "/my-app*",
      "s3_target": "${local.default_s3_target}",
      "ingress": "external"
    }
  ]
Run Code Online (Sandbox Code Playgroud)

在我的动态块中,我只想在这个条件为真时渲染该块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!');
  }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ins 22

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

过滤集合元素的常用方法是使用包含子句的for表达式。例如:if

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

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