Terraform中aws_lb_listener_rule能否用动态condition块?配置报错求助
问题分析与修正方案
错误原因拆解
- Insufficient condition blocks:原代码的
for_each逻辑完全反转——当var.route_path_patterns或var.route_host_patterns有值时,反而生成空数组,导致不会创建任何condition块,违反了负载均衡监听器规则必须至少包含一个条件的要求。 - Unsupported block type:
dynamic块内部未正确使用content嵌套子块结构,直接将path_pattern/host_header写在dynamic下,Terraform无法识别这种非法的块嵌套方式。
修正后的代码
resource "aws_lb_listener_rule" "static" { listener_arn = data.aws_lb_listener.https.arn priority = 100 action { type = "forward" target_group_arn = aws_lb_target_group.ecs_group.arn } # 路径匹配条件:当有路径模式时生成对应condition块 dynamic "condition" { for_each = length(var.route_path_patterns) > 0 ? [var.route_path_patterns] : [] content { path_pattern { values = condition.value } } } # 主机头匹配条件:当有主机模式时生成对应condition块 dynamic "condition" { for_each = length(var.route_host_patterns) > 0 ? [var.route_host_patterns] : [] content { host_header { values = condition.value } } } }
关键修正点
- 反转
for_each逻辑:仅当变量包含有效值时,才生成对应的condition块,确保至少有一个条件存在(如果两个变量至少有一个有值)。 - 新增
content块:在dynamic内部用content包裹path_pattern/host_header,符合Terraform动态块的语法规范,让Terraform正确识别子块类型。 - 优化
for_each值:直接将变量值作为数组元素,避免无意义的[1]占位,逻辑更清晰。
注:如果需要支持同时配置路径和主机头条件,上述代码会同时生成两个
condition块,符合AWS负载均衡规则的多条件逻辑(逻辑与关系)。
内容的提问来源于stack exchange,提问作者Andrei Dascalu
相关产品推荐
相关产品推荐

