Terraform 1.0.11合并Map列表变量报错问题求助
问题分析
你用merge函数报错的核心原因是:merge是用来合并单个映射(Map)的,不是合并列表(List)。你传入的两个参数都是list(map(string))类型,完全不符合merge的参数要求,所以触发了类型不匹配的错误。
解决方案
1. 直接拼接列表(无重复参数场景)
如果只是要把本地定义的参数列表和变量传入的列表按顺序拼接(本地在前,变量在后),直接用concat函数就能实现你的预期效果:
# 定义本地参数列表 locals { db_cluster_parameter_group_params = [ {name = "autovacuum_vacuum_cost_delay", value = "20"}, {name = "max_wal_senders", value = "15", apply_method = "pending-reboot"} ] } # 合并得到最终参数列表 db_final_cluster_parameter_group_parameters = concat( local.db_cluster_parameter_group_params, var.db_cluster_parameter_group_parameters )
执行后得到的结果完全符合你的预期:
[ {name = "autovacuum_vacuum_cost_delay", value = "20"}, {name = "max_wal_senders", value = "15", apply_method = "pending-reboot"}, {name = "vacuum_cost_limit", value = "1000"}, {name = "rds.logical_replication", value = "1", apply_method = "pending-reboot"} ]
2. 处理重复参数(变量参数覆盖本地)
如果存在同名参数(比如本地和变量里都有max_wal_senders),需要让变量传入的参数覆盖本地定义的,可以用for表达式先把列表转成映射,再用merge合并,最后转回列表:
locals { db_cluster_parameter_group_params = [ {name = "max_wal_senders", value = "15", apply_method = "pending-reboot"}, {name = "autovacuum_vacuum_cost_delay", value = "20"} ] } db_final_cluster_parameter_group_parameters = values(merge( # 把本地列表转成以name为键的映射 {for p in local.db_cluster_parameter_group_params : p.name => p}, # 把变量列表转成以name为键的映射,后传入的会覆盖前一个的同名键 {for p in var.db_cluster_parameter_group_parameters : p.name => p} ))
注意事项
- Terraform 1.0.11完全支持
concat和上述for表达式语法,不用升级版本 - 执行
terraform plan就能预览合并后的结果,确认没问题再执行apply
内容的提问来源于stack exchange,提问作者nmakb
相关产品推荐
相关产品推荐

