Bicep 中的资源依赖关系
在部署资源时,可能需要确保有些资源在其他资源之前先部署。 例如,在部署数据库之前,需要逻辑 SQL Server。 可通过将一个资源标记为依赖于其他资源来建立此关系。 确定资源部署顺序有两种方式:隐式依赖项和显式依赖项
Azure 资源管理器将评估资源之间的依赖关系,并根据其依赖顺序进行部署。 如果资源互不依赖,资源管理器将以并行方式部署资源。 只需为同一 Bicep 文件中部署的资源定义依赖关系。
隐式依赖项
当一个资源声明引用同一部署中的另一个资源时,会创建隐式依赖项。 在以下示例中,otherResource
从 exampleDnsZone
获取属性。 名为 otherResource
的资源隐式依赖于 exampleDnsZone
。
resource exampleDnsZone 'Microsoft.Network/dnszones@2018-05-01' = {
name: 'myZone'
location: 'China North2'
}
resource otherResource 'Microsoft.Example/examples@2023-05-01' = {
name: 'exampleResource'
properties: {
// get read-only DNS zone property
nameServers: exampleDnsZone.properties.nameServers
}
}
嵌套资源也隐式依赖于其包含资源。
resource myParent 'My.Rp/parentType@2023-05-01' = {
name: 'myParent'
location: 'China North 2'
// implicit dependency on 'myParent'
resource myChild 'childType' = {
name: 'myChild'
}
}
包含 parent 属性的资源有一个对父资源的隐式依赖项。 它依赖于父资源,而不依赖于其任何其他子资源。
以下示例显示了存储帐户和文件服务。 文件服务有一个对存储帐户的隐式依赖项。
resource storage 'Microsoft.Storage/storageAccounts@2021-02-01' = {
name: 'examplestorage'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}
resource service 'Microsoft.Storage/storageAccounts/fileServices@2021-02-01' = {
name: 'default'
parent: storage
}
存在隐式依赖项时,请勿添加显式依赖项。
有关嵌套资源的详细信息,请参阅在 Bicep 中设置子资源的名称和类型。
显式依赖关系
使用 dependsOn
属性声明显式依赖项。 该属性接受一组资源标识符,因此你可以指定多个依赖项。 可以使用 ::
运算符指定嵌套资源依赖关系。
以下示例显示了名为 otherZone
的 DNS 区域,该区域依赖于名为 dnsZone
的 DNS 区域:
resource dnsZone 'Microsoft.Network/dnszones@2018-05-01' = {
name: 'demoeZone1'
location: 'China North2'
}
resource otherZone 'Microsoft.Network/dnszones@2018-05-01' = {
name: 'demoZone2'
location: 'China North2'
dependsOn: [
dnsZone
]
}
尽管你可能倾向于使用 dependsOn
来映射资源之间的关系,但请务必了解这么做的理由。 例如,若要记录资源的互连方式,使用 dependsOn
并不是合适的方法。 部署后,资源不会在其属性中保留部署依赖项,因此没有可让你查看依赖项的命令或操作。 设置不必要的依赖关系会减慢部署速度,因为资源管理器无法并行部署这些资源。
尽管有时需要显式依赖关系,但这种情况非常罕见。 在大多数情况下,你可以使用一个符号名称来隐式表示资源之间的依赖关系。 如果发现自己设置了显式依赖项,应考虑是否可以将其删除。
可视化依赖项
Visual Studio Code 提供了一个用于可视化依赖关系的工具。 在 Visual Studio Code 中打开 Bicep 文件,然后选择左上角的可视化工具按钮。 以下屏幕截图显示了虚拟机的依赖项。
后续步骤
有关用于部署资源的语法,请参阅 Bicep 中的资源声明。