Distribuera resurser villkorligt

Slutförd

Du kan använda villkor i Bicep-koden för att endast distribuera resurser när specifika begränsningar finns.

På ditt leksaksföretag måste du till exempel distribuera resurser till olika miljöer. När du distribuerar dem till en produktionsmiljö måste du se till att granskning är aktiverat för dina logiska Azure SQL-servrar. Men när du distribuerar resurser till utvecklingsmiljöer vill du inte aktivera granskning. Du vill använda en enda mall för att distribuera resurser till alla dina miljöer.

I den här lektionen får du lära dig hur du distribuerar resurser villkorligt.

Använda grundläggande villkor

När du distribuerar en resurs i Bicep kan du ange nyckelordet if följt av ett villkor. Villkoret ska matcha ett booleskt värde (sant eller falskt). Om värdet är sant distribueras resursen. Om värdet är falskt distribueras inte resursen.

Det är vanligt att skapa villkor baserat på värdena för de parametrar som du anger. Följande kod distribuerar till exempel endast ett lagringskonto när parametern är inställd på deployStorageAccount true:

param deployStorageAccount bool

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

Observera att nyckelordet if finns på samma rad som resursdefinitionen.

Använda uttryck som villkor

Föregående exempel var ganska grundläggande. Parametern deployStorageAccount var av typen bool, så det är tydligt om den har värdet true eller false.

I Bicep kan villkor också innehålla uttryck. I följande exempel distribuerar koden endast en SQL-granskningsresurs när environmentName parametervärdet är lika Productionmed :

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

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

Det är vanligtvis en bra idé att skapa en variabel för det uttryck som du använder som ett villkor. På så sätt är mallen lättare att förstå och läsa. Här är ett exempel:

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

var auditingEnabled = environmentName == 'Production'

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

Beroende på villkorligt distribuerade resurser

När du distribuerar resurser villkorligt måste du ibland vara medveten om hur Bicep utvärderar beroendena mellan dem.

Låt oss fortsätta skriva lite Bicep-kod för att distribuera SQL-granskningsinställningar. Bicep-filen måste också deklarera en lagringskontoresurs, som du ser här:

@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@2023-05-01' = if (auditingEnabled) {
  name: auditStorageAccountName
  location: location
  sku: {
    name: storageAccountSkuName
  }
  kind: 'StorageV2'
}

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

Observera att lagringskontot också har ett villkor. Det innebär att den inte heller distribueras för icke-produktionsmiljöer. Resursen för SQL-granskningsinställningar kan nu referera till lagringskontoinformationen:

resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2024-05-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 : ''
  }
}

Observera att den här Bicep-koden använder frågeteckenoperatorn (?) i storageEndpoint egenskaperna och storageAccountAccessKey . När Bicep-koden distribueras till en produktionsmiljö utvärderas uttrycken till informationen från lagringskontot. När koden distribueras till en icke-produktionsmiljö utvärderas uttrycken till en tom sträng ('').

Du kanske undrar varför den här koden är nödvändig eftersom auditingSettings båda auditStorageAccount har samma villkor och därför behöver du aldrig distribuera en SQL-granskningsinställningsresurs utan ett lagringskonto. Även om detta är sant utvärderar Azure Resource Manager egenskapsuttrycken före resursernas villkor. Det innebär att om Bicep-koden inte har det här uttrycket misslyckas distributionen med ett ResourceNotFound fel.

Kommentar

Du kan inte definiera två resurser med samma namn i samma Bicep-fil och sedan distribuera endast en av dem villkorligt. Distributionen misslyckas eftersom Resource Manager ser detta som en konflikt.

Om du har flera resurser, alla med samma villkor för distribution, bör du överväga att använda Bicep-moduler. Du kan skapa en modul som distribuerar alla resurser och sedan ange ett villkor för moduldeklarationen i din huvudsakliga Bicep-fil.