如何通过Terraform为CloudFront别名在Route53创建DNS记录?
解决Terraform中为CloudFront别名批量创建Route53记录的问题
问题分析
你当前的代码存在两个核心问题:
name字段直接赋值为数组each.value.aliases,但aws_route53_record要求name是单个字符串,每个记录仅对应一个域名for_each按整个配置对象迭代,无法为每个别名生成独立的Route53记录
要实现每个CloudFront别名对应一条Route53记录,需要通过flatten把嵌套的别名列表拆平,再结合for_each遍历每个单独的别名条目。
解决方案步骤
- 创建扁平化的别名映射:使用
flatten和嵌套for循环,把每个配置项中的所有别名拆分为独立条目,同时保留关联的Route53 Zone ID和CloudFront域名信息 - 基于扁平化映射创建记录:用处理后的映射作为
for_each的数据源,为每个别名生成单独的Route53记录
完整代码示例
1. 定义扁平化局部值
locals { flattened_aliases = { for alias_item in flatten([ for cfg in var.config : [ for alias in cfg.aliases : { config_id = cfg.id alias_name = alias zone_id = cfg.route53ZoneId cf_domain = aws_cloudfront_distribution.main[cfg.id].domain_name } ] ]) : "${alias_item.config_id}-${alias_item.alias_name}" => alias_item } }
这里通过${config_id}-${alias_name}生成唯一的键,确保for_each的每个键对应唯一的记录。
2. 创建Route53别名记录
resource "aws_route53_record" "cf-record-aliases" { for_each = local.flattened_aliases zone_id = each.value.zone_id name = each.value.alias_name type = "CNAME" ttl = "300" records = [each.value.cf_domain] }
注意:修正你原代码中的变量名错误——原代码用了var.client_config,但你的tfvars里变量是config,需统一为var.config。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

