如何配置Azure策略禁止为已有诊断设置的资源添加第二个诊断设置?
解决Azure策略禁止重复添加诊断设置的问题
你的原策略直接拒绝所有Microsoft.Insights/diagnosticSettings类型的资源创建,这会导致第一个诊断设置也无法添加,而且没有关联目标资源的已有诊断设置检查,完全不符合需求。
以下是可以实现需求的正确策略代码:
{ "mode": "Indexed", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Insights/diagnosticSettings" }, { "exists": "true", "field": "Microsoft.Insights/diagnosticSettings/resourceId", "namespace": "Microsoft.Insights", "resourceType": "diagnosticSettings", "scope": "[field('Microsoft.Insights/diagnosticSettings/resourceId')]" } ] }, "then": { "effect": "deny" } }, "parameters": { "targetResourceTypes": { "type": "Array", "metadata": { "displayName": "目标资源类型", "description": "指定需要限制重复诊断设置的资源类型,例如['Microsoft.Compute/virtualMachines', 'Microsoft.Storage/storageAccounts']" }, "defaultValue": [] } } }
关键逻辑说明
- mode: Indexed:诊断设置属于子资源,使用Indexed模式才能正确关联父资源的属性进行检查。
- allOf条件组合:
- 先判断当前创建的资源是诊断设置类型;
- 通过
exists函数,针对要绑定诊断设置的目标资源(由resourceId字段指定),检查该资源下是否已经存在至少一个诊断设置。scope参数限定了检查范围,确保只验证当前目标资源的已有配置。
- 参数配置:可选的
targetResourceTypes参数可以让你指定需要应用该限制的资源类型,避免全局生效到所有资源。
如果需要精准限制特定资源类型,可在allOf数组中添加以下条件:
{ "field": "Microsoft.Insights/diagnosticSettings/resourceId", "like": "[concat('*/', parameters('targetResourceTypes')[*])]" }
内容的提问来源于stack exchange,提问作者jarvis93
相关产品推荐
相关产品推荐

