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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:07:03