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 usługi 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 przypadku środowisk produkcyjnych należy użyć jednego zestawu konfiguracji, który określa priorytety wysokiej dostępności i odporności. W przypadku środowisk nieprodukcyjnych należy użyć innego zestawu konfiguracji, który określa priorytety redukcji kosztów.
Można utworzyć parametry dla każdego ustawienia konfiguracji, ale takie podejście ma pewne wady:
- Takie podejście powoduje obciążenie użytkowników szablonów, 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. Kiedy kupujesz t-shirt, nie masz wielu opcji na jego długość, szerokość, rękawy i tak dalej. Po prostu wybierasz między małymi, średnimi i dużymi rozmiarami, a projektant t-shirt 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ści | Środowiska nieprodukcyjne | Środowiska produkcyjne |
---|---|---|
Plan usługi App Service | ||
Nazwa jednostki SKU | S2 | P2V3 |
Pojemność (liczba wystąpień) | 1 | 3 |
Aplikacja usługi App Service | ||
Stały dostęp do usługi | Disabled | Włączony |
Konto magazynu | ||
Nazwa jednostki SKU | Standard_LRS | Standard_ZRS |
Można użyć wzorca zestawu konfiguracji dla tego szablonu.
Zaakceptuj pojedynczy parametr, który wskazuje 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 konkretną 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
}
Kwestie wymagające 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 (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.