Azure Functions迁移至Container Apps后自定义域名配置及证书绑定问题
前置:解决添加域名时的Deny Assignment错误
Failed to add hostname myCustomDomainName.The client 'myusername@myWorkDomainName' with object id 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' has permission to perform action 'Microsoft.App/containerApps/write' on scope '/subscriptions/yyyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyy/resourceGroups/myResourceGroupName_FunctionApps_zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz/providers/Microsoft.App/containerApps/myFunctionAppName'; however, the access is denied because of the deny assignment with name 'zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz' and Id 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz' at scope '/subscriptions/yyyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyy/resourceGroups/myResourceGroupName_FunctionApps_zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz'.
自动生成的myResourceGroupName_FunctionApps_xxx资源组是Azure Functions托管Container Apps的系统托管资源组,默认带有Deny Assignment限制直接修改其中的Container Apps资源。操作自定义域名需通过Function App门户视图的配置入口,或使用ARM模板/CLI绕过门户限制。
1. 为托管在Container App上的Function App配置自定义域名
操作步骤:
- 域名所有权验证
在DNS服务商处添加TXT记录:- 记录类型:
TXT - 主机名:
asuid.<你的自定义域名> - 值:通过CLI命令
az functionapp show --name <func-name> --resource-group <your-rg> --query "customVerificationId"获取的验证令牌
- 记录类型:
- 添加自定义域名
- 进入Azure Functions门户视图,选择「设置」->「自定义域名」,点击「添加自定义域名」,输入域名完成验证后添加
- 若门户操作受限,使用Azure CLI命令:
az functionapp config hostname add --name <func-app-name> --resource-group <your-main-rg> --hostname <your-custom-domain>
- 配置DNS解析
在DNS服务商处添加对应记录:- CNAME记录:主机名指向
<func-app-name>.azurewebsites.net - A记录:主机名指向Function App的IP地址(通过
az functionapp show --name <func-name> --resource-group <rg> --query "defaultHostName"解析获取)
- CNAME记录:主机名指向
2. 通过ARM模板完成自定义域名配置
以下是整合到Function App部署模板的核心片段:
{ "type": "Microsoft.Web/sites", "apiVersion": "2023-12-01", "name": "[parameters('functionAppName')]", "location": "[parameters('location')]", "properties": { "hostNames": [ "[parameters('customDomain')]", "[concat(parameters('functionAppName'), '.azurewebsites.net')]" ], "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]", "siteConfig": { "appSettings": [ // 此处保留你的应用配置项 ] } }, "dependsOn": [ "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]" ] }
注意事项:
- 即使Function App托管在Container Apps上,仍需以
Microsoft.Web/sites资源类型定义 - 部署前必须完成域名所有权验证
3. 从CAE导入证书并绑定至域名(含ARM模板)
手动配置步骤:
- 获取CAE中的证书
进入Container Apps Environment门户视图,在「证书」选项卡中确认已导入的TLS证书并记录其指纹 - 绑定证书到域名
- 进入Function App门户视图的「自定义域名」页面,找到已添加的域名,点击「添加绑定」,选择目标证书并设置SSL类型为
SNI SSL - 若门户操作受限,使用CLI命令:
az functionapp config ssl bind --name <func-app-name> --resource-group <your-rg> --certificate-thumbprint <cert-thumbprint> --ssl-type SNI --hostname <your-custom-domain>
- 进入Function App门户视图的「自定义域名」页面,找到已添加的域名,点击「添加绑定」,选择目标证书并设置SSL类型为
ARM模板实现证书绑定
在Function App的ARM模板中添加hostNameSslStates配置:
{ "type": "Microsoft.Web/sites", "apiVersion": "2023-12-01", "name": "[parameters('functionAppName')]", "location": "[parameters('location')]", "properties": { "hostNames": [ "[parameters('customDomain')]", "[concat(parameters('functionAppName'), '.azurewebsites.net')]" ], "hostNameSslStates": [ { "name": "[parameters('customDomain')]", "sslState": "SniEnabled", "thumbprint": "[parameters('certificateThumbprint')]", "toUpdate": true } ], "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]" }, "dependsOn": [ "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]" ] }
注意事项:
- 确保证书与Function App处于同一资源组,或部署身份有权限访问CAE所在资源组的证书
- 替换
certificateThumbprint为目标证书的指纹值
内容的提问来源于stack exchange,提问作者IvanD

