Linter 规则 - 无硬编码位置

此规则用于查找未参数化的 Azure 位置值的用法。

Linter 规则代码

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

no-hardcoded-location

解决方案

模板用户对其可以创建资源的区域的访问权限可能有限。 硬编码的资源位置可能会阻止用户创建资源,从而阻止他们使用该模板。 提供默认为资源组位置的位置参数后,用户可以在方便的情况下使用默认值,也可以指定其他位置。

与其使用硬编码字符串或变量值,不如使用参数、字符串 'global' 或表达式(但不要使用 resourceGroup().locationdeployment().location,具体可参见 no-loc-expr-outside-params)。 最佳做法建议,若要设置资源的位置,模板应具有一个名为 location 的字符串参数。 此参数可能默认为资源组或部署位置(resourceGroup().locationdeployment().location)。

下面的示例未通过此测试,因为资源的 location 属性使用字符串字面量:

  resource stg 'Microsoft.Storage/storageAccounts@2021-02-01' = {
      location: 'chinanorth'
  }

可以通过创建新的 location 字符串参数(该参数可以选择性地包含默认值 - resourceGroup().location,常用作默认值)来解决此问题:

  param location string = resourceGroup().location
  resource stg 'Microsoft.Storage/storageAccounts@2021-02-01' = {
      location: location
  }

使用“快速修复”创建位置参数,并将字符串文本替换为参数名称。 请参阅下面的屏幕截图:

The screenshot of No hardcoded location linter rule warning with quickfix.

下面的示例未通过此测试,因为资源的 location 属性使用含字符串字面量的变量。

  var location = 'chinanorth'
  resource stg 'Microsoft.Storage/storageAccounts@2021-02-01' = {
      location: location
  }

可以通过将变量转换为参数来解决问题:

  param location string = 'chinanorth'
  resource stg 'Microsoft.Storage/storageAccounts@2021-02-01' = {
      location: location
  }

下面的示例未通过此测试,因为字符串字面量被传递到模块参数,而该模块参数又用于资源的 location 属性:

module m1 'module1.bicep' = {
  name: 'module1'
  params: {
    location: 'chinanorth'
  }
}

其中 module1.bicep 为:

param location string

resource storageaccount 'Microsoft.Storage/storageAccounts@2021-02-01' = {
  name: 'storageaccount'
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Premium_LRS'
  }
}

可以通过为以下值创建新参数来修复失败:

param location string // optionally with a default value
module m1 'module1.bicep' = {
  name: 'module1'
  params: {
    location: location
  }
}

后续步骤

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