Patroon van configuratieset

In plaats van veel afzonderlijke parameters te definiëren, maakt u vooraf gedefinieerde sets waarden. Selecteer tijdens de implementatie de set waarden die u wilt gebruiken.

Context en probleem

Een enkel Bicep-bestand definieert vaak veel resources. Elke resource moet mogelijk een andere configuratie gebruiken, afhankelijk van de omgeving waarnaar u de resource implementeert. U kunt bijvoorbeeld een Bicep-bestand maken waarmee een App Service-plan en -app en een opslagaccount worden geïmplementeerd. Elk van deze resources heeft meerdere opties die van invloed zijn op de kosten, beschikbaarheid en tolerantie. Voor productieomgevingen wilt u één configuratieset gebruiken die prioriteit geeft aan hoge beschikbaarheid en tolerantie. Voor niet-productieomgevingen wilt u een andere configuratieset gebruiken die prioriteit geeft aan kostenreductie.

U kunt parameters maken voor elke configuratie-instelling, maar dit heeft enkele nadelen:

  • Deze benadering vormt een belasting voor uw sjabloongebruikers, omdat ze inzicht moeten hebben in de waarden die moeten worden gebruikt voor elke resource en de impact van het instellen van elke parameter.
  • Het aantal parameters in uw sjabloon neemt toe met elke nieuwe resource die u definieert.
  • Gebruikers kunnen combinaties van parameterwaarden selecteren die niet zijn getest of die niet goed werken.

Oplossing

Maak één parameter om het omgevingstype op te geven. Gebruik een variabele om automatisch de configuratie voor elke resource te selecteren op basis van de waarde van de parameter.

Notitie

Deze benadering wordt ook wel de grootte van het t-shirt genoemd. Wanneer je een t-shirt koopt, krijg je niet veel opties voor de lengte, breedte, mouwen, enzovoort. U kiest gewoon tussen kleine, middelgrote en grote maten, en de ontwerper van het t-shirt heeft deze afmetingen vooraf gedefinieerd op basis van die maat.

Voorbeeld

Stel dat u een sjabloon hebt die kan worden geïmplementeerd in twee typen omgevingen: niet-productie en productie. Afhankelijk van het omgevingstype is de configuratie die u nodig hebt, anders:

Eigenschap Niet-productieomgevingen Productieomgevingen
App Service-plan
SKU-naam S2 P2V3
Capaciteit (aantal exemplaren) 1 3
App Service-app
AlwaysOn Uitgeschakeld Ingeschakeld
Opslagaccount
SKU-naam Standard_LRS Standard_ZRS

U kunt het configuratiesetpatroon voor deze sjabloon gebruiken.

Accepteer één parameter die het omgevingstype aangeeft, zoals productie of niet-productie. Gebruik de @allowed parameter decorator om ervoor te zorgen dat de gebruikers van uw sjabloon alleen waarden opgeven die u verwacht:

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

Maak vervolgens een toewijzingsvariabele. Dit is een object dat de specifieke configuratie definieert, afhankelijk van het omgevingstype. U ziet dat de variabele twee objecten heeft met de naam Production en NonProduction. Deze namen komen overeen met de toegestane waarden voor de parameter in het vorige voorbeeld:

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'
      }
    }
  }
}

Wanneer u de resources definieert, gebruikt u de configuratietoewijzing om de resource-eigenschappen te definiëren:

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
}

Overwegingen

  • In uw kaartvariabele kunt u de eigenschappen groeperen op resource om de definitie ervan te vereenvoudigen.
  • In uw kaartvariabele kunt u zowel afzonderlijke eigenschapswaarden (zoals de alwaysOn eigenschap in het voorbeeld) als objectvariabelen definiëren waarmee een objecteigenschap wordt ingesteld (zoals de SKU-eigenschappen in het voorbeeld).
  • Overweeg het gebruik van een configuratieset met resourcevoorwaarden. Hierdoor kan uw Bicep-code bepaalde resources implementeren voor specifieke omgevingen en niet in andere.

Volgende stappen

Meer informatie over het bestandspatroon voor gedeelde variabelen.