Настройка имени и типа для дочерних ресурсов в 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@2022-09-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@2022-09-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

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

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

Ссылка на символьное имя дочернего ресурса работает так же, как и ссылка на родительский ресурс.

Полное имя ресурса за пределами родительского ресурса

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

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

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

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

Важно!

Не рекомендуется указывать полное имя и полный тип ресурса. Этот подход не является типобезопасным в отличие от других подходов. Дополнительные сведения см. в статье Правило анализатора кода: использование родительского свойства.

Дальнейшие действия