You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Terraform 0.12.20中aws_lb_listener_rule的condition参数未被识别报错

解决Terraform 0.12.20中aws_alb_listener_rule的condition参数错误

这个错误的核心原因是:在Terraform 0.12.x版本对应的AWS Provider中,aws_alb_listener_rulecondition块并不支持直接使用fieldvalues这两个通用参数。AWS Provider对ALB监听器规则的条件配置采用了分类型的嵌套块结构,你需要根据实际要匹配的规则类型,使用对应的专属嵌套块。

错误原因详解

在较新的Terraform AWS Provider版本中,引入了通用的fieldvalues参数来简化条件配置,但在你使用的0.12.20对应的Provider版本(通常是v2.x系列)中,仍然需要针对不同的匹配类型使用特定的块:

  • 匹配主机头:使用host_header
  • 匹配URL路径:使用path_pattern
  • 匹配HTTP请求头:使用http_header
  • 匹配查询字符串:使用query_string
  • 匹配源IP:使用source_ip

解决方案

根据你的变量设计(用逗号分隔多个规则字段和值),这里提供两种修正方案:

方案1:针对单一条件类型的静态配置

如果你的listener_rule_field统一是某一种类型(比如都是host_header),可以直接替换成对应的嵌套块:

resource "aws_alb_listener_rule" "alb_listener_rule" {
  count = length(compact(split(",", var.priority))) > 0 ? length(compact(split(",", var.priority))) : 0
  listener_arn = var.listener_arn
  priority = element(split(",", var.priority), count.index)
  
  action {
    type = "forward"
    target_group_arn = element(split(",", var.target_group_arn), count.index)
  }
  
  condition {
    host_header {
      values = [element(split(",", var.listener_rule_value), count.index)]
    }
  }
}

方案2:支持多种条件类型的动态配置

如果你的listener_rule_field包含多种类型(比如同时有host_headerpath_pattern),可以使用Terraform 0.12支持的dynamic块来动态生成对应类型的条件:

resource "aws_alb_listener_rule" "alb_listener_rule" {
  count = length(compact(split(",", var.priority))) > 0 ? length(compact(split(",", var.priority))) : 0
  listener_arn = var.listener_arn
  priority = element(split(",", var.priority), count.index)
  
  action {
    type = "forward"
    target_group_arn = element(split(",", var.target_group_arn), count.index)
  }
  
  dynamic "condition" {
    for_each = [
      {
        type  = element(split(",", var.listener_rule_field), count.index)
        value = element(split(",", var.listener_rule_value), count.index)
      }
    ]
    content {
      dynamic "${condition.value.type}" {
        for_each = [condition.value.value]
        content {
          values = [condition.value.value]
        }
      }
    }
  }
}

额外提示

  1. 建议你检查当前使用的AWS Provider版本,可以在versions.tf中明确指定兼容的版本,避免版本差异导致的语法问题:
provider "aws" {
  version = "~> 2.70" # 适配Terraform 0.12.20的稳定版本
  region  = var.region
}
  1. Terraform 0.12已经支持简化插值语法,你可以把"${var.xxx}"直接写成var.xxx,让代码更简洁易读。

内容的提问来源于stack exchange,提问作者Sanyam Grover

火山引擎 最新活动