Azure Bicep重复部署时What if命令显示资源变更的原因咨询
App Service Plan 变更项分析
kind: "app"被标记为删除
你的Bicep模板中把ASP的kind设为空字符串'',但Azure创建App Service Plan时,会自动为Windows类型的ASP填充默认值app。二次部署时,Bicep会尝试将实际存在的kind值改为模板定义的空字符串,因此what-if检测到这个差异并标记为删除操作。sku.capacity: 0 => 1
这是免费层(F1)ASP的特殊表现:Azure免费层ASP创建后,部分API版本返回的sku.capacity会显示为0,但实际运行容量始终是1。模板中明确指定了capacity: 1,所以what-if会检测到模板值与资源返回值的差异,显示要将其改回1,但这个变更不会影响ASP的实际运行状态。
App Service 变更项分析
+ properties.siteConfig.localMySqlEnabled: false 和 + properties.siteConfig.netFrameworkVersion: "v4.6" 是Azure为App Service自动设置的默认配置。模板中未定义siteConfig节点,首次部署时Azure会自动添加这些默认值;二次部署时,what-if会将模板未声明的属性视为“待添加”差异,但实际部署时不会修改这些属性,Bicep只会管理模板中明确声明的配置。
修复与优化方案
调整模板即可消除不必要的what-if差异:
修正App Service Plan的
kind属性
明确指定ASP的kind值(Windows填app,Linux填linux),避免Azure自动填充导致的差异:resource azBicepAsp1 'Microsoft.Web/serverfarms@2020-12-01' = { name: 'test-dev-aue-asp1' location: resourceGroup().location kind: 'app' // 明确指定kind值 sku: { name: 'F1' capacity: 1 } }消除免费层capacity差异(可选)
免费层容量固定为1,可从模板中移除capacity配置,避免不必要的差异提示:sku: { name: 'F1' }显式定义App Service默认配置(可选)
若不想看到siteConfig的差异提示,可在模板中显式添加默认值,让模板与实际资源配置一致:resource azbicepas 'Microsoft.Web/sites@2021-01-15' = { name: 'test-dev-aue-wapp1' location: resourceGroup().location properties: { serverFarmId: azBicepAsp1.id // 直接引用资源ID,比手动拼接更可靠 siteConfig: { localMySqlEnabled: false netFrameworkVersion: 'v4.6' } } dependsOn:[ azBicepAsp1 ] }
内容的提问来源于stack exchange,提问作者Alex

