有條件地部署資源

已完成

您可以在 Bicep 程式碼中使用條件,只在特定條件約束就緒才時部署資源。

例如,在您的玩具公司,您需要將資源部署到各種環境。 部署到實際執行環境時,您需要確定 Azure SQL 邏輯伺服器已啟用稽核。 但將資源部署到開發環境時,您不想要啟用稽核。 您想要使用單一範本將資源部署到所有環境。

在本單元中,您會了解如何有條件地部署資源。

使用基本條件

在 Bicep 中部署資源時,您可以提供 if 關鍵字,後面接著條件。 條件應該解析為布林值 (true 或 false)。 如果值為 true,就會部署資源。 如果值為 false,則不會部署資源。

通常會根據您提供的參數值來建立條件。 例如,下列程式碼只有在 deployStorageAccount 參數設定為 true 時,才會部署儲存體帳戶:

param deployStorageAccount bool

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

請注意,if 關鍵字與資源定義在同一行。

使用運算式作為條件

上述範例相當基本。 deployStorageAccount 參數是 bool 類型,很顯然值為 truefalse

在 Bicep 中,條件也可以包含運算式。 在下列範例中,只有當 environmentName 參數值等於 Production 時,程式碼才會部署 SQL 稽核資源:

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

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

最好替作為條件的運算式建立變數。 這樣會更容易理解和閱讀您的範本。 以下是範例:

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

var auditingEnabled = environmentName == 'Production'

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

依賴有條件部署的資源

當您有條件地部署資源時,有時需要知道 Bicep 如何評估資源之間的相依性。

讓我們繼續撰寫一些 Bicep 程式碼,以部署 SQL 稽核設定。 Bicep 檔案也需要宣告儲存體帳戶資源,如下所示:

@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@2023-08-01-preview' = if (auditingEnabled) {
  parent: server
  name: 'default'
  properties: {
  }
}

請注意,儲存體帳戶也有條件。 這表示也不會部署到非實際執行環境。 SQL 稽核設定資源現在可以參考儲存體帳戶的詳細資料:

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

請注意,此 Bicep 程式碼在 storageEndpointstorageAccountAccessKey 屬性內使用問號 (?) 運算子。 將 Bicep 程式碼部署至實際執行環境時,運算式會評估為儲存體帳戶的詳細資料。 將程式碼部署至非實際執行環境時,運算式會評估為空字串 ('')。

您可能會想知道為何需要此程式碼,因為 auditingSettingsauditStorageAccount 兩者都有相同的條件,因此,在無儲存體帳戶的情況下,您永遠不需要部署 SQL 稽核設定資源。 雖然如此,但 Azure Resource Manager 會先在資源上評估屬性運算式,再評估條件。 這表示,如果 Bicep 程式碼沒有這個運算式,則部署會失敗並發生 ResourceNotFound 錯誤。

注意

您無法在相同的 Bicep 檔案中定義兩個相同名稱的資源,然後有條件地只部署其中一個資源。 因為 Resource Manager 將此視為衝突,部署會失敗。

如果您有幾個資源全都有相同的部署條件,請考慮使用 Bicep 模組。 您可以建立部署所有資源的模組,然後在 Bicep 主檔案中的模組宣告上設定條件。