使用Azure CLI配置Azure FrontDoor时遇到的问题
配置Azure FrontDoor关联多环境WebApp的问题与修复
需求说明
- 自定义域名
mydomain.com已在Azure DNS Zone中配置,域名服务商已更新NS指向Azure DNS的名称服务器 - 三个WebApp环境:生产
myapp.azurewebsites.net、测试myapp-qa.azurewebsites.net、开发myapp-dev.azurewebsites.net - 配置Azure FrontDoor接收
mydomain.com相关请求,暂不启用WAF - 路由规则:
mydomain.com和www.mydomain.com→ 生产站点qa.mydomain.com→ 测试站点dev.mydomain.com→ 开发站点- 未匹配请求默认指向生产站点
遇到的问题
- 执行
az afd custom-domain update启用托管证书时失败,错误:(BadRequest) Property 'AfdDomain.TlsSettings.Secret.Id' is required but it was not set,但托管证书无需手动指定Secret - 自定义域名始终处于
Pending状态,提示Certificate needed,未自动完成验证 - 路由配置无效,访问所有自定义域名均报错
问题分析与修复方案
1. 自定义域名HTTPS配置报错
原因:az afd custom-domain update命令启用托管证书的方式不正确,托管证书由Azure自动管理,无需指定Secret Id,但该命令需要在域名验证完成后执行,或直接在创建域名时配置TLS参数。
修复:删除单独的update命令,在az afd custom-domain create时直接指定证书类型和TLS版本,Azure会自动处理证书创建和验证。
2. 域名状态Pending无法验证
原因:
- DNS记录配置冲突:脚本中同时创建了Alias A记录和CNAME记录,且未等待Azure自动添加验证TXT记录
- 未启用HTTPS配置,导致证书颁发流程未触发
修复:
- 根域名使用Alias A记录指向AFD端点,子域名使用CNAME指向AFD端点域名
- 创建自定义域名时启用托管证书,Azure会自动在DNS Zone添加TXT验证记录,等待10-30分钟完成验证和证书颁发
3. 路由配置无效
原因:
- 路由的
--patterns-to-match配置错误:使用/www等路径匹配,而非域名匹配,应该设置为/*匹配所有路径 - 所有路由指向同一个源组,但未指定具体源,导致请求无法正确路由到对应环境的WebApp
修复:
- 为每个环境创建独立的源组(或在路由中指定具体源)
- 路由的
--patterns-to-match设置为/*,并为每个域名路由关联对应的源
修正后的完整脚本
#!/bin/bash RESOURCE_GROUP="myresourcegroup" CUSTOM_DOMAIN_NAME="mydomain.com" #DNS parameters ZONE_NAME="mydomain.com" TTL=60 CNAME_TARGET="myazurefrontdoor-fd.azurefd.net" #FrontDoor parameters AZURE_FRONTDOOR_PROFILE_NAME="myazurefrontdoor-fd" AZURE_FRONTDOOR_ENDPOINT_NAME="${CUSTOM_DOMAIN_NAME//./-}-endpoint" #App parameters APP_NAME="myapp" APP_URL_PROD="$APP_NAME.azurewebsites.net" APP_URL_QA="$APP_NAME-qa.azurewebsites.net" APP_URL_DEV="$APP_NAME-dev.azurewebsites.net" # Create AFD profile az afd profile create -g "$RESOURCE_GROUP" --name $AZURE_FRONTDOOR_PROFILE_NAME --sku Standard_AzureFrontDoor # Create Azure DNS Zone (已确认域名服务商已更新NS记录) az network dns zone create -g "$RESOURCE_GROUP" --name $ZONE_NAME # Create AFD endpoint first to get the endpoint ID az afd endpoint create -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --endpoint-name "$AZURE_FRONTDOOR_ENDPOINT_NAME" --enabled-state Enabled ENDPOINT_ID=$(az afd endpoint show -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --endpoint-name "$AZURE_FRONTDOOR_ENDPOINT_NAME" --query "id" -o tsv) if [ -z "$ENDPOINT_ID" ]; then echo "Error: Could not retrieve the Endpoint ID. Please check if the endpoint exists." exit 1 fi # 配置DNS记录:根域名用Alias A记录,子域名用CNAME az network dns record-set a create -g "$RESOURCE_GROUP" --zone-name "$ZONE_NAME" --name "@" --ttl "$TTL" az network dns record-set a add-record -g "$RESOURCE_GROUP" --zone-name "$ZONE_NAME" --record-set-name "@" --target-resource "$ENDPOINT_ID" az network dns record-set cname create -g "$RESOURCE_GROUP" --zone-name "$ZONE_NAME" --name "www" --ttl "$TTL" --cname "$CNAME_TARGET" az network dns record-set cname create -g "$RESOURCE_GROUP" --zone-name "$ZONE_NAME" --name "qa" --ttl "$TTL" --cname "$CNAME_TARGET" az network dns record-set cname create -g "$RESOURCE_GROUP" --zone-name "$ZONE_NAME" --name "dev" --ttl "$TTL" --cname "$CNAME_TARGET" # 创建各环境的源组和源 # 生产环境源组 az afd origin-group create -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --origin-group-name "prod-origin-group" --sample-size 1 --successful-samples-required 1 --probe-path "/" --probe-protocol "Https" --probe-interval-in-seconds 30 az afd origin create -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --origin-group-name "prod-origin-group" --origin-name "prod-origin" --host-name "$APP_URL_PROD" --http-port 80 --https-port 443 # 测试环境源组 az afd origin-group create -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --origin-group-name "qa-origin-group" --sample-size 1 --successful-samples-required 1 --probe-path "/" --probe-protocol "Https" --probe-interval-in-seconds 30 az afd origin create -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --origin-group-name "qa-origin-group" --origin-name "qa-origin" --host-name "$APP_URL_QA" --http-port 80 --https-port 443 # 开发环境源组 az afd origin-group create -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --origin-group-name "dev-origin-group" --sample-size 1 --successful-samples-required 1 --probe-path "/" --probe-protocol "Https" --probe-interval-in-seconds 30 az afd origin create -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --origin-group-name "dev-origin-group" --origin-name "dev-origin" --host-name "$APP_URL_DEV" --http-port 80 --https-port 443 # Get DNS Zone ID DNS_ZONE_ID=$(az network dns zone show -g "$RESOURCE_GROUP" --name "$CUSTOM_DOMAIN_NAME" --query id --output tsv) # 创建自定义域名并直接启用托管证书 declare -A DOMAINS=( ["$CUSTOM_DOMAIN_NAME"]="prod" ["www.$CUSTOM_DOMAIN_NAME"]="prod" ["qa.$CUSTOM_DOMAIN_NAME"]="qa" ["dev.$CUSTOM_DOMAIN_NAME"]="dev" ) for DOMAIN in "${!DOMAINS[@]}"; do DOMAIN_NAME="${DOMAIN//./-}-domain" # 创建域名时直接配置TLS,Azure自动处理验证和证书 az afd custom-domain create -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --name "$DOMAIN_NAME" --host-name "$DOMAIN" --azure-dns-zone "$DNS_ZONE_ID" --certificate-type ManagedCertificate --minimum-tls-version TLS12 done # 创建路由规则 # 生产路由(根域名+www) az afd route create -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --endpoint-name "$AZURE_FRONTDOOR_ENDPOINT_NAME" --route-name "prod-route" --origin-group "prod-origin-group" --custom-domains "${CUSTOM_DOMAIN_NAME//./-}-domain" "www-${CUSTOM_DOMAIN_NAME//./-}-domain" --patterns-to-match "/*" --forwarding-protocol HttpsOnly --enabled-state Enabled # 测试路由 az afd route create -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --endpoint-name "$AZURE_FRONTDOOR_ENDPOINT_NAME" --route-name "qa-route" --origin-group "qa-origin-group" --custom-domains "qa-${CUSTOM_DOMAIN_NAME//./-}-domain" --patterns-to-match "/*" --forwarding-protocol HttpsOnly --enabled-state Enabled # 开发路由 az afd route create -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --endpoint-name "$AZURE_FRONTDOOR_ENDPOINT_NAME" --route-name "dev-route" --origin-group "dev-origin-group" --custom-domains "dev-${CUSTOM_DOMAIN_NAME//./-}-domain" --patterns-to-match "/*" --forwarding-protocol HttpsOnly --enabled-state Enabled # 默认路由(未匹配请求指向生产) az afd route create -g "$RESOURCE_GROUP" --profile-name "$AZURE_FRONTDOOR_PROFILE_NAME" --endpoint-name "$AZURE_FRONTDOOR_ENDPOINT_NAME" --route-name "default-route" --origin-group "prod-origin-group" --patterns-to-match "/*" --forwarding-protocol HttpsOnly --enabled-state Enabled --priority 100
额外注意事项
- 执行脚本后,等待10-30分钟让Azure完成域名验证和证书颁发,域名状态会变为
Approved - 确保WebApp已配置允许AFD访问(在WebApp的网络设置中添加AFD的服务标签,或设置为允许所有访问)
- 验证DNS记录生效后再访问自定义域名
内容的提问来源于stack exchange,提问作者Herald Gjura
相关产品推荐
相关产品推荐

