Azure Policy配置异常:无法自动为SQL托管实例数据库设置LTR
我需要创建一条Azure Policy,自动为SQL托管实例(SQL MI)中的数据库配置长期保留(LTR)策略,替代手动操作。编写的策略代码创建无报错,已分配至SQL MI所在资源组,且无角色权限问题,但新创建的数据库部署完成数小时后,仍未被配置每周(P12W)、每月(P12M)、每年(P5Y)的保留策略,请求排查原因。
提供的策略代码:
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Sql/managedInstances/databases" } ] }, "then": { "effect": "deployIfNotExists", "details": { "type": "Microsoft.Sql/managedInstances/databases/backupLongTermRetentionPolicies", "existenceCondition": { "anyOf": [ { "field": "Microsoft.Sql/managedInstances/databases/backupLongTermRetentionPolicies/weeklyRetention", "notEquals": "P12W" }, { "field": "Microsoft.Sql/managedInstances/databases/backupLongTermRetentionPolicies/monthlyRetention", "notEquals": "P12M" }, { "field": "Microsoft.Sql/managedInstances/databases/backupLongTermRetentionPolicies/yearlyRetention", "notEquals": "P5Y" } ] }, "roleDefinitionIds": [ "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c" ], "deployment": { "properties": { "mode": "incremental", "template": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "resources": [ { "type": "Microsoft.Sql/managedInstances/databases/backupLongTermRetentionPolicies", "apiVersion": "2021-02-01-preview", "name": "[concat(parameters('fullDbName'), '/default')]", "properties": { "weeklyRetention": "P12W", "monthlyRetention": "P12M", "yearlyRetention": "P5Y", "weekOfYear": 1 } } ] } }, "databaseName": { "value": "[field('name')]" } } } } }, "parameters": {} }
排查与修复要点
存在性条件逻辑错误:当前
existenceCondition使用anyOf,仅当三个保留策略中有一个不符合预期时才触发部署。但如果数据库未配置过LTR策略(对应字段不存在),notEquals判断会返回false,导致anyOf整体为false,Policy会误认为资源合规,不会执行部署。
修正方案:将existenceCondition改为检查所有保留策略是否都符合要求,这样只要有一个条件不满足(包括策略未创建的情况),就会触发部署:"existenceCondition": { "allOf": [ { "field": "Microsoft.Sql/managedInstances/databases/backupLongTermRetentionPolicies/weeklyRetention", "equals": "P12W" }, { "field": "Microsoft.Sql/managedInstances/databases/backupLongTermRetentionPolicies/monthlyRetention", "equals": "P12M" }, { "field": "Microsoft.Sql/managedInstances/databases/backupLongTermRetentionPolicies/yearlyRetention", "equals": "P5Y" } ] }部署模板参数引用错误:模板中使用
parameters('fullDbName')但未定义该参数,且deployment部分定义的参数是databaseName,两者不匹配。
修正方案:直接在模板中引用当前数据库名称,无需额外参数:"name": "[concat(field('name'), '/default')]"API版本兼容性:当前使用的
2021-02-01-preview是预览版API,建议替换为稳定版(如2022-05-01-preview或更高),避免预览版潜在的兼容性问题。手动触发合规性扫描:Azure Policy默认24小时执行一次定期评估,新资源可能延迟触发。可在Azure门户的Policy分配页面,选择「合规性扫描」->「立即扫描」,强制触发评估。
内容的提问来源于stack exchange,提问作者Dan

