リソースを条件付きでデプロイする

完了

Bicep のコードで条件を使用して、特定の制約が適用されている場合にのみリソースをデプロイすることができます。

たとえば、この会社では、さまざまな環境にリソースをデプロイする必要があります。 運用環境にデプロイするときは、Azure SQL 論理サーバーに対して監査が有効になっていることを確認する必要があります。 一方、開発環境にリソースをデプロイするときは、監査を有効にする必要はありません。 1 つのテンプレートを使用して、すべての環境にリソースをデプロイする必要があります。

このユニットでは、リソースを条件付きでデプロイする方法について学習します。

基本的な条件を使用する

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 によってどのように評価されるかを認識することが必要になる場合があります。

引き続き SQL 監査設定をデプロイする Bicep コードを記述しましょう。 次に示すように、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 コードの storageEndpoint プロパティと storageAccountAccessKey プロパティで、疑問符 (?) 演算子が使用されていることに注意してください。 Bicep コードが運用環境にデプロイされるとき、式はストレージ アカウントの詳細として評価されます。 コードが非運用環境にデプロイされるときは、式は空の文字列 ('') として評価されます。

auditingSettingsauditStorageAccount はどちらも同じ条件であり、ストレージ アカウントがなくては SQL 監査設定リソースをデプロイする必要はないので、このコードが必要な理由について疑問に思うかもしれません。 それは正しいことですが、リソースについての条件の前に、Azure Resource Manager によってプロパティ式が評価されます。 そのため、Bicep コードにこの式がない場合、デプロイは ResourceNotFound エラーで失敗します。

Note

同じ Bicep ファイルで同じ名前の 2 つのリソースを定義することはできず、そのうちの 1 つのみが条件付きでデプロイされます。 これは Resource Manager で競合と見なされるため、デプロイは失敗します。

複数のリソースがあり、すべてのデプロイ条件が同じ場合は、Bicep モジュールの使用を検討してください。 すべてのリソースをデプロイするモジュールを作成してから、メインの Bicep ファイル内のモジュール宣言に条件を設定することができます。