Azure APIM中通过ARM模板添加WebSocket策略时遇验证错误
解决ARM模板部署Azure API Management WebSocket API策略时的"Not allowed at 'Api' scope"错误
问题现象
尝试通过ARM模板为Azure APIM中的WebSocket端点添加策略时,收到以下验证错误:
"error": { "code": "ValidationError", "message": "Not allowed at 'Api' scope for 'WEBSOCKET' api type" }
同一策略部署到Web API时可成功执行,且手动在Azure Portal中为WebSocket API添加策略也能正常完成,但通过ARM模板单独部署策略时失败。
错误原因
ARM模板中Microsoft.ApiManagement/service/apis/policies子资源类型仅支持REST/HTTP类型的API,对于WebSocket类型的API,不允许单独创建该子资源来部署策略。而Azure Portal手动添加策略时,本质是直接修改WebSocket API资源本身的policies属性,而非创建独立的子资源,因此可以成功。
解决方案
方法1:将策略嵌入WebSocket API的ARM模板定义中
如果是同时部署WebSocket API和策略,直接在API资源的properties中添加policies字段,将策略内容(XML格式)直接写入或通过参数引用:
示例修改后的WebSocket API资源片段:
{ "type": "Microsoft.ApiManagement/service/apis", "apiVersion": "2022-04-01-preview", "name": "[concat(parameters('ApimServiceName'), '/', variables('env'))]", "properties": { "displayName": "[variables('env')]", "apiType": "websocket", "protocols": ["wss"], "serviceUrl": "[variables('svc')]", // 直接嵌入策略内容 "policies": "<policies><inbound><base /></inbound><backend><base /></backend><outbound><base /></outbound><on-error><base /></on-error></policies>" } }
方法2:单独更新WebSocket API策略(非ARM模板方式)
如果需要单独更新已存在的WebSocket API策略,可使用Azure CLI或APIM REST API:
- Azure CLI命令示例:
az apim api update --resource-group <rg-name> --service-name <apim-name> --api-id <websocket-api-id> --set policies="<policies><inbound>...</inbound></policies>"
原模板问题说明
你提供的单独部署策略的ARM模板使用了Microsoft.ApiManagement/service/apis/policies子资源,这对于WebSocket API是不被支持的,因此需要替换为上述嵌入到API资源的方式。
内容的提问来源于stack exchange,提问作者prakashrajansakthivel
相关产品推荐
相关产品推荐

