如何通过Terraform迭代批量创建EC2实例对应的Route53 A记录
Terraform批量创建Route53 A记录精简方案
方案1:不改动现有EC2资源定义,仅优化Route53记录创建
首先调整locals块结构,将离散的域名与对应EC2实例做映射,原有单独的域名变量可以保留不影响其他地方的引用:
locals { # 实例标识对应[域名, EC2实例资源]的映射,后续新增实例仅需在该map内加行即可 instance_record_map = { deploya = [ "namea.aws.ra.com", aws_instance.deploya ] deployb = [ "nameb.aws.ra.com", aws_instance.deployb ] deployc = [ "namec.aws.ra.com", aws_instance.deployc ] } # 保留原有单域名变量,兼容已有逻辑的引用 namea = local.instance_record_map.deploya[0] nameb = local.instance_record_map.deployb[0] namec = local.instance_record_map.deployc[0] }
随后用for_each迭代上述map批量创建Route53记录,仅需一个资源块即可:
resource "aws_route53_record" "instance_a" { for_each = local.instance_record_map allow_overwrite = true zone_id = data.aws_route53_zone.selected.zone_id name = each.value[0] type = "A" ttl = "300" records = [each.value[1].private_ip] }
方案2:全链路优化(推荐)
如果愿意调整现有EC2的定义,可以将EC2配置也统一收敛到locals映射表中,后续新增实例仅需修改locals配置,无需新增任何资源块:
首先定义统一的实例配置映射:
locals { instances_config = { deploya = { dns_name = "namea.aws.ra.com" ami = "替换为你原有deploya的ami值" instance_type = "替换为你原有deploya的实例规格" # 其他你原有aws_instance.deploya中定义的参数都可以在这里补充 } deployb = { dns_name = "nameb.aws.ra.com" ami = "替换为你原有deployb的ami值" instance_type = "替换为你原有deployb的实例规格" } deployc = { dns_name = "namec.aws.ra.com" ami = "替换为你原有deployc的ami值" instance_type = "替换为你原有deployc的实例规格" } } # 保留原有单域名变量,兼容已有逻辑的引用 namea = local.instances_config.deploya.dns_name nameb = local.instances_config.deployb.dns_name namec = local.instances_config.deployc.dns_name }
用for_each批量创建EC2实例:
resource "aws_instance" "deploy" { for_each = local.instances_config ami = each.value.ami instance_type = each.value.instance_type # 其他你原有aws_instance中定义的参数都按该格式补充即可 }
批量创建Route53记录:
resource "aws_route53_record" "instance_a" { for_each = local.instances_config allow_overwrite = true zone_id = data.aws_route53_zone.selected.zone_id name = each.value.dns_name type = "A" ttl = "300" records = [aws_instance.deploy[each.key].private_ip] }
内容的提问来源于stack exchange,提问作者PoornimaCR
相关产品推荐
相关产品推荐

