Compartilhar via


Regra de linter – Sem localizações embutidas em código

Essa regra localiza usos de valores de localização do Azure que não estão parametrizados.

Código de regra linter

Use o seguinte valor no arquivo de configuração Bicep para personalizar as configurações de regra:

no-hardcoded-location

Solução

Os usuários do modelo podem ter acesso limitado a regiões em que podem criar recursos. Uma localização de recurso embutida em código pode impedir que os usuários criem um recurso, portanto, impedindo que eles usem o modelo. Ao fornecer um parâmetro de local que usa como padrão o local do grupo de recursos, os usuários podem usar o valor padrão quando for conveniente, mas também especificar um local diferente.

Em vez de usar uma cadeia de caracteres ou um valor de variável embutido em código, use um parâmetro, a cadeia de caracteres 'global' ou uma expressão (mas não resourceGroup().location nem deployment().location. Confira no-loc-expr-outside-params). A prática recomendada é que, para definir a localização dos recursos, o modelo deve ter um parâmetro de cadeia de caracteres chamado location. Esse parâmetro pode usar como padrão a localização do grupo de recursos ou da implantação (resourceGroup().location ou deployment().location).

O seguinte exemplo falha neste teste porque a propriedade location do recurso usa um literal de cadeia de caracteres:

  resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
      location: 'westus'
  }

Corrija isso criando um parâmetro de cadeia de caracteres location (que pode ter um valor padrão opcional. Geralmente, resourceGroup().location é usado como padrão):

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

Use a Correção Rápida para criar um parâmetro de local e substituir o literal de cadeia de caracteres pelo nome do parâmetro. Veja a seguinte captura de tela:

A captura de tela de Nenhum aviso de regra de linter de local codificado com quickfix.

O exemplo a seguir falha neste teste porque a propriedade location do recurso usa uma variável com um literal de cadeia de caracteres.

  var location = 'westus'
  resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' = {
      location: location
  }

Corrija isso transformando a variável em um parâmetro:

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

O seguinte exemplo falha neste teste porque um literal de cadeia de caracteres está sendo passado para um parâmetro de módulo que será usado para a propriedade location de um recurso:

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

em que module1.bicep é:

param location string

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

Corrija a falha criando um parâmetro para o valor:

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

Próximas etapas

Para saber mais sobre o linter, confira Usar o linter do Bicep.