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

使用Bicep添加SendGrid DNS记录时遇不存在却报错问题

解决Bicep部署SendGrid DNS CNAME记录时的"Resource records can contain only one type of record specified"报错

以下是针对该问题的排查和修复步骤:

1. 检查CNAME记录的Bicep定义格式

这个报错最常见的原因是记录格式不符合Azure DNS的要求,尤其是CNAME记录的特殊性:

  • 确保使用类型专属的属性定义,不要混用通用records数组。正确的CNAME记录写法如下:
    // 引用已存在的DNS Zone
    resource dnsZone 'Microsoft.Network/dnsZones@2023-07-01-preview' existing = {
      name: 'your-domain.com'
      scope: resourceGroup('your-rg')
    }
    
    // 定义SendGrid的CNAME记录
    resource sendgridCname1 'Microsoft.Network/dnsZones/CNAME@2023-07-01-preview' = {
      name: 'em1._domainkey' // SendGrid要求的主机名
      parent: dnsZone
      properties: {
        TTL: 3600
        CNAMERecord: {
          cname: 'em1.domainkey.u12345678.sendgrid.net.' // 注意末尾的点号
        }
      }
    }
    
  • 注意:CNAME记录只能对应一个目标域名,不要在CNAMERecord里添加多个值,也不要同时使用records数组和CNAMERecord属性,这会触发类型冲突。

2. 排查隐性的记录类型冲突

  • Azure DNS不允许同一个主机名同时存在多种记录类型(比如A记录和CNAME记录)。检查你的Bicep模板(包括所有导入的模块、循环生成的资源),确认目标主机名没有被定义为其他类型的记录。
  • 用Azure CLI手动验证当前DNS Zone的状态:
    az network dns record-set list --resource-group <你的资源组名称> --zone-name <你的域名> --query "[?name=='em1._domainkey']"
    
    如果返回结果中有非CNAME类型的记录,先手动删除后再重新部署。

3. 解决部署状态一致性问题

虽然what-if结果符合预期,但实际部署可能因为之前的失败残留状态导致冲突:

  • 先在Azure门户或CLI中删除目标主机名对应的记录集,再重新触发GitHub Actions部署。
  • 若使用的是增量部署模式,尝试切换为完整模式(--mode Complete)进行一次部署,强制同步模板定义和实际资源状态(生产环境需谨慎,确保模板包含所有必要资源)。

4. 确认API版本的兼容性

确保DNS Zone和CNAME记录使用的API版本一致,推荐使用最新的稳定版(如2023-07-01-preview或2022-07-01),避免混用不同版本的资源类型定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:55:23