为什么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.
ARM模板如下:
{
"$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 版本。您可以尝试的几件事:
这是一个类似于 VS 使用的脚本,但使用了新的 cmdlet。 IDK 如果你可以从 VS 调用它,但你可以 运行 在 cmd 行上查看它是否解决了问题:
https://github.com/Azure/azure-quickstart-templates/blob/master/Deploy-AzTemplate.ps1
不使用作用域属性,而是在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) 的种子,以便它在您的租户中足够独特。
使用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.
ARM模板如下:
{
"$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 版本。您可以尝试的几件事:
这是一个类似于 VS 使用的脚本,但使用了新的 cmdlet。 IDK 如果你可以从 VS 调用它,但你可以 运行 在 cmd 行上查看它是否解决了问题: https://github.com/Azure/azure-quickstart-templates/blob/master/Deploy-AzTemplate.ps1
不使用作用域属性,而是在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) 的种子,以便它在您的租户中足够独特。