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

