Terraform映射SQL查询结果报Missing map element错误如何修复
问题修复方案
核心问题原因
报错由参数传递缺失、属性名不匹配、语法错误三类问题叠加导致:
- 根目录调用
terraform-sql模块时未将SQL查询结果传递给sql输入变量,触发了变量默认的空map配置 - SQL查询返回的IP字段名与模块内引用的字段名不匹配
- 模块内存在多处语法书写错误
具体修复步骤
1. 修复根目录main.tf的模块调用参数
在module "terraform-sql"块中补充sql参数赋值,同时移除ptr_networks多余的字符串包裹(避免把list类型强转为字符串):
module "terraform-sql" { source = "../terraform-modules/terraform-sql" depends_on = [module.sql-servers-admindb] for_each = { for sql in module.sql-servers-admindb.result.sqlquery : sql.serwer_id => sql } general = { zone = "sql.${var.dns_local_name[local.environment]}." ptr_networks = var.dns_local_reverse_allowed[local.environment] } // 补充sql参数,把循环当前的SQL查询结果传入模块 sql = each.value }
2. 修复terraform-sql模块的变量定义
将sql变量的类型从模糊的map(any)调整为明确的object结构,避免类型推断异常,同时删除默认空值配置,参数缺失时直接抛出明确的传参错误:
variable "sql" { type = object({ serwer_id = string ip_local = string host_mysql = string }) }
3. 修复terraform-sql模块main.tf的语法和字段引用错误
同步修正3处问题:补全source的闭合双引号、修正zone的插值语法、将错误的local_ip改为和SQL查询结果一致的ip_local:
// IP address and A record module "sql-nsrecord_a" { // 补全source路径的闭合双引号 source = "../terraform-modules/terraform-generic-nsrecord" // 补全插值语法的$符号 zone = "${var.general.zone}." name = "${var.sql.serwer_id}." type = "A" // 修正字段名,和SQL返回的ip_local对齐 records = [var.sql.ip_local] ptr_networks = var.general.ptr_networks }
验证方法
修改完成后执行terraform plan,如果SQL查询结果非空,会按照返回的serwer_id数量生成对应DNS记录资源,不会再报map元素缺失错误。
内容的提问来源于stack exchange,提问作者onev
相关产品推荐
相关产品推荐

