采用 Bicep 文件的订阅部署

若要简化资源管理,可在 Azure 订阅级别部署资源。 例如,可以将策略Azure 基于角色的访问控制 (Azure RBAC) 部署到你的订阅中,从而将它们应用于整个订阅。

本文介绍如何在 Bicep 文件中将部署范围设置为订阅。

注意

可在订阅级别部署中部署到 800 个不同的资源组。

支持的资源

并非所有资源类型都可以部署到订阅级别。 本部分列出了支持的资源类型。

对于 Azure 蓝图,请使用:

  • 项目
  • blueprints
  • blueprintAssignments
  • versions

对于 Azure 策略,请使用:

  • policyAssignments
  • policyDefinitions
  • policySetDefinitions
  • remediations

对于访问控制,请使用:

  • accessReviewScheduleDefinitions
  • accessReviewScheduleSettings
  • roleAssignments
  • roleDefinitions
  • roleEligibilityScheduleRequests
  • roleManagementPolicyAssignments

对于部署到资源组的嵌套模板,请使用:

  • deployments

若要创建新的资源组,请使用:

  • resourceGroups

若要管理订阅,请使用:

  • 预算
  • 配置 - 顾问
  • lineOfCredit
  • 锁定
  • 配置文件 - 更改分析
  • supportPlanTypes
  • 标记

对于监视,请使用:

  • diagnosticSettings
  • logprofiles

对于安全性,请使用:

  • advancedThreatProtectionSettings
  • alertsSuppressionRules
  • assessmentMetadata
  • assessments
  • autoProvisioningSettings
  • 连接器
  • deviceSecurityGroups
  • ingestionSettings
  • pricings
  • workspaceSettings

其他支持的类型包括:

  • scopeAssignments
  • eventSubscriptions
  • peerAsns

集作用域

若要将范围设置为订阅,请使用以下命令:

targetScope = 'subscription'

部署命令

若要部署到订阅,请使用订阅级别部署命名。

对于 Azure CLI,请使用 az deployment sub create。 以下示例会部署一个模板来创建资源组:

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

有关部署命令和部署 ARM 模板的选项的更多详细信息,请参阅:

部署位置和名称

对于订阅级别部署,必须为部署提供位置。 部署位置独立于部署的资源的位置。 部署位置指定何处存储部署数据。 管理组租户部署也需要位置。 对于资源组部署,资源组的位置用于存储部署数据。

可以为部署提供一个名称,也可以使用默认部署名称。 默认名称是模板文件的名称。 例如,部署名为“main.json”的模板会创建默认部署名称 main。

每个部署名称的位置不可变。 当某个位置中已有某个部署时,无法在另一位置创建同名的部署。 例如,如果在 chinaeast 中创建名为“deployment1”的订阅部署,则以后不能创建另一个名为“deployment1”但位置为“chinanorth”的部署。 如果出现错误代码 InvalidDeploymentLocation,请使用其他名称或使用与该名称的以前部署相同的位置。

部署范围

部署到订阅时,可以将资源部署到:

  • 操作中的目标订阅
  • 租户中的任何订阅
  • 该订阅或其他订阅中的资源组
  • 订阅的租户

可以将扩展资源的范围设置为与部署目标不同的范围。

部署模板的用户必须有权访问指定的作用域。

订阅的范围

若要将资源部署到目标订阅,请使用关键字 resource 添加这些资源。

targetScope = 'subscription'

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

有关部署到订阅的示例,请参阅使用 Bicep 创建资源组分配策略定义

若要将资源部署到与操作中的订阅不同的订阅,请添加一个模块。 使用 subscription 函数设置 scope 属性。 将 subscriptionId 属性设置为要部署到的订阅的 ID。

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 Policy

分配策略定义

以下示例将现有的策略定义分配到订阅。 如果策略定义使用参数,请将参数作为对象提供。 如果策略定义不使用参数,请使用默认的空对象。

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: 'chinaeast2'
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

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

访问控制

若要了解如何分配角色,请参阅使用 Azure 资源管理器模板添加 Azure 角色分配

以下示例创建一个资源组,对其应用锁定,并为主体分配一个角色。

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
  }
}

后续步骤

若要了解其他范围,请参阅: