使用ARM模板为Azure SQL数据库配置诊断设置时报InvalidResourceNamespace错误
Azure SQL数据库ARM诊断设置部署报错修复
报错根因
这个错误是因为嵌套资源的类型命名不符合ARM规则触发的:
- ARM解析嵌套在父资源
resources数组下的子资源时,会自动将父资源的完整类型前缀,与子资源type字段填写的相对路径拼接,生成最终可识别的完整资源类型 - 当前模板中诊断设置块的
type写为providers/diagnosticSettings,拼接后生成的完整类型为Microsoft.Sql/servers/databases/providers/diagnosticSettings - Azure资源解析器会将路径中的
providers判定为一级资源命名空间,由于providers不是合法的资源提供程序名称,因此抛出InvalidResourceNamespace非法命名空间错误 - 本质问题是漏写了诊断设置对应的归属标识:Azure诊断设置统一归属
Microsoft.Insights资源命名空间,必须在相对路径中显式声明,不能只写providers/diagnosticSettings
修正方案
按照以下三步调整模板即可正常部署:
- 将诊断设置块的
type字段从providers/diagnosticSettings修改为符合嵌套规则的相对路径providers/Microsoft.Insights/diagnosticSettings - 将诊断设置的
dependsOn字段从直接引用数据库参数值,替换为通过resourceId函数生成的SQL数据库完整资源ID,避免依赖解析异常 - 补全
logs和metrics的具体采集配置,避免部署后诊断设置无实际采集内容
修正后的诊断设置块参考代码:
{ "type": "providers/Microsoft.Insights/diagnosticSettings", "apiVersion": "2017-05-01-preview", "name": "monitor", "dependsOn": [ "[resourceId('Microsoft.Sql/servers/databases', parameters('serverName'), parameters('sqlDBName'))]" ], "properties": { "workspaceId": "[parameters('logAnalyticsWorkspaceIdForGlobalDiagnosticSetting')]", "logs": [ { "category": "SQLInsights", "enabled": true, "retentionPolicy": { "enabled": false, "days": 0 } }, { "category": "AutomaticTuning", "enabled": true, "retentionPolicy": { "enabled": false, "days": 0 } }, { "category": "QueryStoreRuntimeStatistics", "enabled": true, "retentionPolicy": { "enabled": false, "days": 0 } }, { "category": "QueryStoreWaitStatistics", "enabled": true, "retentionPolicy": { "enabled": false, "days": 0 } }, { "category": "Errors", "enabled": true, "retentionPolicy": { "enabled": false, "days": 0 } }, { "category": "DatabaseWaitStatistics", "enabled": true, "retentionPolicy": { "enabled": false, "days": 0 } }, { "category": "Timeouts", "enabled": true, "retentionPolicy": { "enabled": false, "days": 0 } }, { "category": "Blocks", "enabled": true, "retentionPolicy": { "enabled": false, "days": 0 } } ], "metrics": [ { "category": "Basic", "enabled": true, "retentionPolicy": { "enabled": false, "days": 0 } }, { "category": "InstanceAndAppAdvanced", "enabled": true, "retentionPolicy": { "enabled": false, "days": 0 } }, { "category": "WorkloadManagement", "enabled": true, "retentionPolicy": { "enabled": false, "days": 0 } } ] } }
注意事项
- 如果选择将诊断设置放在模板顶层资源数组中、而非嵌套在database资源下,需要将
type写为完整路径Microsoft.Sql/servers/databases/providers/Microsoft.Insights/diagnosticSettings,同时name字段拼接完整的三层资源路径,两种写法部署效果完全等价 - 同一资源下的诊断设置名称必须唯一,重复部署同名诊断设置会直接覆盖原有配置,不会创建新实例
- 模板中现有透明数据加密、数据库级漏洞评估块的
dependsOn写法过于简化,虽然当前场景下可能正常解析,但建议统一替换为resourceId形式的显式引用,降低复杂模板的部署失败概率
内容的提问来源于stack exchange,提问作者Manjunath Rao
相关产品推荐
相关产品推荐

