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.