在 Bicep 中为子资源设置名称和类型

子资源是只存在于另一资源的上下文内的资源。 例如,如果没有虚拟机,虚拟机扩展就不存在。 扩展资源是虚拟机的子实体。

每个父资源仅接受特定的资源类型作为子资源。

本文介绍可以定义子资源的不同方式。

名称和类型模式

在 Bicep 中,可以在父资源内或父资源外部指定子资源。 为资源名称和资源类型提供的值因声明子资源的方式而异。 但是,全名和类型始终解析为相同的模式。

子资源的全名使用模式:

{parent-resource-name}/{child-resource-name}

如果层次结构中有超过两个级别,请持续重复父级名称:

{parent-resource-name}/{child-level1-resource-name}/{child-level2-resource-name}

子资源的完整类型使用模式:

{resource-provider-namespace}/{parent-resource-type}/{child-resource-type}

如果层次结构中有多个级别,请继续重复父资源类型:

{resource-provider-namespace}/{parent-resource-type}/{child-level1-resource-type}/{child-level2-resource-type}

如果对字符之间的 / 段进行计数,则类型中的段数始终大于名称中的段数。

在父资源内部

以下示例展示了在父资源的资源属性中所包含的子资源。

resource <parent-resource-symbolic-name> '<resource-type>@<api-version>' = {
  <parent-resource-properties>

  resource <child-resource-symbolic-name> '<child-resource-type>' = {
    <child-resource-properties>
  }
}

嵌套资源声明必须出现在父资源语法的顶层。 只要每个级别都是其父资源的子类型,就可以以任意深度嵌套声明。

在父资源类型中定义时,可以将类型和名称值的格式设置为单个段,而不使用斜杠。 以下示例显示了具有文件服务的子资源的存储帐户,文件服务具有文件共享的子资源。 文件服务的名称设置为 default ,其类型设置为 fileServices。 文件共享的名称已设置 exampleshare ,其类型设置为 shares

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

  resource service 'fileServices' = {
    name: 'default'

    resource share 'shares' = {
      name: 'exampleshare'
    }
  }
}

完整的资源类型仍为 Microsoft.Storage/storageAccounts/fileServicesMicrosoft.Storage/storageAccounts/fileServices/shares。 你不需要提供 Microsoft.Storage/storageAccounts/,因为默认会从父资源类型和版本中获取。 嵌套资源可以选择使用语法 <segment>@<version>声明 API 版本。 如果嵌套资源省略 API 版本,则使用父资源的 API 版本。 如果嵌套资源指定 API 版本,则使用指定的 API 版本。

子资源名称设置为 defaultexampleshare,但完整名称包括父资源名称。 你不提供 examplestoragedefault,因为它们被认为是继承自父资源的。

嵌套资源可以访问其父资源的属性。 在同一父资源的正文中声明的其他资源可以使用符号名称相互引用。 父资源可能无法访问它包含的资源的属性,此尝试会导致循环依赖关系。

若要引用父资源外部的嵌套资源,必须使用包含的资源名称和 :: 运算符进行限定。 例如,若要从子资源输出属性:

output childAddressPrefix string = VNet1::VNet1_Subnet1.properties.addressPrefix

父资源外部

以下示例显示了父资源外部的子资源。 如果未在同一模板中部署父资源,或者想要使用 循环 创建多个子资源,则可以使用此方法。 请指定子级的父属性,将其值设置为父级的符号名称。 使用此语法,你仍然需要声明完整的资源类型,但子资源的名称就是子级的名称。

resource <parent-resource-symbolic-name> '<resource-type>@<api-version>' = {
  name: 'myParent'
  <parent-resource-properties>
}

resource <child-resource-symbolic-name> '<child-resource-type>@<api-version>' = {
  parent: <parent-resource-symbolic-name>
  name: 'myChild'
  <child-resource-properties>
}

在父资源外部定义时,请使用斜杠来格式化类型和名称值,使之包含父类型和名称。

以下示例演示在根级别定义的存储帐户、文件服务和文件共享。

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

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

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

引用子资源符号名称的工作方式与引用父名称相同。

父级外部的完整资源名称

在父资源外部声明子资源时,也可以使用完整的资源名称和类型。 你没有在子资源上设置父属性。 由于无法推断依赖项,因此必须显式设置它。

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

resource service 'Microsoft.Storage/storageAccounts/fileServices@2024-01-01' = {
  name: 'examplestorage/default'
  dependsOn: [
    storage
  ]
}

resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2024-01-01' = {
  name: 'examplestorage/default/exampleshare'
  dependsOn: [
    service
  ]
}

重要

设置完整的资源名称和类型不是推荐的方法。 它的安全性与使用其他方法时的安全性不同。 有关详细信息,请参阅 Linter 规则:使用父属性

后续步骤