If 式を使用した Bicep での条件付きデプロイ

必要に応じて、リソースまたはモジュールを Bicep にデプロイするには、if 式を使用します。 if 式には、true または false に解決される条件が含まれています。 if 条件が true の場合、リソースがデプロイされます。 値が false の場合、リソースは作成されません。 この値は、リソースまたはモジュール全体にのみ適用できます。

注意

条件付きのデプロイは子リソースにはカスケードされません。 リソースとその子リソースを条件付きでデプロイする場合は、リソースの種類ごとに同じ条件を適用する必要があります。

トレーニング リソース

段階的なガイダンスを通じて条件の詳細を学習する場合は、「条件とループを使用して柔軟な Bicep テンプレートを作成する」を参照してください。

デプロイの条件を定義する

Bicep では、リソースをデプロイするかどうかを指定するパラメーターを渡すことで、リソースを条件付きでデプロイできます。 リソース宣言の if 式を使用して条件をテストします。 次の例は、Bicep ファイル内の if 式の構文を示しています。 DNS ゾーンを条件付きでデプロイします。 deployZonetrue の場合、DNS ゾーンがデプロイされます。 deployZonefalse の場合、DNS ゾーンのデプロイはスキップされます。

param deployZone bool

resource dnsZone 'Microsoft.Network/dnszones@2018-05-01' = if (deployZone) {
  name: 'myZone'
  location: 'global'
}

次の例では、条件付きでモジュールをデプロイします。

param deployZone bool

module dnsZone 'dnszones.bicep' = if (deployZone) {
  name: 'myZoneModule'
}

条件は、依存関係の宣言と共に使用できます。 明示的な依存関係の場合、リソースがデプロイされていないと、Azure Resource Manager によって必要な依存関係からそれが自動的に削除されます。 暗黙的な依存関係の場合、条件付きリソースのプロパティを参照することはできますが、デプロイ エラーが発生する可能性があります。

新規または既存のリソース

条件付きデプロイを使用して、新しいリソースを作成したり、既存のリソースを使用したりすることができます。 次の例は、新しいストレージ アカウントをデプロイするか、または既存のストレージ アカウントを使用する方法を示しています。

param storageAccountName string
param location string = resourceGroup().location

@allowed([
  'new'
  'existing'
])
param newOrExisting string = 'new'

resource saNew 'Microsoft.Storage/storageAccounts@2022-09-01' = if (newOrExisting == 'new') {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

resource saExisting 'Microsoft.Storage/storageAccounts@2022-09-01' existing = if (newOrExisting == 'existing') {
  name: storageAccountName
}

output storageAccountId string = ((newOrExisting == 'new') ? saNew.id : saExisting.id)

パラメーター newOrExistingnew に設定されると、その条件は true に評価されます。 ストレージ アカウントはデプロイされます。 そうでない場合は、既存のストレージ アカウントが使用されます。

警告

デプロイされていない条件付きでデプロイされたリソースを参照した場合、 リソースがテンプレートで定義されていないというエラーが表示されます。

ランタイム関数

条件付きでデプロイされるリソースで reference または list 関数を使用した場合、この関数はリソースがデプロイされていなくても評価されます。 この関数が存在しないリソースを参照する場合、エラーが返されます。

リソースがデプロイされるときにのみ条件に対してこの関数が評価されるようにするには、条件式 ? 演算子を使用します。 次のテンプレート例では、条件付きで有効な式限定で、この関数を使用する方法を示しています。

param vmName string
param location string
param logAnalytics string = ''

resource vmName_omsOnboarding 'Microsoft.Compute/virtualMachines/extensions@2023-03-01' = if (!empty(logAnalytics)) {
  name: '${vmName}/omsOnboarding'
  location: location
  properties: {
    publisher: 'Microsoft.EnterpriseCloud.Monitoring'
    type: 'MicrosoftMonitoringAgent'
    typeHandlerVersion: '1.0'
    autoUpgradeMinorVersion: true
    settings: {
      workspaceId: ((!empty(logAnalytics)) ? reference(logAnalytics, '2022-10-01').customerId : null)
    }
    protectedSettings: {
      workspaceKey: ((!empty(logAnalytics)) ? listKeys(logAnalytics, '2022-10-01').primarySharedKey : null)
    }
  }
}

output mgmtStatus string = ((!empty(logAnalytics)) ? 'Enabled monitoring for VM!' : 'Nothing to enable')

次の手順