Wzorzec zestawu konfiguracji

Zamiast definiować wiele pojedynczych parametrów, utwórz wstępnie zdefiniowane zestawy wartości. Podczas wdrażania wybierz zestaw wartości do użycia.

Kontekst i problem

Pojedynczy plik Bicep często definiuje wiele zasobów. Każdy zasób może wymagać użycia innej konfiguracji w zależności od wdrażanego środowiska. Możesz na przykład utworzyć plik Bicep, który wdraża plan App Service i aplikację oraz konto magazynu. Każdy z tych zasobów ma wiele opcji, które wpływają na koszt, dostępność i odporność. W środowiskach produkcyjnych chcesz użyć jednego zestawu konfiguracji, który określa priorytet wysokiej dostępności i odporności. W środowiskach nieprodukcyjnych chcesz użyć innego zestawu konfiguracji, który określa priorytety redukcji kosztów.

Można utworzyć parametry dla każdego ustawienia konfiguracji, ale ma to pewne wady:

  • Takie podejście stanowi obciążenie dla użytkowników szablonu, ponieważ muszą zrozumieć wartości, które mają być używane dla każdego zasobu, oraz wpływ ustawienia każdego parametru.
  • Liczba parametrów w szablonie zwiększa się wraz z każdym nowym zdefiniowanym zasobem.
  • Użytkownicy mogą wybierać kombinacje wartości parametrów, które nie zostały przetestowane lub które nie będą działać poprawnie.

Rozwiązanie

Utwórz pojedynczy parametr, aby określić typ środowiska. Użyj zmiennej, aby automatycznie wybrać konfigurację dla każdego zasobu na podstawie wartości parametru.

Uwaga

Takie podejście jest czasami nazywane ustalaniem rozmiaru koszulki. Gdy kupujesz t-shirt, nie masz wielu opcji jego długości, szerokości, rękawów i tak dalej. Wystarczy wybrać między małymi, średnimi i dużymi rozmiarami, a projektant t-shirtu wstępnie zdefiniował te pomiary na podstawie tego rozmiaru.

Przykład

Załóżmy, że masz szablon, który można wdrożyć w dwóch typach środowiska: nieprodukcyjnym i produkcyjnym. W zależności od typu środowiska potrzebna konfiguracja jest inna:

Właściwość Środowiska nieprodukcyjne Środowiska produkcyjne
Plan usługi App Service
Nazwa jednostki SKU S2 P2V3
Pojemność (liczba wystąpień) 1 3
aplikacja App Service
Zawsze włączone Disabled Enabled (Włączony)
Konto magazynu
Nazwa jednostki SKU Standard_LRS Standard_ZRS

Możesz użyć wzorca zestawu konfiguracji dla tego szablonu.

Zaakceptuj pojedynczy parametr wskazujący typ środowiska, taki jak produkcja lub nieprodukcyjna. Użyj dekoratora parametrów @allowed , aby upewnić się, że użytkownicy szablonu udostępniają tylko oczekiwane wartości:

@allowed([
  'Production'
  'NonProduction'
])
param environmentType string = 'NonProduction'

Następnie utwórz zmienną mapy, która jest obiektem definiującym określoną konfigurację w zależności od typu środowiska. Zwróć uwagę, że zmienna ma dwa obiekty o nazwie Production i NonProduction. Te nazwy są zgodne z dozwolonymi wartościami parametru w poprzednim przykładzie:

var environmentConfigurationMap = {
  Production: {
    appServicePlan: {
      sku: {
        name: 'P2V3'
        capacity: 3
      }
    }
    appServiceApp: {
      alwaysOn: false
    }
    storageAccount: {
      sku: {
        name: 'Standard_ZRS'
      }
    }
  }
  NonProduction: {
    appServicePlan: {
      sku: {
        name: 'S2'
        capacity: 1
      }
    }
    appServiceApp: {
      alwaysOn: false
    }
    storageAccount: {
      sku: {
        name: 'Standard_LRS'
      }
    }
  }
}

Podczas definiowania zasobów użyj mapy konfiguracji, aby zdefiniować właściwości zasobu:

resource appServicePlan 'Microsoft.Web/serverfarms@2022-09-01' = {
  name: appServicePlanName
  location: location
  sku: environmentConfigurationMap[environmentType].appServicePlan.sku
}

resource appServiceApp 'Microsoft.Web/sites@2022-09-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
    siteConfig: {
      alwaysOn: environmentConfigurationMap[environmentType].appServiceApp.alwaysOn
    }
  }
}

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: environmentConfigurationMap[environmentType].storageAccount.sku
}

Zagadnienia do rozważenia

  • W zmiennej mapy rozważ grupowanie właściwości według zasobu, aby uprościć ich definicję.
  • W zmiennej mapy można zdefiniować zarówno poszczególne wartości właściwości (takie jak alwaysOn właściwość w przykładzie) lub zmienne obiektu, które ustawiają właściwość obiektu (na przykład właściwości jednostki SKU).
  • Rozważ użycie zestawu konfiguracji z warunkami zasobów. Dzięki temu kod Bicep może wdrażać pewne zasoby dla określonych środowisk, a nie w innych.

Następne kroki

Dowiedz się więcej o wzorcu pliku zmiennej udostępnionej.