为什么VS2019部署ARM模板时会忽略资源配置的apiVersion?
问题原因
这个报错和你Microsoft.Authorization/roleAssignments资源配置的2021-04-01-preview版本无关,报错指向的是执行模板部署操作本身使用的API版本过低:
The api-version '2017-05-10' used to deploy the template does not support 'Scope' property.
Visual Studio 2019 内置的旧版Azure资源管理器部署工具,默认调用的就是2017-05-10版本的部署API,该版本不支持在资源节点直接声明scope属性,和你资源本身的apiVersion没有关系。
解决方法
方案1:更新VS ARM工具 + 升级模板Schema(推荐)
- 首先替换模板顶部的Schema为支持
scope属性的新版声明:
把原来的
替换为"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#","$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - 打开Visual Studio Installer,找到你安装的VS2019实例,点击「修改」,在「工作负载」页更新「Azure开发」组件,确保「Azure资源管理器工具」升级到最新版本,新版工具默认使用
2019-05-01及以上版本的部署API,原生支持scope属性。
方案2:调整角色分配写法兼容旧部署API
如果暂时不想更新VS工具,可以把角色分配改成嵌套资源的写法,不需要显式声明scope属性就能兼容旧版部署API,修改后的资源部分示例:
"resources": [ // 你的storageAccount原有声明保留,这里省略 { "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments", "apiVersion": "2021-04-01-preview", "name": "[concat(parameters('storageAccountName'), '/Microsoft.Authorization/', concat(parameters('dataFactoryManagedIdentityName'), '-', parameters('storageAccountBlobContributorRoleId')))]", "location": "[resourceGroup().location]", "dependsOn": [ "[parameters('storageAccountName')]", "[parameters('dataFactoryManagedIdentityName')]" ], "tags": { "displayName": "DataLake Data Factory Managed Identity Blob Contributer Assignment" }, "properties": { "roleDefinitionId": "[parameters('storageAccountBlobContributorRoleId')]", "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('dataFactoryManagedIdentityName')), '2018-11-30').principalId]" } } ]
注:上述写法同时修正了你原模板中principalId取值错误的问题,原写法取的是托管标识的资源ID,实际应该取托管标识对应的主体ID属性
关于AzureRM版本的疑问
这个问题确实和AzureRM模块相关:AzureRM PowerShell模块早已停止维护,所有旧版AzureRM模块默认调用的都是旧版本的部署API,如果你是通过PowerShell执行部署,建议完全卸载AzureRM模块,改用官方维护的最新Az PowerShell模块即可解决。
内容的提问来源于stack exchange,提问作者mzivtins
相关产品推荐
相关产品推荐

