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 olika konfigurationer beroende på vilken miljö du distribuerar den till. Du kan till exempel skapa en Bicep-fil som distribuerar en App Service plan app och ett lagringskonto. Var och en av dessa resurser har flera alternativ som påverkar kostnaderna, tillgängligheten och återhämtningsförmågan. 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 det har vissa nackdelar:

  • Den här metoden skapar en belastning för mallanvändarna, eftersom de måste 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.

Anteckning

Den här metoden kallas ibland för t-shirt-storleksändring. När du köper en t-shirt har du inte många alternativ för längd, bredd, ärm och så vidare. Du väljer helt enkelt mellan små, medelstora och stora storlekar, och t-shirt-designern har fördefinierat dessa mått 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ötypen är den konfiguration du behöver olika:

Egenskap Icke-produktionsmiljöer Produktionsmiljöer
App Service-plan
SKU-namn S2 P2V3
Kapacitet (antal instanser) 1 3
App Service app
Alltid på Inaktiverad Enabled
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 @allowed parameterdekoratorn för att se till att mallens användare endast anger värden som du förväntar dig:

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

Skapa sedan en mappningsvariabel, vilket är ett objekt som definierar den specifika konfigurationen beroende på miljötypen. 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@2020-06-01' = {
  name: appServicePlanName
  location: location
  sku: environmentConfigurationMap[environmentType].appServicePlan.sku
}

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

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

Överväganden

  • Överväg att gruppera egenskaperna efter resurs i mappningsvariabeln för att förenkla deras definition.
  • I mappningsvariabeln kan du definiera både enskilda egenskapsvärden (som egenskapen i exemplet) eller objektvariabler som anger en objektegenskap (t.ex. alwaysOn SKU-egenskaperna i exemplet).
  • Överväg att använda en konfigurationsuppsättning med resursvillkor. Detta gör att Bicep-koden kan distribuera vissa resurser för specifika miljöer och inte i andra.

Nästa steg

Lär dig mer om det delade variabelfilmönstret.