You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:54:04