Bicep でのリソースの依存関係

リソースをデプロイするとき、一部のリソースが他のリソースより前に確実にデプロイされるようにすることが必要な場合があります。 たとえば、データベースをデプロイする前に論理 SQL サーバーが必要です。 このリレーションシップは、あるリソースが他のリソースに依存しているとマークすることで確立します。 リソースのデプロイ順序は、暗黙的な依存関係明示的な依存関係の 2 つの方法で決定されます。

Azure Resource Manager により、リソース間の依存関係が評価され、リソースは依存する順にデプロイされます。 相互依存していないリソースは、平行してデプロイされます。 必要なのは、デプロイするリソースの依存関係を同じ Bicep ファイルに定義することだけです。

暗黙の依存関係

あるリソース宣言が同じデプロイ内の別のリソースを参照している場合は、暗黙的な依存関係が作成されます。 次の例では、otherResourceexampleDnsZone からプロパティを取得します。 otherResource という名前のリソースは、exampleDnsZone に暗黙的に依存しています。

resource exampleDnsZone 'Microsoft.Network/dnsZones@2023-07-01-preview' = {
  name: 'myZone'
  location: 'global'
}

resource otherResource 'Microsoft.Example/examples@2024-05-01' = {
  name: 'exampleResource'
  properties: {
    // get read-only DNS zone property
    nameServers: exampleDnsZone.properties.nameServers
  }
}

また、入れ子になったリソースも、内側のリソースに暗黙的な依存関係があります。

resource myParent 'My.Rp/parentType@2024-05-01' = {
  name: 'myParent'
  location: 'West US'

  // implicit dependency on 'myParent'
  resource myChild 'childType' = {
    name: 'myChild'
  }
}

プロパティを含むリソースは、親リソースに対する暗黙的な依存関係を持ちます。 その他の子リソースではなく、親リソースに依存します。

次の例は、ストレージ アカウントとファイル サービスを示しています。 ファイル サービスには、ストレージ アカウントに対する暗黙的な依存関係があります。

resource storage 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

resource service 'Microsoft.Storage/storageAccounts/fileServices@2023-04-01' = {
  name: 'default'
  parent: storage
}

resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-04-01' = {
  name: 'exampleshare'
  parent: service
}

暗黙的な依存関係が存在する場合は、明示的な依存関係を追加しないでください

入れ子になったリソースの詳細については、「Bicep での子リソースの名前と種類の設定」を参照してください。

明示的な依存関係

明示的な依存関係は、dependsOn プロパティで宣言されます。 このプロパティによって、リソース識別子の配列が受け入れられるため、複数の依存関係を指定できます。 :: 演算子を使用することで、入れ子になったリソースの依存関係を指定できます。

次の例は、dnsZone という名前の DNS ゾーンに依存する otherZone という名前の DNS ゾーンを示しています。

resource dnsZone 'Microsoft.Network/dnszones@2023-07-01-preview' = {
  name: 'demoeZone1'
  location: 'global'
}

resource otherZone 'Microsoft.Network/dnszones@2023-07-01-preview' = {
  name: 'demoZone2'
  location: 'global'
  dependsOn: [
    dnsZone
  ]
}

dependsOn を使用してリソース間のリレーションシップをマップする傾向があるものの、重要なのは、その操作を行う理由を理解することです。 たとえば、リソースが相互にどのように接続されているかをドキュメント化するには、dependsOn は適切な方法ではありません。 デプロイ後、リソースのプロパティにデプロイの依存関係が保持されないため、依存関係を確認できるコマンドや操作はありません。 Resource Manager ではこれらのリソースを並行してデプロイすることはできないため、不要な依存関係を設定するとデプロイ時間が遅くなります。

明示的な依存関係が必要になる場合もありますが、必要になることはめったにありません。 ほとんどの場合は、シンボリック名を利用して、リソース間の依存関係を暗黙的に示すことができます。 明示的な依存関係が設定されていることに気づいた場合、削除する方法があるかどうかを検討する必要があります。

依存関係を視覚化する

Visual Studio Code には、依存関係を視覚化するためのツールが用意されています。 Visual Studio Code で Bicep ファイルを開き、左上隅にあるビジュアライザー ボタンを選択します。 次のスクリーンショットには、仮想マシンの依存関係が示されています。

Visual Studio Code の Bicep リソース ビジュアライザーのスクリーンショット

次のステップ

リソースをデプロイするための構文については、「リソースの Bicep を使った宣言」をご覧ください。