Menyebarkan sumber daya secara kondisional

Selesai

Anda dapat menggunakan kondisi dalam kode Bicep Anda untuk menyebarkan sumber daya hanya ketika ada batasan tertentu.

Misalnya, di perusahaan mainan Anda, Anda perlu menyebarkan sumber daya ke berbagai lingkungan. Saat Anda menyebarkannya ke lingkungan produksi, Anda perlu memastikan bahwa audit diaktifkan untuk server logika Azure SQL. Tetapi ketika Anda menyebarkan sumber daya ke lingkungan pengembangan, Anda tidak ingin mengaktikan audit. Anda ingin menggunakan satu templat untuk menyebarkan sumber daya ke semua lingkungan Anda.

Di unit ini, Anda akan mempelajari cara menyebarkan sumber daya secara kondisional.

Menggunakan kondisi dasar

Saat Anda menyebarkan sumber daya di Bicep, Anda dapat memberikan kata kunci if yang diikuti dengan sebuah kondisi. Kondisi ini harus menyelesaikan nilai Boolean (benar atau salah). Jika nilainya benar, sumber daya akan disebarkan. Jika nilainya salah, sumber daya tidak akan disebarkan.

Membuat kondisi berdasarkan nilai parameter yang Anda berikan sudah merupakan hal umum. Misalnya, kode berikut menggunakan akun penyimpanan hanya ketika parameter deployStorageAccount diatur ke true:

param deployStorageAccount bool

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

Perhatikan bahwa kata kunci if berada di baris yang sama dengan definisi sumber daya.

Menggunakan ekspresi sebagai kondisi

Contoh sebelumnya cukup mendasar. Parameter deployStorageAccount merupakan tipe bool, jadi kita bisa diketahui dengan jelas apakah parameter memiliki nilai true atau false.

Dalam Bicep, kondisi juga dapat menyertakan ekspresi. Dalam contoh berikut, kode menyebarkan sumber SQL yang mengaudit sumber daya hanya ketika nilai parameter environmentName setara dengan Production:

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

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

Ada baiknya untuk membuat variabel untuk ekspresi yang Anda gunakan sebagai kondisi. Dengan begitu, templat Anda lebih mudah dipahami dan dibaca. Berikut contohnya:

@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: {
  }
}

Bergantung pada sumber daya yang disebarkan secara kondisional

Ketika Anda menyebarkan sumber daya secara kondisional, kadang-kadang Anda perlu mengetahui bagaimana Bicep mengevaluasi ketergantungan di antara sumber daya.

Mari kita lanjutkan menulis beberapa kode Bicep untuk menyebarkan pengaturan audit SQL. File Bicep juga perlu mendeklarasikan sumber daya akun penyimpanan, seperti yang ditunjukkan di sini:

@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: {
  }
}

Perhatikan bahwa akun penyimpanan memiliki kondisi juga. Artinya, akun penyimpanan juga tidak akan disebarkan untuk lingkungan non-produksi. Sumber daya pengaturan audit SQL sekarang dapat merujuk ke detail akun penyimpanan:

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

Perhatikan bahwa kode Bicep ini menggunakan operator tanda tanya (?) dalam properti storageEndpoint dan storageAccountAccessKey. Ketika kode Bicep disebarkan ke lingkungan produksi, ekspresi dievaluasi ke detail dari akun penyimpanan. Ketika kode disebarkan ke lingkungan non-produksi, ekspresi melakukan evaluasi ke string kosong ('').

Anda mungkin bertanya-tanya mengapa kode ini diperlukan, karena kedua auditingSettings dan auditStorageAccount memiliki kondisi yang sama, sehingga Anda tidak perlu menyebarkan sumber daya pengaturan audit SQL tanpa akun penyimpanan. Meskipun hal ini benar, Azure Resource Manager mengevaluasi ekspresi properti sebelum kondisionalnya pada sumber daya. Itu berarti bahwa jika kode Bicep tidak memiliki ekspresi ini, penyebaran akan gagal dengan ResourceNotFound kesalahan.

Catatan

Anda tidak dapat menentukan dua sumber daya dengan nama yang sama dalam file Bicep yang sama dan kemudian secara kondisional hanya menyebarkan salah satu sumber daya. Penyebaran akan gagal, karena Azure Resource Manager melihat ini sebagai konflik.

Jika Anda memiliki beberapa sumber daya dengan kondisi yang sama untuk penyebaran, pertimbangkan untuk menggunakan modul Bicep. Anda dapat membuat modul yang menyebarkan semua sumber daya, lalu menempatkan kondisi pada deklarasi modul di file Bicep utama Anda.