我有一个指定 SQL Server 资源的二头肌模板。我已经部署了此模板(在增量模式下)并且 SQL Server 资源存在。 当我现在运行
az deployment group what-if --mode Complete
时,报告指出
SQL Server 资源将被删除。
我检查过 az bicep build
生成的编译后的 ARM 模板仍然包含
资源,确实如此。
SQL Server 资源在主二头肌模板使用的二头肌模块中指定。如果我将资源移动到主二头肌模板中并运行
what-if
,报告不会说 SQL Server 将被删除。我在 modules/database.bicep
中看到了与数据库相同的行为。
主要
azuredeploy.bicep
包含:
param sqlServerName string
module sqlServer 'modules/sql-server.bicep' = {
name: 'sqlserver'
params: {
sqlServerName: sqlServerName
}
}
module databaseOne 'modules/database.bicep' = { ...etc }
// My overall goal is to delete this database
module databaseTwo 'modules/database.bicep' = { ...etc }
并且
modules/sql-server.bicep
包含:
resource sqlServer 'Microsoft.Sql/servers@2022-02-01-preview' = {
name: sqlServerName
location: resourceGroup.location()
identity: { type: 'SystemAssigned' }
properties: {
minimalTlsVersion: '1.2'
version: '12.0'
}
}
这里可能发生了什么?我知道二头肌模块并不纯粹是组织性的,实际上会创建单独的资源部署,但我不清楚这是否会影响完整部署,特别是如果我刚刚创建了该资源。
问题似乎与 Azure 在使用 Bicep 模块时如何处理完整模式下的部署有关。使用完整模式时,Azure 会将资源组的当前状态与模板进行比较,并删除当前部署范围中未明确定义的资源。由于 Bicep 模块创建自己的部署范围,因此
modules/sql-server.bicep
中定义的 SQL Server 资源被视为单独部署的一部分。
在您的情况下,模块中的
sqlServer
资源可能不会被识别为主模板完整部署的一部分,因为模块的部署范围未显式链接到主模板。当您将资源直接移动到主模板中时,它将成为主部署范围的一部分,从而解决了问题。
要解决此问题而不将资源移动到主模板中,您可以确保完整模式下的部署引用模块中的所有资源。这可以通过在主模板中添加对模块部署输出的引用或重新考虑如何构建模块和部署来完成。
问题的核心在于Complete模式如何评估跨不同范围的资源。如果 Azure 在当前部署范围内没有看到资源,它会假定该资源应该被删除,即使它存在于模块中。您可以考虑使用增量模式,除非您有特定原因需要完整模式。