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

如何通过Terraform为CloudFront别名在Route53创建DNS记录?

解决Terraform中为CloudFront别名批量创建Route53记录的问题

问题分析

你当前的代码存在两个核心问题:

  • name字段直接赋值为数组each.value.aliases,但aws_route53_record要求name是单个字符串,每个记录仅对应一个域名
  • for_each按整个配置对象迭代,无法为每个别名生成独立的Route53记录

要实现每个CloudFront别名对应一条Route53记录,需要通过flatten把嵌套的别名列表拆平,再结合for_each遍历每个单独的别名条目。

解决方案步骤

  1. 创建扁平化的别名映射:使用flatten和嵌套for循环,把每个配置项中的所有别名拆分为独立条目,同时保留关联的Route53 Zone ID和CloudFront域名信息
  2. 基于扁平化映射创建记录:用处理后的映射作为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:15:34