定义子资源
将某些资源仅部署在其父级上下文中是有意义的。 这些资源称为“子资源”。 Azure 中有许多子资源类型。 以下是一些示例:
名称 | 资源类型 |
---|---|
虚拟网络子网 | Microsoft.Network/virtualNetworks/subnets |
应用服务配置 | Microsoft.Web/sites/config |
SQL 数据库 | Microsoft.Sql/servers/databases |
虚拟机扩展 | Microsoft.Compute/virtualMachines/extensions |
存储 blob 容器 | Microsoft.Storage/storageAccounts/blobServices/containers |
Azure Cosmos DB 容器 | Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers |
例如,让我们考虑一个存储 blob 容器。 Blob 容器必须部署到存储帐户中,存在于存储帐户之外没有意义。
子资源类型的名称较长,包含多个部分。 存储 blob 容器具有这一完全限定的类型名称:Microsoft.Storage/storageAccounts/blobServices/containers
。 Blob 容器的资源 ID 包括包含容器和容器名称的存储帐户的名称。
备注
一些子资源可能与来自不同父级的其他子资源类型具有相同的名称。 例如,containers
同为存储帐户和 Azure Cosmos DB 数据库的子类型。 名称是相同的,但它们表示不同的资源,并且其完全限定的类型名称不同。
如何定义子资源?
使用 Bicep,可以通过多种方式声明子资源。 每种方式都有其自身的优势,不同情况下适合采用不同方式。 让我们来了解每种方法。
提示
以下所有方法都会在 Azure 中开展相同的部署活动。 可以选择最适合你需求的方法,而无需担心中断问题。 你可以更新模板并更改你使用的方法。
嵌套资源
定义子资源的一种方法是将子资源嵌套进父资源。 下面是用于部署虚拟机和虚拟机扩展的 Bicep 模板的示例。 虚拟机扩展是为虚拟机提供额外行为的子资源。 在本例中,扩展在部署完成后在虚拟机上运行一个自定义脚本。
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
resource installCustomScriptExtension 'extensions' = {
name: 'InstallCustomScript'
location: location
properties: {
// ...
}
}
}
请注意,嵌套资源的资源类型比常规资源更简单。 即使完全限定的类型名称为 Microsoft.Compute/virtualMachines/extensions
,嵌套资源也会自动继承父级的资源类型,因此你只需指定子资源类型 extensions
。
另请注意,没有为嵌套资源指定 API 版本。 Bicep 假设你要使用与父资源相同的 API 版本,但你也可以根据需要替代 API 版本。
可以使用 ::
运算符引用嵌套资源。 例如,可以创建一个会返回扩展的完整资源 ID 的输出:
output childResourceId string = vm::installCustomScriptExtension.id
嵌套资源是声明子资源的一种简单方法。 嵌套资源还使阅读模板的任何人都可以明显看出父子关系。 但是,如果有大量嵌套的资源或多层嵌套,模板可能会变得难以阅读。 还可以只嵌套最多五层的资源。
父属性
另一种方法是在不嵌套的情况下声明子资源。 然后,使用 parent
属性向 Bicep 指示父子关系的相关信息:
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
}
resource installCustomScriptExtension 'Microsoft.Compute/virtualMachines/extensions@2024-07-01' = {
parent: vm
name: 'InstallCustomScript'
location: location
properties: {
// ...
}
}
请注意,子资源使用 parent
属性来引用其父资源的符号名称。
引用父资源是声明子资源的另一种简单方法。 Bicep 了解父资源与子资源之间的关系,因此你不需要指定完全限定的资源名称或设置资源之间的依赖关系。 此方法还避免了使用过多嵌套,以免造成阅读困难。 但是,每次使用 parent
属性定义子资源时,都需要显式指定完整资源类型和 API 版本。
若要引用通过 parent
属性声明的子资源,请像使用常规父资源一样使用其符号名称:
output childResourceId string = installCustomScriptExtension.id
构造资源名称
在某些情况下,你无法使用嵌套资源或 parent
关键字。 例如,在 for
循环中声明子资源时,或需要使用复杂表达式为子资源动态选择父资源时。 在这些情况下,可以通过手动构造子资源名称来部署子资源,以便包含其父资源名称,如下所示:
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
}
resource installCustomScriptExtension 'Microsoft.Compute/virtualMachines/extensions@2024-07-01' = {
name: '${vm.name}/InstallCustomScript'
location: location
properties: {
// ...
}
}
请注意,此示例使用字符串内插将虚拟机资源 name
属性追加到子资源名称。 Bicep 知道子资源与父资源之间存在依赖关系。 可以改用 vmName
变量声明子资源名称。 但是,如果这样做,部署可能会失败,因为 Bicep 不知道需要在子资源之前部署父资源:
若要解决此问题,可以使用 dependsOn
关键字手动告知 Bicep 依赖关系,如下所示:
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
}
resource installCustomScriptExtension 'Microsoft.Compute/virtualMachines/extensions@2024-07-01' = {
name: '${vmName}/InstallCustomScript'
dependsOn: [
vm
]
//...
}
提示
通常最好避免构造资源名称,因为在 Bicep 了解资源之间的关系时你将失去它所能提供的许多好处。 只有在无法使用其他方法声明子资源时才使用此选项。
子资源 ID
通过包含其父资源的资源 ID,然后追加子资源类型和名称,开始创建子资源 ID。 例如,假设有一个名为 toyrnd
的 Azure Cosmos DB 帐户。 Azure Cosmos DB 资源提供程序公开名为 databaseAccounts
的类型,该类型是你部署的父资源:
/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.DocumentDB/databaseAccounts/toyrnd
下面是同一资源 ID 的可视化描述:
如果将数据库添加到此帐户,则可使用 sqlDatabases
子资源类型。 接下来,将名为 FlightTests
的数据库添加到 Azure Cosmos DB 帐户,并查看子资源 ID:
/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.DocumentDB/databaseAccounts/toyrnd/sqlDatabases/FlightTests
下面是一个可视化表示形式:
你可以具有多个级别的子资源。 下面是一个示例资源 ID,显示具有两个子级别的存储帐户:
/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.Storage/storageAccounts/secrettoys/blobServices/default/containers/glitterspecs
下面是同一资源 ID 的可视化表示形式:
此资源 ID 包含多个组件:
secrettoys
之前的所有内容均为父资源 ID。blobServices
指示资源位于名为blobServices
的子资源类型中。备注
无需自己创建
blobServices
资源。 创建存储帐户时,Microsoft.Storage
资源提供程序会自动为你创建此资源。 这种类型的资源有时称为“隐式”资源。 它们非常罕见,但你会在整个 Azure 中找到它们。default
是blobServices
子资源的名称。备注
有时,仅允许子资源的单个实例。 此类实例称为“单一实例”,通常被命名为
default
。containers
指示资源位于名为containers
的子资源类型中。glitterspecs
是 blob 容器的名称。
使用子资源时,资源 ID 可能会很长且看起来很复杂。 但是,如果将资源 ID 分解为组件,则会更容易理解资源的结构化方式。 资源 ID 还可以提供有关资源行为方式的重要线索。