Mönster för konfigurationsuppsättning
I stället för att definiera många enskilda parametrar skapar du fördefinierade uppsättningar med värden. Under distributionen väljer du den uppsättning värden som ska användas.
Kontext och problem
En enda Bicep-fil definierar ofta många resurser. Varje resurs kan behöva använda en annan konfiguration beroende på vilken miljö du distribuerar den till. Du kan till exempel skapa en Bicep-fil som distribuerar en App Service-plan och app och ett lagringskonto. Var och en av dessa resurser har flera alternativ som påverkar dess kostnad, tillgänglighet och återhämtning. För produktionsmiljöer vill du använda en uppsättning konfigurationer som prioriterar hög tillgänglighet och återhämtning. För icke-produktionsmiljöer vill du använda en annan konfigurationsuppsättning som prioriterar kostnadsminskning.
Du kan skapa parametrar för varje konfigurationsinställning, men den här metoden har några nackdelar:
- Den här metoden skapar en börda för dina mallanvändare, eftersom de behöver förstå de värden som ska användas för varje resurs och effekten av att ange varje parameter.
- Antalet parametrar i mallen ökar med varje ny resurs som du definierar.
- Användare kan välja kombinationer av parametervärden som inte har testats eller som inte fungerar korrekt.
Lösning
Skapa en enskild parameter för att ange miljötypen. Använd en variabel för att automatiskt välja konfigurationen för varje resurs baserat på parameterns värde.
Kommentar
Detta tillvägagångssätt kallas ibland t-shirt storleksändring. När du köper en t-shirt får du inte många alternativ för dess längd, bredd, ärmar och så vidare. Du väljer helt enkelt mellan små, medelstora och stora storlekar, och t-shirtdesignern har fördefinierade dessa mätningar baserat på den storleken.
Exempel
Anta att du har en mall som kan distribueras till två typer av miljöer: icke-produktion och produktion. Beroende på miljötyp är konfigurationen du behöver olika:
Property | Miljöer som inte är produktionsmiljöer | Produktionsmiljöer |
---|---|---|
App Service-plan | ||
SKU-namn | S2 | P2V3 |
Kapacitet (antal instanser) | 1 | 3 |
App Service-app | ||
Alltid på | Inaktiverat | Aktiverat |
Lagringskonto | ||
SKU-namn | Standard_LRS | Standard_ZRS |
Du kan använda konfigurationsuppsättningsmönstret för den här mallen.
Acceptera en enskild parameter som anger miljötypen, till exempel produktion eller icke-produktion. Använd parameterdekoratören @allowed
för att säkerställa att mallens användare endast tillhandahåller värden som du förväntar dig:
@allowed([
'Production'
'NonProduction'
])
param environmentType string = 'NonProduction'
Skapa sedan en kartvariabel, som är ett objekt som definierar den specifika konfigurationen beroende på miljötyp. Observera att variabeln har två objekt med namnet Production
och NonProduction
. Dessa namn matchar de tillåtna värdena för parametern i föregående exempel:
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'
}
}
}
}
När du definierar resurserna använder du konfigurationskartan för att definiera resursegenskaperna:
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
}
Att tänka på
- I kartvariabeln bör du överväga att gruppera egenskaperna efter resurs för att förenkla definitionen.
- I kartvariabeln kan du definiera både enskilda egenskapsvärden (som
alwaysOn
egenskapen i exemplet) eller objektvariabler som anger en objektegenskap (som SKU-egenskaperna i exemplet). - Överväg att använda en konfigurationsuppsättning med resursvillkor. På så sätt kan din Bicep-kod distribuera vissa resurser för specifika miljöer och inte i andra.