Поделиться через


Установка имени и типа для дочерних ресурсов в Bicep

Дочерними называются ресурсы, существующие только в контексте другого ресурса. Например, расширение виртуальной машины не может существовать без виртуальной машины. Ресурс расширения является дочерним элементом виртуальной машины.

Каждый родительский ресурс принимает только определенные типы ресурсов в качестве дочерних ресурсов. Иерархия типов ресурсов доступна в справочнике по ресурсам Bicep.

В этой статье показаны различные способы объявления дочернего ресурса.

Обучающие материалы

Если вы хотите узнать о дочерних ресурсах с помощью пошагового руководства, см. статью "Развертывание дочерних ресурсов и ресурсов расширения с помощью 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/fileServices и Microsoft.Storage/storageAccounts/fileServices/shares. Вы не предоставляете Microsoft.Storage/storageAccounts/, поскольку это подразумевается из родительского типа ресурса и его версии. Вложенный ресурс может при необходимости объявить версию API с помощью синтаксиса <segment>@<version>. Если вложенный ресурс не использует версию API, используется версия API родительского ресурса. Если вложенный ресурс указывает версию API, используется указанная версия API.

Имена дочерних ресурсов заданы default и exampleshare, но полные имена включают родительские имена. Вы не предоставляете examplestorage или default, так как они предполагаются как данные из родительского ресурса.

Вложенный ресурс может получить доступ к свойствам родительского ресурса. Другие ресурсы, объявленные внутри тела одного родительского ресурса, могут ссылаться друг на друга с помощью символьных имен. Родительский ресурс может не получить доступ к свойствам содержащихся в нем ресурсов, эта попытка приведет к циклической зависимости.

Чтобы ссылаться на вложенный ресурс за пределами родительского ресурса, он должен быть квалифицирован с соответствующим именем ресурса и оператором :: . Например, чтобы вывести свойство из дочернего ресурса:

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: использование родительского свойства.

Дальнейшие шаги