ARM脚本创建绑定Function App上游的无服务器SignalR的循环依赖问题咨询
循环依赖问题解决说明
完全可以通过预定义Function App密钥的方式绕开自动生成密钥的时序限制,实现全流程自动化部署,以下是具体实现方案:
核心原理
循环依赖的根源在于两个资源的配置互相依赖对方的输出值,且默认signalr_extension密钥需要SignalR触发的函数部署完成后才会自动生成。我们通过提前手动预定义该密钥的固定值,绕开自动生成的逻辑,就可以提前拿到密钥值用于SignalR的Upstream配置,同时该预定义的密钥会被后续部署的SignalR扩展直接识别使用,不会被覆盖。
你之前尝试用listkeys/listsecrets获取失败的核心原因是,默认部署阶段signalr_extension密钥资源还未生成,自然无法获取到返回值。
ARM模板实现步骤
- 第一步:预生成随机密钥,可通过ARM内置的
uniqueString函数生成,也可以作为安全参数传入模板,避免硬编码。 - 第二步:优先创建Serverless模式的Azure SignalR资源,输出其连接字符串备用。
- 第三步:创建Function App资源,配置
AzureSignalRConnectionString应用设置为上一步拿到的SignalR连接串,同时通过Microsoft.Web/sites/host/functionKeys资源类型提前写入预定义的signalr_extension密钥:
{ "type": "Microsoft.Web/sites/host/functionKeys", "apiVersion": "2022-03-01", "name": "[concat(parameters('functionAppName'), '/default/signalr_extension')]", "dependsOn": [ "[resourceId('Microsoft.Web/sites', parameters('functionAppName'))]" ], "properties": { "name": "signalr_extension", "value": "[parameters('predefinedSignalrExtensionKey')]" } }
- 第四步:待Function App和预定义密钥资源创建完成后,更新SignalR资源的Upstream Setting,直接用预定义的密钥拼接URL模板即可,无需调用
listkeys获取。
Azure CLI脚本实现步骤
- 第一步:生成随机的预定义密钥
predefinedKey=$(openssl rand -hex 16)
- 第二步:创建SignalR资源并获取连接串
az signalr create -n <你的SignalR名称> -g <资源组名称> --sku Standard_S1 --unit-count 1 --service-mode Serverless signalrConnStr=$(az signalr key list -n <你的SignalR名称> -g <资源组名称> --query primaryConnectionString -o tsv)
- 第三步:创建Function App并配置SignalR连接串
# 请根据你的实际 runtime 替换参数 az functionapp create -n <你的Function App名称> -g <资源组名称> --storage-account <关联存储账号名称> --consumption-plan-location <区域> --runtime dotnet-isolated az functionapp config appsettings set -n <你的Function App名称> -g <资源组名称> --settings AzureSignalRConnectionString=$signalrConnStr
- 第四步:手动写入预定义的
signalr_extension密钥
az functionapp keys set -n <你的Function App名称> -g <资源组名称> --key-type functionKeys --key-name signalr_extension --key-value $predefinedKey
- 第五步:更新SignalR的Upstream配置
az signalr upstream update -n <你的SignalR名称> -g <资源组名称> --template "url-template=https://<你的Function App名称>.azurewebsites.net/runtime/webhooks/signalr?code=$predefinedKey"
如果你不想手动预定义密钥,也可以采用三阶段部署流程:第一阶段部署SignalR拿到连接串,第二阶段部署Function App+上传函数代码等待
signalr_extension自动生成,第三阶段通过az functionapp keys list获取生成的密钥再更新SignalR的Upstream配置,只是流程会多一个部署阶段。
内容的提问来源于stack exchange,提问作者pathrider
相关产品推荐
相关产品推荐

