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 samt 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 detta har vissa 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å värdet för parametern.

Anteckning

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 annorlunda:

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 parameterdekoratören @allowed för att säkerställa att mallens användare endast anger 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
}

Överväganden

  • 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 (t.ex 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. Detta gör att din Bicep-kod kan distribuera vissa resurser för specifika miljöer och inte i andra.

Nästa steg

Läs mer om filmönstret för delade variabler.