将蓝图迁移到部署堆栈

本文介绍如何将蓝图定义和分配转换为部署堆栈。 部署堆栈是 Microsoft.Resources 命名空间中的新工具,将 Azure 蓝图功能引入此区域。

迁移步骤

  1. 将蓝图定义导出到蓝图定义 JSON 文件中,这些文件包含 Azure 策略的项目、Azure 角色分配和模板。

  2. 将蓝图定义 JSON 文件转换为单个 ARM 模板或 Bicep 文件,以便通过部署堆栈进行部署,并考虑以下注意事项:

    • 角色分配: 转换任何角色分配
    • 策略: 将任何策略分配转换为 Bicep (或 ARM JSON 模板)语法,然后将其添加到主模板。 还可以将 policyDefinitions 嵌入 JSON 模板。
    • 模板: 将任何模板转换为提交到部署堆栈的主模板。 可以在 Bicep 中使用模块,将模板嵌入为嵌套模板或模板链接,还可以选择使用模板规格在 Azure 中存储模板。 使用部署堆栈不需要模板规格。
    • :Deployment 堆栈 DenySettingsMode 使你能够通过 DenySettingsMode (类似于蓝图锁)阻止不需要的更改。 可以通过 Azure CLI 或 Azure PowerShell 配置这些配置。 为此,需要相应的角色才能设置拒绝设置。
  3. 可以选择为转换后的 ARM 模板或 Bicep 文件创建模板规格。 模板规格允许你在 Azure 环境中存储模板及其版本,从而简化整个组织的模板共享。 通过部署堆栈,可以将模板规格定义或 ARM 模板/Bicep 文件部署到指定的目标范围。

示例

以下 Bicep 文件是一个示例迁移文件。

targetScope = 'subscription'

param roleAssignmentName string = 'myTestRoleAssignment'
param roleDefinitionId string = guid(roleAssignmentName)
param principalId string = guid('myTestId')

param policyAssignmentName string = 'myTestPolicyAssignment'
param policyDefinitionID string = '/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d'

param rgName string = 'myTestRg'
param rgLocation string = deployment().location
param templateSpecName string = 'myNetworkingTs'

// Step 1 - create role assignments
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(roleAssignmentName)
  properties: {
    principalId: principalId
    roleDefinitionId: roleDefinitionId
  }
}

// Step 2 - create policy assignments
resource policyAssignment 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
    name: policyAssignmentName
    scope: subscriptionResourceId('Microsoft.Resources/resourceGroups', resourceGroup().name)
    properties: {
        policyDefinitionId: policyDefinitionID
    }
}

// Step 3 - create template artifacts via modules (or template specs)
resource rg1 'Microsoft.Resources/resourceGroups@2021-01-01' = {
  name: rgName
  location: rgLocation
}

module vnet 'templates/bicep/vnet.bicep' = if (rgName == 'myTestRg') {
  name: uniqueString(rgName)
  scope: rg1
  params: { location: rgLocation }
}