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

如何复用Terraform Cloudflare模块统一配置根域名与子域名DNS记录

整合实现方法

核心思路是将所有待创建的DNS记录(包含根域名、各服务子域名)整理为结构化的本地配置集合,通过for_each遍历集合传入差异化参数,所有记录共用同一个Cloudflare模块声明,无需拆分独立模块。

第一步:调整locals.tf配置

将原来纯字符串格式的子域名列表,改造为包含记录类型等差异化配置的结构化Map,同时把根域名配置合并到统一集合中:

locals {
  # 原有服务子域名统一配置为CNAME类型
  service_records = {
    for svc in var.services : "${svc}.${var.domain}" => {
      dns_type = "CNAME"
    }
  }

  # 根域名配置为对应A类型
  root_record = {
    var.root_domain = {
      dns_type = "A"
    }
  }

  # 合并得到全量DNS记录集合
  all_dns_records = merge(local.service_records, local.root_record)

  main_domain = "*.${var.domain}"
}

第二步:简化main.tf配置

删除原有的独立根域名模块声明,只保留一个record模块,遍历刚生成的全量记录集合,自动适配每个记录的类型参数:

module "record" {
  for_each = local.all_dns_records

  source          = "./modules/cloudflare"
  zone_id         = data.cloudflare_zone.domain.id
  name            = each.key
  value           = aws_cloudfront_distribution.s3_distribution.domain_name
  # 从当前遍历的记录配置中读取对应类型
  dns_type        = each.value.dns_type
  proxied         = false
  allow_overwrite = true
  depends_on      = [aws_cloudfront_distribution.s3_distribution]
}

扩展说明

  • 后续如果需要新增其他类型的记录(比如TXT、MX),或者给个别记录配置特殊参数(比如单独开启代理、指向不同的源站地址),只需要在all_dns_records集合中补充对应属性,在模块中通过each.value读取即可,不需要新增重复的模块块。
  • 公共参数(比如zone_id、默认proxied状态、依赖关系)统一在模块中维护,避免多份相同配置改漏的问题。
  • 如果原有配置已经在线上部署,第一次应用变更前可以通过terraform state mv命令将原module.record_for_root_domain下的资源迁移到module.record[var.root_domain]地址下,避免DNS记录被删除重建。

内容的提问来源于stack exchange,提问作者csaju

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:15:31