Udostępnij za pośrednictwem


Reguła lintera — brak zakodowanych na stałe lokalizacji

Ta reguła znajduje użycie wartości lokalizacji platformy Azure, które nie są sparametryzowane.

Kod reguły Linter

Użyj następującej wartości w pliku konfiguracji Bicep, aby dostosować ustawienia reguły:

no-hardcoded-location

Rozwiązanie

Użytkownicy szablonów mogą mieć ograniczony dostęp do regionów, w których mogą tworzyć zasoby. Zakodowana na stałe lokalizacja zasobu może uniemożliwić użytkownikom tworzenie zasobu, co uniemożliwia im korzystanie z szablonu. Dostarczając parametr lokalizacji domyślnej lokalizacji do lokalizacji grupy zasobów, użytkownicy mogą używać wartości domyślnej, gdy jest to wygodne, ale także określa inną lokalizację.

Zamiast używać zakodowanego na stałe ciągu lub wartości zmiennej, użyj parametru, ciągu "global" lub wyrażenia (ale nie resourceGroup().location lub , zobacz no-loc-expr-outside-paramsdeployment().location). Najlepsze rozwiązanie sugeruje, że aby ustawić lokalizacje zasobów, szablon powinien mieć parametr ciągu o nazwie location. Ten parametr może być domyślnie ustawiony na grupę zasobów lub lokalizację wdrożenia (resourceGroup().location lub deployment().location).

Poniższy przykład kończy się niepowodzeniem tego testu, ponieważ właściwość zasobu location używa literału ciągu:

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

Można go naprawić, tworząc nowy location parametr ciągu (który opcjonalnie może mieć wartość domyślną — resourceGroup().location jest często używany jako domyślny):

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

Użyj szybkiej poprawki , aby utworzyć parametr lokalizacji i zastąpić literał ciągu nazwą parametru. Zobacz poniższy zrzut ekranu:

Zrzut ekranu przedstawiający ostrzeżenie o regule linter bez zakodowanej lokalizacji z quickfix.

Poniższy przykład kończy się niepowodzeniem tego testu, ponieważ właściwość zasobu location używa zmiennej z literałem ciągu.

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

Możesz rozwiązać ten problem, zamieniając zmienną w parametr:

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

Poniższy przykład kończy się niepowodzeniem tego testu, ponieważ literał ciągu jest przekazywany do parametru modułu, który jest z kolei używany dla właściwości zasobu location :

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

gdzie module1.bicep to:

param location string

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

Błąd można naprawić, tworząc nowy parametr dla wartości:

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

Następne kroki

Aby uzyskać więcej informacji na temat lintera, zobacz Use Bicep linter (Używanie lintera Bicep).