Развертывание ресурсов в нескольких областях

Завершено

Иногда требуется развернуть ресурсы на нескольких уровнях иерархии в рамках одного развертывания. Ниже приведены некоторые ситуации, в которых это может потребоваться.

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

С помощью Bicep можно создать развертывание, которое работает в диапазоне областей, используя ключевое слово scope.

Примечание.

Команды в этом уроке демонстрируют основные понятия. На этом этапе не выполняйте команды. Вскоре вы поупражняетесь с полученными знаниями.

Указание области для модуля

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

targetScope = 'subscription'

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

Обратите внимание, что свойство scope использует функцию Bicep, чтобы помочь определить целевую область. В предыдущем примере используется функция resourceGroup() и указывается имя целевой группы ресурсов. Можно также использовать функции subscription(), managementGroup() и tenant(). Используя ключевое слово targetScope в файлах Bicep и ключевое слово scope в модулях, можно создавать множество различных комбинаций областей действия для развертываний.

Примечание.

Единственным исключением является то, что файлы Bicep с targetScope из resourceGroup или subscription не могут содержать модуль с scope из managementGroup.

Совет

При использовании файла Bicep с областью действия подписки для создания группы ресурсов можно использовать символьное имя группы ресурсов в качестве scope для модуля. Это будет реализовано в следующем упражнении.

Развертывание в нескольких группах ресурсов

Обычно области используются для развертывания ресурсов в нескольких группах ресурсов. Хотя вы не можете задать свойство scope для большинства ресурсов Azure, вы можете использовать модули, чтобы сообщить Bicep, что набор ресурсов должен быть развернут в другой группе ресурсов.

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

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

resource networkInterface 'Microsoft.Network/networkInterfaces@2024-01-01' = {
  name: 'production-nic'
  location: resourceGroup().location
  properties: {
    ipConfigurations: [
      {
        name: 'toy-subnet-ip-configuration'
        properties: {
          subnet: {
            id: networkModule.outputs.subnetResourceId
          }
        }
      }
    ]
  }
}

Обратите внимание, что ресурсы, которые должны быть развернуты в группе ресурсов ToyNetworking, определены в модуле, а выходные данные subnetResourceId используются в определении ресурса сетевого интерфейса.

После развертывания этого файла можно выбрать другую целевую группу ресурсов с именем ProjectTeddybear, например:

az deployment group create --resource-group ProjectTeddybear ...
New-AzResourceGroupDeployment -ResourceGroupName ProjectTeddybear ...

Хотя развертывание предназначено для группы ресурсов ProjectTeddybear , ресурсы виртуальной сети развертываются в группе ресурсов ToyNetworking . Сетевой интерфейс развертывается в группе ресурсов ProjectTeddybear .

Группу ресурсов можно даже развернуть в другой подписке, включив идентификатор подписки в область resourceGroup:

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'ToyNetworking')
  name: 'networkModule'
}

Аналогичным образом можно использовать функцию области subscription() для развертывания ресурсов в нескольких подписках в области действия подписки, а функцию области managementGroup() можно использовать для развертывания ресурсов в нескольких группах управления. Однако их нельзя развернуть для нескольких клиентов.

Указание области для одного ресурса

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

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

targetScope = 'managementGroup'

resource parentManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

Обратите внимание, что в этом примере в файле шаблона используется targetScope = 'managementGroup', а затем он развертывает группы управления в пределах области tenant().

Примечание.

В предыдущем примере показано, как можно использовать Bicep для создания иерархии групп управления. Группа управления NonProduction будет дочерней по отношению к корневой группе управления, а группа управления SecretRND будет дочерней по отношению к группе управления NonProduction.

Создание группы управления и иерархии подписок

Теперь вы знаете, как развертывать множество различных ресурсов в разных областях, а также как использовать модули Bicep и ключевое слово scope для развертывания комбинаций ресурсов. Давайте применим все эти новые знания для расширения иерархии групп управления в предыдущем примере. Теперь иерархия также будет содержать псевдоним подписки, который представляет собой ресурс с областью действия клиента, который создает новую подписку Azure:

resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

Примечание.

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

Затем можно связать подписку с группой управления, для которой требуется развернуть тип ресурса с именем Microsoft.Management/managementGroups/subscriptions. Учитывая способ работы этого ресурса, его можно объявить в модуле. Например, есть файл с именем modules/mg-subscription-association.bicep:

targetScope = 'tenant'

@description('The name of the management group that should contain the subscription.')
param managementGroupName string

@description('The subscription ID to place into the management group.')
param subscriptionId string

resource managementGroup 'Microsoft.Management/managementGroups@2023-04-01' existing = {
  name: managementGroupName
}

resource subscriptionAssociation 'Microsoft.Management/managementGroups/subscriptions@2023-04-01' = {
  parent: managementGroup
  name: subscriptionId
}

Обратите внимание, что ссылка на группу управления указывается с помощью ключевого слова existing.

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

targetScope = 'managementGroup'

@description('The name of the subscription alias to deploy.')
param subscriptionAliasName string

resource parentManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

module subscriptionAssociation 'modules/mg-subscription-association.bicep' = {
  name: 'subscriptionAssociation'
  scope: tenant()
  params: {
    managementGroupName: childManagementGroup.name
    subscriptionId: subscription.properties.subscriptionId
  }
}

Как было показано выше, вы можете использовать все области и функции языка Bicep для создания сложных развертываний всей инфраструктуры Azure.