如何复用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
相关产品推荐
相关产品推荐

