在 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@2021-02-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@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
}

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

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

父级外部的完整资源名称

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

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: 'examplestorage/default'
  dependsOn: [
    storage
  ]
}

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

重要

不建议设置完整的资源名称和类型。 它的安全性与使用其他方法时的安全性不同。

后续步骤