如何用Terraform在AWS Route 53中创建适配多环境的动态DNS记录?
动态适配多环境的AWS Route53记录配置方案
核心逻辑
通过Terraform Cloud工作区的专属环境变量传递环境标识,结合Terraform的变量插值和本地值功能,让同一份代码自动生成对应环境的Route53记录,无需为每个环境单独编写配置。
具体实现步骤
1. 声明Terraform变量
在代码中定义必要变量,用于接收工作区传递的环境参数:
variable "environment" { type = string description = "环境标识:dev/demo/prod" } variable "domain_name" { type = string description = "Route53托管的主域名" default = "my-domain.com" } variable "target_dns" { type = string description = "记录指向的目标DNS地址(比如ALB、EC2的公网DNS)" }
2. 动态生成环境专属域名
用本地值处理域名拼接逻辑,生产环境直接使用主域名,其他环境生成对应子域名:
locals { # 生产环境留空前缀,其他环境添加环境标识作为子域名前缀 record_prefix = var.environment == "prod" ? "" : "${var.environment}." full_domain = "${local.record_prefix}${var.domain_name}" }
3. 创建Route53记录资源
读取主域名的Route53托管区信息,结合动态生成的域名创建环境专属记录:
# 获取Route53主域名托管区ID data "aws_route53_zone" "main" { name = var.domain_name private_zone = false # 若为私有托管区则改为true } # 创建适配当前环境的Route53记录 resource "aws_route53_record" "env_specific" { zone_id = data.aws_route53_zone.main.zone_id name = local.full_domain type = "CNAME" # 根据实际需求选择A/AAAA/CNAME等记录类型 ttl = 300 records = [var.target_dns] }
4. 配置Terraform Cloud工作区变量
为每个工作区设置对应的环境变量:
- 生产工作区(绑定main分支):设置
environment = prod,同时填入生产环境资源的target_dns值 - 开发工作区(绑定dev分支):设置
environment = dev,填入开发环境资源的target_dns值 - 演示工作区(绑定demo分支):设置
environment = demo,填入演示环境资源的target_dns值
5. 关联GitLab分支与工作区
在Terraform Cloud中配置各工作区的VCS触发规则:
- 生产工作区:仅监听main分支的代码提交
- 开发工作区:仅监听dev分支的代码提交
- 演示工作区:仅监听demo分支的代码提交
可选优化
- 如果不同环境需要不同的TTL或记录类型,可将
type、ttl也设为变量,通过工作区环境变量传递 - 添加输出值方便查看生成的域名:
output "deployed_domain" { value = local.full_domain }
内容的提问来源于stack exchange,提问作者Miguel Conde
相关产品推荐
相关产品推荐

