Bedingtes Bereitstellen von Ressourcen

Abgeschlossen

Sie können Bedingungen in Ihrem Bicep-Code verwenden, um Ressourcen nur dann bereitzustellen, wenn bestimmte Einschränkungen gelten.

Beispielsweise müssen Sie in Ihrem Spielwarenunternehmen Ressourcen für verschiedene Umgebungen bereitstellen. Wenn Sie sie in einer Produktionsumgebung bereitstellen, müssen Sie sicherstellen, dass für Ihre logischen Azure SQL-Server die Überwachungsfunktion aktiviert ist. Wenn Sie jedoch Ressourcen in Entwicklungsumgebungen bereitstellen, möchten Sie die Überwachung nicht aktivieren. Sie möchten eine einzige Vorlage verwenden, um Ressourcen in all Ihren Umgebungen bereitzustellen.

In dieser Lerneinheit erfahren Sie, wie Sie Ressourcen bedingt bereitstellen.

Verwenden grundlegender Bedingungen

Bei der Bereitstellung einer Ressource in Bicep können Sie das Schlüsselwort if gefolgt von einer Bedingung angeben. Die Bedingung muss in einen booleschen Wert (TRUE oder FALSE) ausgewertet werden. Wenn der Wert TRUE lautet, wird die Ressource bereitgestellt. Lautet der Wert FALSE, wird die Ressource nicht bereitgestellt.

Es ist gängige Praxis, Bedingungen basierend auf den Werten der von Ihnen angegebenen Parameter zu erstellen. Der folgende Code stellt beispielsweise ein Speicherkonto nur dann bereit, wenn der Parameter „deployStorageAccount“ auf true festgelegt ist:

param deployStorageAccount bool

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' = if (deployStorageAccount) {
  name: 'teddybearstorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  // ...
}

Beachten Sie, dass sich das Schlüsselwort if in derselben Zeile wie die Ressourcendefinition befindet.

Verwenden von Ausdrücken als Bedingungen

Das vorherige Beispiel war recht einfach. Der Parameter deployStorageAccount war vom Typ bool, daher ist klar ersichtlich, ob er den Wert true oder false aufweist.

In Bicep können Bedingungen auch Ausdrücke enthalten. Im folgenden Beispiel stellt der Code eine SQL-Überwachungsressource nur dann bereit, wenn der Wert des Parameters environmentName gleich Production ist:

@allowed([
  'Development'
  'Production'
])
param environmentName string

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (environmentName == 'Production') {
  parent: server
  name: 'default'
  properties: {
  }
}

Es ist in der Regel ratsam, eine Variable für den Ausdruck zu erstellen, den Sie als Bedingung verwenden. Auf diese Weise ist Ihre Vorlage einfacher zu verstehen und zu lesen. Hier sehen Sie ein Beispiel:

@allowed([
  'Development'
  'Production'
])
param environmentName string

var auditingEnabled = environmentName == 'Production'

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
  }
}

Abhängen von bedingt bereitgestellten Ressourcen

Wenn Sie Ressourcen bedingt bereitstellen, ist es gelegentlich wichtig zu wissen, wie Bicep die Abhängigkeiten zwischen ihnen auswertet.

Wir verfassen jetzt Bicep-Code für die Bereitstellung von SQL-Überwachungseinstellungen. In der Bicep-Datei muss außerdem eine Speicherkontoressource deklariert werden, wie hier gezeigt:

@allowed([
  'Development'
  'Production'
])
param environmentName string
param location string = resourceGroup().location
param auditStorageAccountName string = 'bearaudit${uniqueString(resourceGroup().id)}'

var auditingEnabled = environmentName == 'Production'
var storageAccountSkuName = 'Standard_LRS'

resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2021-09-01' = if (auditingEnabled) {
  name: auditStorageAccountName
  location: location
  sku: {
    name: storageAccountSkuName
  }
  kind: 'StorageV2'
}

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
  }
}

Beachten Sie, dass auch das Speicherkonto eine Bedingung aufweist. Dies bedeutet, dass es ebenfalls nur für Produktionsumgebungen bereitgestellt wird. Die Ressource für SQL-Überwachungseinstellungen kann jetzt auf die Details des Speicherkontos verweisen:

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2021-11-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
    state: 'Enabled'
    storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
    storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
  }
}

Beachten Sie, dass dieser Bicep-Code den Fragezeichenoperator (?) in den Eigenschaften storageEndpoint und storageAccountAccessKey verwendet. Wenn der Bicep-Code in einer Produktionsumgebung bereitgestellt wird, werden die Ausdrücke anhand der Details aus dem Speicherkonto ausgewertet. Wenn der Code in einer Nicht-Produktionsumgebung bereitgestellt wird, werden die Ausdrücke zu einer leeren Zeichenfolge ('') ausgewertet.

Sie fragen sich vielleicht, warum dieser Code notwendig ist, da auditingSettings und auditStorageAccount beide dieselbe Bedingung aufweisen und Sie daher nie eine Ressource für SQL-Überwachungseinstellungen ohne Speicherkonto bereitstellen müssen. Auch wenn dies zutrifft, wertet Azure Resource Manager Eigenschaftsausdrücke vor den Bedingungen für die Ressourcen aus. Das bedeutet Folgendes: Wenn der Bicep-Code daher diesen Ausdruck nicht enthält, tritt bei der Bereitstellung der Fehler ResourceNotFound auf.

Hinweis

Sie können keine zwei Ressourcen mit dem gleichen Namen in derselben Bicep-Datei definieren und dann nur eine davon bedingt bereitstellen. Die Bereitstellung ist nicht möglich, weil Resource Manager dies als Konflikt betrachtet.

Wenn Sie über mehrere Ressourcen mit der gleichen Bedingung für die Bereitstellung verfügen, sollten Sie die Verwendung von Bicep-Modulen in Betracht ziehen. Sie können ein Modul erstellen, das alle Ressourcen bereitstellt, und dann eine Bedingung für die Moduldeklaration in Ihrer Bicep-Hauptdatei festlegen.