使用Complete模式时Azure误报删除Bicep模块中的SQL Server资源
问题
我有一个定义了SQL Server资源的Bicep模板,已通过Incremental模式部署,该SQL Server资源已存在。当前执行az deployment group what-if --mode Complete时,报告显示该SQL Server资源将被删除。我已确认az bicep build生成的编译后ARM模板仍包含该资源。
该SQL Server资源定义在主Bicep模板引用的模块中,若将其移至主模板再执行what-if,报告则不会显示该资源将被删除,modules/database.bicep中的数据库也存在同样问题。
主模板azuredeploy.bicep代码:
var sqlServerName = 'mySqlServer' var storageAccountName = 'myStorageAccount' resource storageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' = { name: storageAccountName location: resourceGroup().location kind: 'StorageV2' sku: { name: 'Standard_LRS' } } module sqlServer 'modules/sql-server.bicep' = { name: 'sqlserver' params: { sqlServerName: sqlServerName storageAccountKey: storageAccount.listKeys().keys[0].value } }
模块modules/sql-server.bicep代码:
param sqlServerName string @secure() param storageAccountKey string resource sqlServer 'Microsoft.Sql/servers@2022-02-01-preview' = { name: sqlServerName location: resourceGroup.location() } resource sqlServerAuditSettings 'Microsoft.Sql/servers/auditingSettings@2022-02-01-preview' = { name: 'default' parent: sqlServer properties: { state: 'Enabled' storageAccountAccessKey: storageAccountKey } }
我了解Bicep模块并非单纯的组织工具,会创建独立资源部署,但不清楚为何这会影响Complete模式部署,尤其是该资源刚由我创建,请问可能的原因是什么?
原因分析
- 模块资源不在当前Complete部署的管理范围:Bicep模块部署会生成独立的嵌套子部署,Complete模式仅管控主模板直接定义的资源,以及主模板中嵌套部署当前版本包含的资源。如果执行Complete模式时,模块对应的嵌套部署因名称、参数哈希等问题无法与历史子部署关联,ARM会判定这些模块资源不在当前模板的管控范围内,从而标记为待删除。
- 资源ID的匹配逻辑差异:模块内的资源ID会嵌套在子部署的ID路径下(例如
/providers/Microsoft.Resources/deployments/sqlserver/...),而主模板直接定义的资源ID无此前缀。当what-if校验时,若模板生成的模块资源ID无法与现有资源的ID精准匹配,就会被误判为不属于当前模板,触发删除标记。 - 动态参数导致的模板哈希变化:你在模块参数中使用了
storageAccount.listKeys().keys[0].value这个实时动态值,what-if计算时会获取当前最新值,而历史部署记录中存储的是部署时的静态值。这种差异会导致嵌套部署的模板哈希改变,ARM会将其视为全新的嵌套部署,不再关联之前的子部署,原子部署下的SQL Server资源自然会被排除在当前Complete部署的范围外。
内容的提问来源于stack exchange,提问作者schimmch
相关产品推荐
相关产品推荐

