You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform动态块配置负载均衡监听器规则报错求助

问题解决:Terraform ALB监听器规则动态块错误

错误原因

你遇到的Unsupported block type错误,是因为dynamic "condition"块的结构不正确:path_pattern块没有嵌套在动态块要求的content内部,Terraform无法识别这种语法。

核心修正

首先修复dynamic "condition"的结构,将path_pattern放入content块中:

resource "aws_lb_listener_rule" "app_https_listener_rule" {
  for_each     = toset(var.app_listener_ports)
  listener_arn = aws_lb_listener.app_listener_forward[each.value].arn

  action {
    type = "forward"
    forward {
      dynamic "target_group" {
        for_each = values(aws_lb_target_group.app_tg)
        content {
          arn = target_group.value.arn
        }
      }
    }
  }

  dynamic "condition" {
    for_each = var.images
    content {
      path_pattern {
        values = condition.value.paths
      }
    }
  }
}

额外优化建议

  1. 修正端口变量类型
    var.app_listener_ports当前定义为list(string),但端口是数字类型,会导致类型不匹配问题,改成list(number):

    variable "app_listener_ports" {
      type = list(number)
      default = [80, 443, 22, 7999, 8999]
    }
    
  2. 调整监听器规则逻辑(可选但更合理)
    当前配置会为每个端口创建一条包含所有应用路径的规则,所有路径都会转发到所有目标组,这通常不符合业务需求。建议为每个端口+应用组合创建独立规则,确保对应路径转发到对应目标组:

    resource "aws_lb_listener_rule" "app_https_listener_rule" {
      for_each = {
        for item in flatten([
          for port in var.app_listener_ports : [
            for app_name in keys(var.images) : {
              port      = port
              app_name  = app_name
            }
          ]
        ]) : "${item.port}-${item.app_name}" => item
      }
    
      listener_arn = aws_lb_listener.app_listener_forward[each.value.port].arn
    
      action {
        type = "forward"
        forward {
          target_group {
            arn = aws_lb_target_group.app_tg[each.value.app_name].arn
          }
        }
      }
    
      condition {
        path_pattern {
          values = var.images[each.value.app_name].paths
        }
      }
    }
    
  3. 简化目标组动态块语法
    使用values(aws_lb_target_group.app_tg)直接遍历目标组对象,属性访问用.替代索引:

    dynamic "target_group" {
      for_each = values(aws_lb_target_group.app_tg)
      content {
        arn = target_group.value.arn
      }
    }
    

内容的提问来源于stack exchange,提问作者Dave Michaels

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:15:39