Terraform中用EC2实例与私网IP创建Route53 A记录报错求助
问题解决办法
核心错误分析
你在aws_route53_record资源中使用了未定义的key和value变量来访问each.value,这是导致资源引用无效的直接原因。each.value是一个包含实例名称和IP的列表,应该通过索引位置来取值。
优化后的完整配置
1. 简化Locals定义
原来的inst_name、inst_ip和nameip_map可以合并为更简洁的写法,直接从data.aws_instance.this生成映射:
locals { nameip_map = { for id, inst in data.aws_instance.this : id => [inst.tags["Name"], inst.private_ip] } }
这个写法直接遍历EC2实例数据,将每个实例的名称和私网IP整理为列表,避免了冗余的合并操作,逻辑更清晰。
2. 修正Route53记录资源
修改aws_route53_record的取值方式,用列表索引获取名称和IP,同时注意records参数要求是列表类型:
resource "aws_route53_record" "ec2_a_records" { for_each = local.nameip_map allow_overwrite = true zone_id = "Z1XXXXXXXXXXXXXXXX" name = each.value[0] # 取列表第一个元素:实例名称 type = "A" ttl = 300 records = [each.value[1]] # 取列表第二个元素:私网IP,包装为列表 }
关键说明
each.value[0]对应实例的Name标签值,each.value[1]对应私网IP,这和你之前nameip_map的输出结构完全匹配。records参数必须是列表类型,所以即使只有一个IP,也要用[]包裹起来。
内容的提问来源于stack exchange,提问作者RizAcn
相关产品推荐
相关产品推荐

