为什么ARM模板会忽略VS2019中的apiVersion?

Why does ARM template ignore apiVersion in VS2019?

使用visual studio 2019 ARM ResourceGroup部署项目:

当尝试将 Microsoft.Authorization/roleAssignments.scope 与 .apiVersion“2021-04-01-preview”一起使用时,部署失败,说明:The api-version '2017-05-10' used to deploy the template does not support 'Scope' property. Please use api-version '2019-05-01' or later to deploy the template.

A​​RM模板如下:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountBlobContributorRoleId": {
      "type": "string"
    },
    "dataFactoryManagedIdentityName": {
      "type": "string"
    },
    "storageAccountName": {
      "type": "string"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2021-04-01-preview",
      "location": "[resourceGroup().location]",
      "name": "[concat(parameters('dataFactoryManagedIdentityName'), '-', parameters('storageAccountBlobContributorRoleId'))]",
      "scope": "[concat('Microsoft.Storage/storageAccounts', '/', parameters('storageAccountName'))]",
      "dependsOn": [
        "[parameters('storageAccountName')]",
        "[parameters('dataFactoryManagedIdentityName')]"
      ],
      "tags": {
        "displayName": "DataLake Data Factory Managed Identity Blob Contributer Assignment"
      },
      "properties": {
        "roleDefinitionId": "[parameters('storageAccountBlobContributorRoleId')]",
        "principalId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('dataFactoryManagedIdentityName'))]"
      }
    }
  ],
  "outputs": {}
}

我是不是看错了,我需要更改其他地方的另一个 Api 版本参考?可能是 AzureRM 版本等吗?非常感谢任何帮助。

如果您使用的是 VS Azure 资源组项目附带的 PS 脚本版本...并且仍在使用 AzureRM cmdlet,那么这可能就是问题所在。

错误消息中引用的 apiVersion 与模板中的 apiVersion 无关,而是与用于部署模板的 apiVersion 相关。该版本包含在 PS cmdlet 中,因此更改它的唯一方法是更新 cmdlet。 AFAIKI 没有支持该 apiVersion 的 cmdlet 的 AzureRM 版本。您可以尝试的几件事:

  1. 这是一个类似于 VS 使用的脚本,但使用了新的 cmdlet。 IDK 如果你可以从 VS 调用它,但你可以 运行 在 cmd 行上查看它是否解决了问题: https://github.com/Azure/azure-quickstart-templates/blob/master/Deploy-AzTemplate.ps1

  2. 不使用作用域属性,而是在roleAssignment

    上使用[更复杂的]扩展资源格式
    {
      "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments",
      "apiVersion": "2021-04-01-preview",
      "name": "[concat(variables('storageAccountName'), '/Microsoft.Authorization/', variables('roleAssignmentName'))]"
      "location": "[resourceGroup().location]",
    }

有些不相关,但您的 roleAssignment 名称应该是一个 guid(),带有 principal、roleDef 和范围 (storageAccount) 的种子,以便它在您的租户中足够独特。