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

如何在Terraform中配置空CNAME记录名以生成根域名主机名?

解决方案

1. 修复主机名拼接逻辑

当前的host_name拼接方式在var.cname_name为空时会生成.myapp.app,不符合需求。可以使用Terraform的compact和join函数动态生成正确的主机名:

修改CDN自定义域名资源中的host_name字段:

resource "azurerm_cdn_endpoint_custom_domain" "endpointfrontend" {
  name            = "myappdev"
  cdn_endpoint_id = azurerm_cdn_endpoint.cdnendpoint.id
  # 用compact过滤空字符串,再通过join拼接成合法主机名
  host_name       = join(".", compact([var.cname_name, data.azurerm_dns_zone.dnszone.name]))
  cdn_managed_https {
    certificate_type = "Dedicated"
    protocol_type = "ServerNameIndication"
  }
}

compact会自动移除列表中的空字符串元素:

  • 当var.cname_name设为dev时,列表为["dev", "myapp.app"],拼接后得到dev.myapp.app
  • 当var.cname_name设为空字符串时,列表仅剩["myapp.app"],拼接后得到myapp.app

2. 处理根域名DNS记录的限制

需要注意:Azure DNS不允许在根域名(如myapp.app)上创建CNAME记录,因为CNAME会覆盖该域名下的SOA、NS等必需DNS记录,导致域名解析异常。

如果prod环境需要将根域名指向CDN端点,需改用Alias类型的A记录,替代原CNAME配置:

# prod环境根域名Alias记录配置
resource "azurerm_dns_a_record" "rootfrontend" {
  name                = "" # 空字符串代表根域名
  zone_name           = data.azurerm_dns_zone.dnszone.name 
  resource_group_name = data.azurerm_dns_zone.dnszone.resource_group_name
  ttl                 = 3600

  alias {
    target_resource_id = azurerm_cdn_endpoint.cdnendpoint.id
    record_type        = "A"
  }
}

3. 环境变量配置

  • dev环境:在terraform.tfvars中设置cname_name = "dev"
  • prod环境:在terraform.tfvars中设置cname_name = ""

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 20:40:29