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 } } } }
额外优化建议
修正端口变量类型
var.app_listener_ports当前定义为list(string),但端口是数字类型,会导致类型不匹配问题,改成list(number):variable "app_listener_ports" { type = list(number) default = [80, 443, 22, 7999, 8999] }调整监听器规则逻辑(可选但更合理)
当前配置会为每个端口创建一条包含所有应用路径的规则,所有路径都会转发到所有目标组,这通常不符合业务需求。建议为每个端口+应用组合创建独立规则,确保对应路径转发到对应目标组: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 } } }简化目标组动态块语法
使用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
相关产品推荐
相关产品推荐

