使用Terraform创建AWS Route53多条A记录IP分配错误如何解决
问题根因
当前配置的问题是for_each遍历的是纯域名集合,没有和IP列表的索引做绑定,每个DNS记录都直接赋值了完整IP列表,所以所有域名都会绑定全部IP。
调整方案
1. 修改local块,构造域名与IP一一映射的结构
替换原有local块,将域名和对应IP提前绑定为map结构:
locals { # 获取当前环境的IP列表 current_env_ips = var.api_ips[terraform.workspace] # 构造 域名:对应IP 的映射表 vm_fqdn_ip_map = { "dns1-${terraform.workspace}.${local.domain}" = local.current_env_ips[0] "dns2-${terraform.workspace}.${local.domain}" = local.current_env_ips[1] } }
2. 调整Route53记录资源的遍历逻辑
遍历上面生成的映射表,直接取对应IP赋值:
resource "aws_route53_record" "onprem_api_record" { for_each = local.vm_fqdn_ip_map zone_id = data.aws_route53_zone.dns_zone.zone_id name = each.key type = "A" # records参数要求列表格式,所以单个IP也要用[]包裹 records = [each.value] ttl = "300" }
通用扩展方案(适配多域名批量生成)
如果后续需要添加更多一一对应的域名和IP,可使用zipmap函数自动生成映射表,无需手动拼接每个键值对:
locals { current_env_ips = var.api_ips[terraform.workspace] # 自动生成和IP数量一致的域名列表,格式为dns1、dns2...dnsN vm_fqdn_list = [for i in range(length(local.current_env_ips)) : "dns${i+1}-${terraform.workspace}.${local.domain}"] # 自动拼接域名和IP的映射表 vm_fqdn_ip_map = zipmap(local.vm_fqdn_list, local.current_env_ips) }
资源块部分和上述调整后的写法完全一致,后续只需要在对应环境的api_ips列表中新增IP,就会自动生成对应序号的dnsN域名绑定。
注意:请确保每个环境下的
api_ips列表长度和你需要创建的域名数量一致,避免出现索引越界错误,你可以给变量添加校验规则提前拦截问题:
variable "api_ips" { type = map(list(string)) default = { "dev" = [ "10.1.20.70", "10.1.20.140" ] "qa" = [ "10.1.22.180", "10.1.22.150" ] "test" = [ "10.1.23.190", "10.1.23.160" ] } validation { condition = alltrue([for env, ips in var.api_ips : length(ips) >= 2]) error_message = "每个环境的api_ips列表至少需要包含2个IP。" } }
内容的提问来源于stack exchange,提问作者Gowthamakanthan Gopal
相关产品推荐
相关产品推荐

