如何在Azure DeployIfNotExists策略中正确引用资源名称?
解决Azure Policy中DeployIfNotExists模板引用目标存储账户名称的问题
错误原因
直接调用resourceId().name会触发验证错误,因为resourceId()函数要求至少传入2个参数(资源命名空间和资源名称),无参数调用不符合语法规范。
正确引用方式
在DeployIfNotExists类型的策略中,要获取触发评估的目标存储账户名称,需使用策略内置的field()表达式,直接提取目标资源的名称属性。
完整策略片段示例
{ "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Storage/storageAccounts" }, { "field": "Microsoft.Storage/storageAccounts/allowBlobPublicAccess", "notEquals": true } ] }, "then": { "effect": "DeployIfNotExists", "details": { "type": "Microsoft.Storage/storageAccounts", "roleDefinitionIds": [ "/providers/Microsoft.Authorization/roleDefinitions/17d1049b-9a84-46fb-8f53-869881c3d3ab" ], "deployment": { "properties": { "mode": "Incremental", "template": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "storageAccountName": { "type": "string" }, "location": { "type": "string" }, "skuName": { "type": "string" } }, "resources": [ { "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2021-04-01", "name": "[parameters('storageAccountName')]", "location": "[parameters('location')]", "sku": { "name": "[parameters('skuName')]" }, "properties": { "allowBlobPublicAccess": true } } ] }, "parameters": { "storageAccountName": { "value": "[field('name')]" }, "location": { "value": "[field('location')]" }, "skuName": { "value": "[field('sku.name')]" } } } } } } } }
关键说明
- 在策略的
parameters映射中,通过[field('name')]直接获取触发策略的存储账户名称,传递给ARM模板的对应参数。 - 模板中直接引用参数
[parameters('storageAccountName')]作为存储账户的名称,避免了resourceId()函数的错误调用。 - 同理,目标资源的位置、SKU等属性也可以通过
field()表达式提取,确保模板配置与目标资源一致。
内容的提问来源于stack exchange,提问作者user13696433
相关产品推荐
相关产品推荐

