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: 'westus'
  }

建立新的 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 = 'westus'
  resource stg 'Microsoft.Storage/storageAccounts@2021-02-01' = {
      location: location
  }

將變數改為參數可修正此問題:

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

下列範例會導致此測試失敗,因為字串常值會傳遞至模組參數,然後再用於資源的 location 屬性:

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

其中 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