Развертывание подписок с помощью файлов Bicep
Чтобы упростить управление ресурсами, можно развернуть ресурсы на уровне подписки Azure. Например, можно развернуть политики и управление доступом на основе ролей Azure (Azure RBAC) в подписке, чтобы применять их по всей подписке.
В этой статье описывается, как задать область развертывания подписке в Bicep-файле.
Примечание.
На уровне подписки можно развернуть до 800 различных групп ресурсов.
Обучающие материалы
Дополнительные сведения об областях развертывания, а также практические инструкции вы найдете в модуле Развертывание ресурсов в подписках, группах управления и арендаторах с помощью Bicep
Поддерживаемые ресурсы
Не все типы ресурсов можно развернуть на уровне подписки. В этом разделе перечислены поддерживаемые типы ресурсов.
Для Azure Blueprints используйте следующие типы:
Для политик Azure используйте следующие типы:
Для управления доступом используйте:
- accessReviewScheduleDefinitions
- accessReviewScheduleSettings
- roleAssignments;
- roleAssignmentScheduleRequests
- roleDefinitions.
- roleEligibilityScheduleRequests
- roleManagementPolicyAssignments
Для вложенных шаблонов, которые развертываются в группах ресурсов, используйте следующие типы:
Для создания групп ресурсов используйте следующие типы:
Для управления подпиской используйте следующие типы:
- budgets;
- конфигурации Помощника
- lineOfCredit
- блокировки
- профиль — изменение анализа
- supportPlanTypes;
- теги
Для мониторинга используйте:
В целях безопасности используйте:
- advancedThreatProtectionSettings
- alertsSuppressionRules
- assessmentMetadata
- оценки
- autoProvisioningSettings
- соединители
- deviceSecurityGroups
- ingestionSettings
- цены
- securityContacts
- параметры
- workspaceSettings
Другие поддерживаемые типы:
Область — набор
Чтобы установить область для подписки, используйте следующий код:
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 приведены в следующих статьях:
- Развертывание ресурсов с помощью шаблонов ARM и Azure CLI
- Развертывание ресурсов с помощью шаблонов ARM и Azure PowerShell
- Развертывание шаблонов ARM из Cloud Shell
Расположение и имя развертывания
Для развертываний на уровне подписки необходимо указать расположение для развертывания. Расположение развертывания отделено от расположения развертываемых ресурсов. В расположении развертывания указывается место хранения данных развертывания. Для развертываний групп управления и клиентов также требуется указать расположение. При развертывании группы ресурсов для хранения данных развертывания используется расположение группы ресурсов.
Можно указать имя развертывания или использовать имя развертывания по умолчанию. Имя по умолчанию — это имя файла шаблона. Например, когда вы развертываете шаблон с именем main.json, создается имя развертывания по умолчанию main.
Для каждого имени развертывания расположение остается неизменным. Нельзя создать развертывание в одном расположении, если в другом уже есть развертывание с таким же именем. Например, если вы создаете развертывание подписки с именем deployment1 в centralus, вы не сможете позже создать другое развертывание с именем deployment1, но уже в расположении westus. Если появится код ошибки InvalidDeploymentLocation
, используйте другое имя или то же расположение, что и для предыдущего развертывания с этим именем.
Области развертывания
При развертывании в подписку можно развернуть ресурсы в:
- целевую подписку из операции;
- любую подписку в клиенте;
- группы ресурсов в той же подписке или других подписках;
- клиенте для подписки.
Ресурс расширения можно ограничить целевым объектом, который отличается от целевого объекта развертывания.
Пользователь, развертывающий шаблон, должен иметь доступ к указанной области.
Область действия для подписки
Чтобы развернуть ресурсы в целевой подписке, добавьте их с использованием ключевого слова resource
.
targetScope = 'subscription'
// resource group created in target subscription
resource exampleResource 'Microsoft.Resources/resourceGroups@2024-03-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@2023-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@2024-04-01' = {
name: policyName
properties: {
policyDefinitionId: policyDefinitionID
parameters: policyParameters
}
}
Создание и назначение определения политики
Вы можете определить и назначить определение политики в том же файле Bicep.
targetScope = 'subscription'
resource locationPolicy 'Microsoft.Authorization/policyDefinitions@2023-04-01' = {
name: 'locationpolicy'
properties: {
policyType: 'Custom'
parameters: {}
policyRule: {
if: {
field: 'location'
equals: 'northeurope'
}
then: {
effect: 'deny'
}
}
}
}
resource locationRestrict 'Microsoft.Authorization/policyAssignments@2024-04-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@2024-03-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
}
}
Следующие шаги
Сведения о других областях приведены в следующих статьях: