Muster für Konfigurationssatz

Anstatt viele einzelne Parameter zu definieren, erstellen Sie vordefinierte Wertesätze. Wählen Sie während der Bereitstellung den zu verwendenden Wertesatz aus.

Kontext und Problem

Eine einzelne Bicep-Datei definiert häufig viele Ressourcen. Jede Ressource muss abhängig von der Umgebung, in der Sie sie bereitstellen, möglicherweise eine andere Konfiguration verwenden. Beispielsweise können Sie eine Bicep-Datei erstellen, die einen App Service-Plan und eine App sowie ein Speicherkonto bereitgestellt. Jede dieser Ressourcen verfügt über mehrere Optionen, die sich auf deren Kosten, Verfügbarkeit und Resilienz auswirken. Für Produktionsumgebungen sollten Sie einen Konfigurationssatz mit der Priorisierung für Hochverfügbarkeit und Resilienz verwenden. Für Nicht-Produktionsumgebungen sollten Sie einen anderen Konfigurationssatz verwenden, der die Kostenreduzierung priorisiert.

Sie können Parameter für jede Konfigurationseinstellung erstellen, allerdings hat dies einige Nachteile:

  • Dieser Ansatz macht es den Vorlagenbenutzer etwas aufwändiger, da sie die Werte, die für jede Ressource verwendet werden sollen, und die Auswirkungen der einzelnen Parametereinstellungen verstehen müssen.
  • Die Anzahl der Parameter in Ihrer Vorlage erhöht sich mit jeder neuen Ressource, die Sie definieren.
  • Benutzer können Kombinationen von Parameterwerten auswählen, die nicht getestet wurden oder nicht ordnungsgemäß funktionieren.

Lösung

Erstellen Sie einen einzelnen Parameter, um den Umgebungstyp anzugeben. Verwenden Sie eine Variable, um die Konfiguration für jede Ressource basierend auf dem Wert des Parameters automatisch auszuwählen.

Hinweis

Dieser Ansatz wird manchmal als Aufwandsschätzung mit T-Shirt-Größen (T-shirt sizing) bezeichnet. Wenn Sie ein T-Shirt kaufen, haben Sie für Länge, Breite, Ärmel usw. nicht viele Optionen. Sie wählen einfach zwischen kleinen, mittleren und großen Größen und der Designer des T-Shirts hat diese Maße basierend auf diesen Größen vordefiniert.

Beispiel

Angenommen, Sie verfügen über eine Vorlage, die in zwei Arten von Umgebungen bereitgestellt werden kann: Nichtproduktion und Produktion. Je nach Umgebungstyp ist die Konfiguration, die Sie benötigen, anders:

Eigenschaft Nichtproduktionsumgebungen Produktionsumgebungen
App Service-Plan
SKU-Name S2 P2V3
Kapazität (Anzahl von Instanzen) 1 3
App Service-App
Always On Disabled Aktiviert
Speicherkonto
SKU-Name Standard_LRS Standard_ZRS

Sie können das Konfigurationssatzmuster für diese Vorlage verwenden.

Akzeptieren Sie einen einzelnen Parameter, der den Umgebungstyp angibt, z. B. Produktion oder Nichtproduktion. Verwenden Sie den Parameterdecorator @allowed, um sicherzustellen, dass die Benutzer Ihrer Vorlage nur die Werte angeben, die Sie erwarten:

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

Erstellen Sie dann eine Zuordnungsvariable, bei der es sich um ein Objekt handelt, das die spezifische Konfiguration abhängig vom Umgebungstyp definiert. Beachten Sie, dass die Variable über zwei Objekte mit dem Namen Production und NonProduction verfügt. Diese Namen stimmen mit den zulässigen Werten für den Parameter im vorherigen Beispiel überein:

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

Wenn Sie die Ressourcen definieren, verwenden Sie die Konfigurationszuordnung, um die Ressourceneigenschaften zu definieren:

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
}

Weitere Überlegungen

  • Ziehen Sie es in Betracht, die Eigenschaften in Ihrer Zuordnungsvariablen nach Ressource zu gruppieren, um deren Definition zu vereinfachen.
  • In Ihrer Zuordnungsvariablen können Sie sowohl einzelne Eigenschaftswerte (wie die alwaysOn-Eigenschaft im Beispiel) als auch Objektvariablen definieren, die eine Objekteigenschaft festlegen (wie die SKU-Eigenschaften im Beispiel).
  • Ziehen Sie es in Betracht, einen Konfigurationssatz mit Ressourcenbedingungen zu verwenden. Dadurch kann Ihr Bicep-Code bestimmte Ressourcen für bestimmte Umgebungen bereitstellen, und für andere nicht.

Nächste Schritte

Erfahren Sie mehr über das Dateimuster für freigegebene Variablen.