Linter 规则 - 无硬编码位置
此规则用于查找未参数化的 Azure 位置值的用法。
Linter 规则代码
请在 Bicep 配置文件中使用以下值自定义规则设置:
no-hardcoded-location
解决方案
模板用户对其可以创建资源的区域的访问权限可能有限。 硬编码的资源位置可能会阻止用户创建资源,从而阻止他们使用该模板。 提供默认为资源组位置的位置参数后,用户可以在方便的情况下使用默认值,也可以指定其他位置。
与其使用硬编码字符串或变量值,不如使用参数、字符串 'global' 或表达式(但不要使用 resourceGroup().location
或 deployment().location
,具体可参见 no-loc-expr-outside-params)。 最佳做法建议,若要设置资源的位置,模板应具有一个名为 location
的字符串参数。 此参数可能默认为资源组或部署位置(resourceGroup().location
或 deployment().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
}
使用“快速修复”创建位置参数,并将字符串文本替换为参数名称。 请参阅下面的屏幕截图:
下面的示例未通过此测试,因为资源的 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。