リソースを条件付きでデプロイする
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
型であったため、値が true
か false
かは明確です。
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 コードが運用環境にデプロイされるとき、式はストレージ アカウントの詳細として評価されます。 コードが非運用環境にデプロイされるときは、式は空の文字列 (''
) として評価されます。
auditingSettings
と auditStorageAccount
はどちらも同じ条件であり、ストレージ アカウントがなくては SQL 監査設定リソースをデプロイする必要はないので、このコードが必要な理由について疑問に思うかもしれません。 それは正しいことですが、リソースについての条件の前に、Azure Resource Manager によってプロパティ式が評価されます。 そのため、Bicep コードにこの式がない場合、デプロイは ResourceNotFound
エラーで失敗します。
Note
同じ Bicep ファイルで同じ名前の 2 つのリソースを定義することはできず、そのうちの 1 つのみが条件付きでデプロイされます。 これは Resource Manager で競合と見なされるため、デプロイは失敗します。
複数のリソースがあり、すべてのデプロイ条件が同じ場合は、Bicep モジュールの使用を検討してください。 すべてのリソースをデプロイするモジュールを作成してから、メインの Bicep ファイル内のモジュール宣言に条件を設定することができます。