Определите дочерние ресурсы

Завершено

Имеет смысл развернуть некоторые ресурсы только в контексте их родителя. Эти ресурсы называются дочерние ресурсы . В 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-контейнера включает имя учетной записи хранения, в которой он находится, и имя самого контейнера.

Заметка

Некоторые дочерние ресурсы могут иметь то же имя, что и другие типы дочерних ресурсов от разных родителей. Например, 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, если вы хотите.

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

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 понимает связь между родительскими и дочерними ресурсами, поэтому вам не нужно указывать полное имя ресурса или настраивать зависимость между ресурсами. Подход также избегает чрезмерного уровня вложенности, что затрудняет чтение. Однако необходимо явно указать полный тип ресурса и версию API при каждом определении дочернего ресурса с помощью свойства parent.

Чтобы ссылаться на дочерний ресурс, объявленный с помощью свойства 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 не распознаёт, что родительский ресурс необходимо развернуть до дочернего ресурса.

Чтобы устранить эту ситуацию, можно вручную сообщить Bicep о зависимости с помощью ключевого слова dependsOn, как показано ниже:

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 может предоставить, когда он понимает связи между вашими ресурсами. Используйте этот параметр только в том случае, если вы не можете использовать один из других подходов для определения дочерних ресурсов.

Идентификаторы дочерних ресурсов

Вы начинаете создавать идентификатор дочернего ресурса, сначала указывая идентификатор ресурса родителя, а затем добавляя тип и имя дочернего ресурса. Например, рассмотрим учетную запись Azure Cosmos DB с именем toyrnd. Поставщик ресурсов Azure Cosmos DB предоставляет тип с именем databaseAccounts, который является родительским ресурсом, который вы развертываете:

/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.DocumentDB/databaseAccounts/toyrnd

Вот визуальное изображение с тем же идентификатором ресурса:

идентификатор ресурса для учетной записи Azure Cosmos DB, разделённый на пары

Если мы добавляем базу данных к этой учетной записи, мы можем использовать дочерний тип ресурса sqlDatabases. Давайте добавим базу данных с именем FlightTests в учетную запись Azure Cosmos DB и рассмотрим идентификатор дочернего ресурса:

/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.DocumentDB/databaseAccounts/toyrnd/sqlDatabases/FlightTests

Вот визуальное представление:

Идентификатор дочернего ресурса для базы данных Azure Cosmos DB, разделённый на отдельные строки с парой

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

/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.Storage/storageAccounts/secrettoys/blobServices/default/containers/glitterspecs

Ниже приведено визуальное представление того же идентификатора ресурса:

идентификатор дочернего ресурса для учетной записи хранения с контейнером BLOB-объектов, разделенный парой

Этот идентификатор ресурса содержит несколько компонентов:

  • Все, что до secrettoys, это родительский идентификатор ресурса.

  • blobServices указывает, что ресурс находится в дочернем типе ресурса с именем blobServices.

    Заметка

    Вам не нужно создавать ресурсы типа blobServices самостоятельно. Поставщик ресурсов Microsoft.Storage автоматически создает этот ресурс при создании учетной записи хранения. Этот тип ресурса иногда называется неявным ресурсом. Они довольно редки, но вы найдете их в Azure.

  • default — это имя дочернего ресурса blobServices.

    Заметка

    Иногда допускается только один экземпляр дочернего ресурса. Этот тип экземпляра называется одноэлементным , и часто присваивается имя default.

  • containers указывает, что ресурс находится в дочернем типе ресурса с именем containers.

  • glitterspecs — это имя контейнера BLOB.

При работе с дочерними ресурсами идентификаторы ресурсов могут быть длинными и сложными. Однако если вы разбиваете идентификатор ресурса на его компоненты, проще понять, как структурирован ресурс. Идентификатор ресурса также может дать важные сведения о том, как работает ресурс.