Bicep部署ILB ASE v3首次成功,后续重部署报‘Not Supported’错误
使用ARM模板/Bicep更新ILB ASE v3或在流水线中重复部署是完全受支持的,你遇到的"Not Supported"错误通常是由模板中特定属性的更新逻辑或API版本限制导致的,而非重新部署本身不被支持。
错误分析
你看到的BadRequest错误信息缺乏详细上下文,但结合你的Bicep代码,可能的触发点包括以下几个方面:
1. Networking配置资源的属性更新限制
你的ASE模块中定义了Microsoft.Web/hostingEnvironments/configurations@2022-03-01资源(networking配置),其中部分属性的更新在旧API版本中可能存在限制:
allowNewPrivateEndpointConnections:该属性在某些场景下不支持通过模板更新remoteDebugEnabled:ASE v3的远程调试设置变更可能需要通过门户或CLI操作,而非模板
2. API版本兼容性问题
你使用的Microsoft.Web/hostingEnvironments@2022-03-01 API版本相对较旧,部分更新逻辑在新版本中已被修复或优化。
3. 诊断设置的作用域定义问题
诊断设置资源中使用scope: appServiceEnvironment的嵌套方式,可能在重复部署时触发资源关联冲突。
4. 不必要的空值/类型转换
代码中multiSize: !empty(multiSize) ? any(multiSize) : null的any()转换可能导致Azure资源管理器解析异常。
修复方案
针对上述问题,按以下步骤调整你的Bicep代码:
步骤1:升级API版本
将ASE及相关配置资源的API版本升级到最新稳定版(如2023-08-01):
resource appServiceEnvironment 'Microsoft.Web/hostingEnvironments@2023-08-01' = { // ... 现有属性 } resource configuration 'Microsoft.Web/hostingEnvironments/configurations@2023-08-01' = { // ... 现有属性 }
步骤2:调整Networking配置的可更新属性
移除或条件化处理不支持更新的属性,例如:
resource configuration 'Microsoft.Web/hostingEnvironments/configurations@2023-08-01' = { name: 'networking' parent: appServiceEnvironment properties: { // 仅保留支持模板更新的属性 ftpEnabled: ftpEnabled inboundIpAddressOverride: inboundIpAddressOverride } }
若需设置allowNewPrivateEndpointConnections或remoteDebugEnabled,可通过Azure CLI在首次部署后单独配置,而非纳入模板重复部署。
步骤3:修正诊断设置的定义
移除scope属性,通过targetResourceId明确关联ASE资源:
resource appServiceEnvironment_diagnosticSettings 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = if (!empty(diagnosticStorageAccountId) || !empty(diagnosticWorkspaceId)) { name: !empty(diagnosticSettingsName) ? diagnosticSettingsName : '${name}-diagnosticSettings' properties: { targetResourceId: appServiceEnvironment.id storageAccountId: !empty(diagnosticStorageAccountId) ? diagnosticStorageAccountId : null workspaceId: !empty(diagnosticWorkspaceId) ? diagnosticWorkspaceId : null eventHubAuthorizationRuleId: !empty(diagnosticEventHubAuthorizationRuleId) ? diagnosticEventHubAuthorizationRuleId : null eventHubName: !empty(diagnosticEventHubName) ? diagnosticEventHubName : null logs: diagnosticsLogs } }
步骤4:移除不必要的类型转换
将multiSize的赋值逻辑简化:
multiSize: empty(multiSize) ? null : multiSize
步骤5:固定模块部署名称
主Bicep中的模块名称可简化为固定值,避免不必要的部署记录生成:
module appServiceEnvironmentv3 'br/Compute:asev3:v0.1' = { name: 'asev3-${appServiceEnvironment.name}-deploy' // ... 现有参数和作用域 }
验证
调整完成后,先通过az deployment group validate命令验证模板,再执行增量部署,确认错误是否消除。
内容的提问来源于stack exchange,提问作者Phil Murray

