Terraform Cloudflare模块报错:给定键未识别集合元素,求排查
问题原因分析
资源集合引用错误
cloudflare_filter.firewall-filters是通过for_each = var.filters创建的资源集合(本质为map类型),直接将其赋值给filter_id时,Terraform无法确定要使用集合中的哪一个元素,这是触发报错的核心原因。带连字符的变量引用语法错误
变量名firewall-rules包含连字符,Terraform中引用这类变量必须用引号包裹为var."firewall-rules",否则会被解析成var.firewall - rules(减法运算),引发语法错误。规则与过滤器未建立关联
当前firewall-rules变量没有存储对应过滤器的标识,无法将防火墙规则与正确的过滤器绑定。
修复后的代码示例
调整变量结构(增加过滤器关联字段)
## Variables variable "filters" { description = "Required filters for the firewall rules" type = map(object({ description = string expression = string })) default = { "filters1" = { description = "test-rule" expression = "test-exps" } } } variable "firewall-rules" { description = "A set of Firewall rules" type = map(object({ description = string action = string filter_key = string # 新增字段,关联filters中的对应键 })) default = { "rules1" = { description = "value" action = "value" filter_key = "filters1" # 指定该规则对应的过滤器键 } } }
修正资源定义
## Resources resource "cloudflare_filter" "firewall-filters" { zone_id = var.zone_id for_each = var.filters description = each.value["description"] expression = each.value["expression"] } resource "cloudflare_firewall_rule" "firewall-rules" { zone_id = var.zone_id for_each = var."firewall-rules" # 修正带连字符的变量引用方式 filter_id = cloudflare_filter.firewall-filters[each.value.filter_key].id # 通过filter_key精准获取对应过滤器ID description = each.value["description"] action = each.value["action"] }
关键说明
- 通过在
firewall-rules变量中新增filter_key字段,明确每个防火墙规则对应的过滤器,解决了资源集合的元素定位问题。 - 使用
cloudflare_filter.firewall-filters[each.value.filter_key].id精准获取对应过滤器的ID,替代原错误的集合直接引用。 - 带连字符的变量必须用
var."变量名"的格式引用,避免语法解析错误。
内容的提问来源于stack exchange,提问作者MarcusScipio
相关产品推荐
相关产品推荐

