Terraform中的条件动态块

9
我有一个动态块,如下所示:

 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!');
  }
}
1个回答

21

dynamic 块的 for_each 参数需要接收一个集合,该集合应包含每个要生成块的元素,因此,思考问题的最佳方式是考虑生成 var.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}"    
    }
  }
for表达式的结果将是一个新列表,仅包含具有期望s3_target属性值的源元素子集。如果它们中没有任何一个具有该值,则生成的列表将为零长度,因此Terraform将不会生成任何origin块。

非常棒的解决方案,正是我所需要的,谢谢! - SBKDeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接