如何在Bicep中通过符号名称引用应用网关探测而非字符串
在Bicep中引用应用网关探测的正确方式
你碰到的错误是因为在同一资源内部通过字符串插值引用自身ID属于循环引用,Bicep禁止这种写法。要解决这个问题,完全可以通过符号名称直接引用探测,推荐两种实现方式:
方式一:使用嵌套资源定义探测(推荐)
将探测定义为应用网关的嵌套资源,这样就能直接通过资源符号引用其ID,无需硬编码字符串:
resource agw_foo_resource 'Microsoft.Network/applicationGateways@2023-05-01' = { name: 'FooAGW' location: location ... properties: { backendHttpSettingsCollection: [ { name: 'Be_Settings_HTTPS' properties: { port: 443 protocol: 'Https' cookieBasedAffinity: 'Disabled' pickHostNameFromBackendAddress: true affinityCookieName: 'ApplicationGatewayAffinity' requestTimeout: 20 probe: { id: be_health_probe.id // 直接引用嵌套探测资源的ID } } } ] } // 把探测声明为应用网关的嵌套资源 resource be_health_probe 'probes' = { name: 'Be_HealthProbe' properties: { protocol: 'Https' path: '/' interval: 30 timeout: 30 unhealthyThreshold: 3 pickHostNameFromBackendHttpSettings: true minServers: 0 match: { statusCodes: [ '200-399' ] } } } }
这种写法符合Bicep的设计逻辑,代码可读性更强,也避免了后续数组顺序变更导致的引用错误。
方式二:通过数组索引引用(不推荐)
如果坚持保留probes数组的写法,可以通过资源的属性数组索引来引用探测ID:
resource agw_foo_resource 'Microsoft.Network/applicationGateways@2023-05-01' = { name: 'FooAGW' location: location ... properties: { backendHttpSettingsCollection: [ { name: 'Be_Settings_HTTPS' properties: { port: 443 protocol: 'Https' cookieBasedAffinity: 'Disabled' pickHostNameFromBackendAddress: true affinityCookieName: 'ApplicationGatewayAffinity' requestTimeout: 20 probe: { id: agw_foo_resource.properties.probes[0].id // 引用数组中第一个探测的ID } } } ] probes: [ { name: 'Be_HealthProbe' properties: { protocol: 'Https' path: '/' interval: 30 timeout: 30 unhealthyThreshold: 3 pickHostNameFromBackendHttpSettings: true minServers: 0 match: { statusCodes: [ '200-399' ] } } } ] } }
注意:这种方式依赖数组的顺序,一旦probes数组中元素顺序调整,引用就会失效,所以不推荐使用。
内容的提问来源于stack exchange,提问作者Greg B
相关产品推荐
相关产品推荐

