Linter 规则 - 将显式值用于模块位置参数

此规则查找用于资源位置的模块参数,以及可能无意中默认为非预期值。

Linter 规则代码

请在 Bicep 配置文件中使用以下值自定义规则设置:

explicit-values-for-loc-params

解决方案

使用模块时,应为具有默认值的任何位置相关参数分配一个显式值。 与位置相关的参数包括具有引用 resourceGroup().locationdeployment().location 的默认值的参数,以及从资源的位置属性引用的任何参数。

若要使用 bicep 文件作为主要部署模板,默认为资源组或部署位置的参数非常方便。 但是,当在模块中使用此类默认值时,如果主模板的资源与资源组不在同一区域中,则可能会导致出现意外行为。

示例

下面的示例未通过此测试。 没有为模块 m1 的参数 location 分配显式值,因此如 module1.bicep 中所指定,它将默认为 resourceGroup().location。 但使用资源组位置可能不是预期的行为,因为 main.bicep 中其他资源的创建位置可能不同于资源组位置。

main.bicep:

param location string = 'chinaeast'

module m1 'module1.bicep' = {
 name: 'm1'
}

resource storageaccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: 'storageaccount'
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

module1.bicep:

param location string = resourceGroup().location

resource stg 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: 'stg'
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Premium_LRS'
  }
}

可以通过显式传递模块的 location 属性值来修复失败:

main.bicep:

param location string = 'chinaeast'

module m1 'module1.bicep' = {
  name: 'm1'
  params: {
   location: location // An explicit value will override the default value specified in module1.bicep
  }
}

resource storageaccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: 'storageaccount'
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

后续步骤

有关 Linter 的详细信息,请参阅使用 Bicep Linter