Развертывание подписок с помощью файлов Bicep

Чтобы упростить управление ресурсами, можно развернуть ресурсы на уровне подписки Azure. Например, можно развернуть политики и управление доступом на основе ролей Azure (Azure RBAC) в подписке, чтобы применять их по всей подписке.

В этой статье описывается, как настроить область развертывания для подписки в файле Bicep.

Примечание

На уровне подписки можно развернуть до 800 различных групп ресурсов.

Учебные ресурсы

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

Поддерживаемые ресурсы

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

Для Azure Blueprints используйте следующие типы:

Для политик Azure используйте следующие типы:

Для управления доступом используйте:

Для вложенных шаблонов, которые развертываются в группах ресурсов, используйте следующие типы:

Для создания групп ресурсов используйте следующие типы:

Для управления подпиской используйте следующие типы:

Для мониторинга используйте:

В целях безопасности используйте:

Другие поддерживаемые типы:

Область — набор

Чтобы установить область для подписки, используйте следующий код:

targetScope = 'subscription'

Команды развертывания

Для развертывания в подписке используйте команды развертывания на уровне подписки.

Для Azure CLI используйте az deployment sub create. В следующем примере выполняется развертывание шаблона для создания группы ресурсов.

az deployment sub create \
  --name demoSubDeployment \
  --location centralus \
  --template-file main.bicep \
  --parameters rgName=demoResourceGroup rgLocation=centralus

Более подробные сведения о командах и параметрах развертывания для развертывания шаблонов ARM приведены в следующих статьях:

Расположение и имя развертывания

Для развертываний на уровне подписки необходимо указать расположение для развертывания. Расположение развертывания отделено от расположения развертываемых ресурсов. В расположении развертывания указывается место хранения данных развертывания. Для развертываний групп управления и клиентов также требуется указать расположение. При развертывании группы ресурсов расположение группы ресурсов используется для хранения данных развертывания.

Можно указать имя развертывания или использовать имя развертывания по умолчанию. Имя по умолчанию — это имя файла шаблона. Например, когда вы развертываете шаблон с именем main.json, создается имя развертывания по умолчанию main.

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

Области развертывания

При развертывании в подписку можно развернуть ресурсы в:

  • целевую подписку из операции;
  • любую подписку в клиенте;
  • группы ресурсов в той же подписке или других подписках;
  • клиенте для подписки.

Ресурс расширения можно ограничить целевым объектом, который отличается от целевого объекта развертывания.

Пользователь, развертывающий шаблон, должен иметь доступ к указанной области.

Область действия для подписки

Чтобы развернуть ресурсы в целевой подписке, добавьте их с использованием ключевого слова resource.

targetScope = 'subscription'

// resource group created in target subscription
resource exampleResource 'Microsoft.Resources/resourceGroups@2022-09-01' = {
  ...
}

Примеры развертывания в подписке см. в разделах Создание групп ресурсов с помощью Bicep и Назначение определения политики.

Чтобы развернуть ресурсы в подписке, которая отличается от подписки из операции, добавьте модуль. Используйте функцию subscription, чтобы задать свойство scope. Задайте для свойства subscriptionId идентификатор подписки, в которую требуется выполнить развертывание.

targetScope = 'subscription'

param otherSubscriptionID string

// module deployed at subscription level but in a different subscription
module exampleModule 'module.bicep' = {
  name: 'deployToDifferentSub'
  scope: subscription(otherSubscriptionID)
}

Область для группы ресурсов

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

targetScope = 'subscription'

param resourceGroupName string

module exampleModule 'module.bicep' = {
  name: 'exampleModule'
  scope: resourceGroup(resourceGroupName)
}

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

Область для клиента

Чтобы создать ресурсы в клиенте, добавьте модуль. Используйте функцию tenant, чтобы задать его свойство scope.

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

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

targetScope = 'subscription'

// module deployed at tenant level
module exampleModule 'module.bicep' = {
  name: 'deployToTenant'
  scope: tenant()
}

Вместо использования модуля можно задать область tenant() для некоторых типов ресурсов. В следующем примере выполняется развертывание группы управления в клиенте.

targetScope = 'subscription'

param mgName string = 'mg-${uniqueString(newGuid())}'

// management group created at tenant
resource managementGroup 'Microsoft.Management/managementGroups@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {}
}

output output string = mgName

Дополнительные сведения находятся в Обзоре группы управления.

Группы ресурсов

Сведения о создании групп ресурсов см. в статье Создание группы ресурсов с помощью Bicep.

Политика Azure

Назначение определения политики

В следующем примере подписке присваивается имеющееся определение политики. Предоставьте параметры в качестве объекта, если определение политики принимает их. Используйте пустой объект по умолчанию, если определение политики не принимает параметры.

targetScope = 'subscription'

param policyDefinitionID string
param policyName string
param policyParameters object = {}

resource policyAssign 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: policyName
  properties: {
    policyDefinitionId: policyDefinitionID
    parameters: policyParameters
  }
}

Создание и назначение определения политики

Вы можете определить и назначить определение политики в том же файле Bicep.

targetScope = 'subscription'

resource locationPolicy 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  name: 'locationpolicy'
  properties: {
    policyType: 'Custom'
    parameters: {}
    policyRule: {
      if: {
        field: 'location'
        equals: 'northeurope'
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource locationRestrict 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: 'allowedLocation'
  properties: {
    policyDefinitionId: locationPolicy.id
  }
}

Управление доступом

Дополнительные сведения о назначении ролей Azure см. в статье Добавление назначений ролей Azure с помощью шаблонов Azure Resource Manager.

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

targetScope = 'subscription'

@description('Name of the resourceGroup to create')
param resourceGroupName string

@description('Location for the resourceGroup')
param resourceGroupLocation string

@description('principalId of the user that will be given contributor access to the resourceGroup')
param principalId string

@description('roleDefinition to apply to the resourceGroup - default is contributor')
param roleDefinitionId string = 'b24988ac-6180-42a0-ab88-20f7382dd24c'

@description('Unique name for the roleAssignment in the format of a guid')
param roleAssignmentName string = guid(principalId, roleDefinitionId, resourceGroupName)

var roleID = '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/${roleDefinitionId}'

resource newResourceGroup 'Microsoft.Resources/resourceGroups@2022-09-01' = {
  name: resourceGroupName
  location: resourceGroupLocation
  properties: {}
}

module applyLock 'lock.bicep' = {
  name: 'applyLock'
  scope: newResourceGroup
}

module assignRole 'role.bicep' = {
  name: 'assignRBACRole'
  scope: newResourceGroup
  params: {
    principalId: principalId
    roleNameGuid: roleAssignmentName
    roleDefinitionId: roleID
  }
}

В следующем примере показан модуль для применения блокировки:

resource createRgLock 'Microsoft.Authorization/locks@2020-05-01' = {
  name: 'rgLock'
  properties: {
    level: 'CanNotDelete'
    notes: 'Resource group should not be deleted.'
  }
}

В следующем примере показан модуль для назначения роли:

@description('The principal to assign the role to')
param principalId string

@description('A GUID used to identify the role assignment')
param roleNameGuid string = newGuid()

param roleDefinitionId string

resource roleNameGuid_resource 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: roleNameGuid
  properties: {
    roleDefinitionId: roleDefinitionId
    principalId: principalId
  }
}

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

Сведения о других областях приведены в следующих статьях: