如何通过Bicep为Azure容器应用添加自定义域名并解决循环依赖问题
解决Azure容器应用自定义域名与私有DNS的循环依赖问题
可以通过分阶段自动化部署的方式解决这个循环依赖问题,无需手动执行两次部署。核心思路是拆分部署流程,让资源按顺序创建:先部署不带自定义域名的容器应用,再创建DNS验证记录,最后更新容器应用配置自定义域名。
具体实现步骤(Bicep代码示例)
第一步:部署基础容器应用
先创建不包含自定义域名配置的容器应用,获取它的FQDN和域名验证ID,供后续DNS记录使用。resource containerAppBase 'Microsoft.App/containerapps@2022-03-01' = { name: 'my-container-app' location: resourceGroup().location properties: { // 配置容器应用的基础参数:环境、镜像、资源配额等 configuration: { ingress: { external: true targetPort: 80 // 暂不配置customDomains } } } }第二步:部署私有DNS记录
利用基础容器应用输出的FQDN和验证ID,创建CNAME和TXT验证记录。// 假设私有DNS区域已存在,若不存在可在此创建 resource privateDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' existing = { name: 'mydomain.com' } // 提取容器应用的域名验证ID var domainVerificationId = containerAppBase.properties.configuration.ingress.customDomainVerificationId // 创建CNAME记录,指向容器应用的FQDN resource cnameRecord 'Microsoft.Network/privateDnsZones/CNAME@2020-06-01' = { parent: privateDnsZone name: 'app.mydomain.com' properties: { TTL: 3600 cname: containerAppBase.properties.configuration.ingress.fqdn } } // 创建TXT验证记录,用于Azure域名所有权验证 resource txtRecord 'Microsoft.Network/privateDnsZones/TXT@2020-06-01' = { parent: privateDnsZone name: 'asuid.app.mydomain.com' properties: { TTL: 3600 TXTRecords: [ { value: [domainVerificationId] } ] } }第三步:更新容器应用,配置自定义域名
等待DNS记录部署完成后,更新容器应用的 ingress 配置,添加自定义域名。通过dependsOn确保DNS记录先就绪。resource certificate 'Microsoft.CertificateRegistration/certificates@2022-06-01' existing = { name: 'my-custom-cert' } resource containerAppWithCustomDomain 'Microsoft.App/containerapps@2022-03-01' existing = { name: containerAppBase.name dependsOn: [cnameRecord, txtRecord] properties: { configuration: { ingress: { customDomains: [ { name: 'app.mydomain.com' certificateId: certificate.id bindingType: 'SniEnabled' } ] } } } }
为什么这能解决循环依赖?
- 基础容器应用先部署,提供了DNS记录所需的FQDN和验证ID,打破了"DNS记录依赖应用、应用依赖DNS记录"的循环。
- DNS记录部署完成后,再更新应用配置自定义域名,此时Azure能检测到已存在的验证记录,直接通过验证并完成部署。
内容的提问来源于stack exchange,提问作者Thomas F.
相关产品推荐
相关产品推荐

