将资源转换为 Bicep 文件并将其迁移到
开始迁移到 Bicep 的过程时,请务必遵循结构化过程来确保 Bicep 文件正确描述 Azure 资源。 你需要确保 Bicep 代码遵循最佳做法,并且它经过全面测试和安全才能用于后续部署。 在此单元中,你将了解 Bicep 迁移的前两个阶段:转换阶段和迁移阶段。
这两个阶段的主要重点是准备新的 Bicep 文件,然后再对其进行重构和测试。
转换阶段
在将资源迁移到 Bicep 的转换阶段,目标是捕获 Azure 资源的初始表示形式。 你在此阶段创建的 Bicep 文件并未完成,尚未准备好使用。 但是,该文件提供了开始迁移的起点。
转换阶段由两个可能的步骤组成,按顺序完成:
- 捕获 Azure 资源的表示形式。
- 如有必要,请使用
decompile
命令将 JSON 表示形式转换为 Bicep。
如果有一个要转换为 Bicep 的现有 JSON 模板,则第一步很容易,因为已有源模板。 在此单元中,你将了解如何将其反编译为 Bicep。
如果要转换使用 Azure 门户或其他工具部署的 Azure 资源,则需要捕获资源定义。 可以导出资源定义并将其转换为 Bicep,也可以使用 Visual Studio Code 中的 “插入资源 ”命令插入 Azure 资源的 Bicep 表示形式。
Azure 如何表示资源
Azure 资源管理器是用于部署和管理 Azure 中的资源的服务。 无论用于部署资源的方法如何,部署到 Azure 的所有资源都由资源管理器跟踪。 可以使用 Azure 门户、Azure CLI、Azure PowerShell、资源管理器 REST API 和 Azure SDK 与资源管理器进行交互。
Azure 中有两种类型的操作:控制平面操作和数据平面操作。 控制平面操作用于管理您订阅中的资源。 通过数据平面操作来访问资源所公开的功能。 例如,使用控制平面操作创建虚拟机,但使用数据平面操作通过远程桌面协议 (RDP) 连接到虚拟机。
将现有资源导出到 JSON 模板
无论如何创建 Azure 资源,Resource Manager 都会以 JSON 格式提供有关每个资源的信息。 请求资源 JSON 表示形式的副本时,要 导出 资源。 导出的 JSON 文件可以反编译为 Bicep。
资源管理器提供了多种将 Azure 资源导出到模板的方法。 可以使用 Azure 门户、Azure CLI 和 Azure PowerShell cmdlet 导出单个资源、多个资源和整个资源组。
导出过程是控制平面作,这意味着它仅导出 Azure 资源的配置。 例如,导出虚拟机时,不会导出虚拟机硬盘上的数据。 导出存储帐户时,导出过程中不包括存储帐户的 Blob 和其他内容。
在导出现有资源时,您需要考虑以下几点:
- 导出的资源定义是该资源的当前状态的快照。 它包括自资源初始部署以来对资源所做的所有更改。
- 导出的模板可能包含通常从 Bicep 定义中省略的一些默认资源属性。 例如,导出过程可能会添加 Azure 自动设置的只读属性。 包含这些属性并不有意义,因为它们是只读的。 在迁移到 Bicep 时,请考虑从资源定义中删除这些属性,使 Bicep 文件不受不必要的代码造成混淆。
- 导出的模板可能不包含使模板可重用所需的所有参数。 导出模板时,许多属性将硬编码到模板中。 你将在此模块的后面部分了解如何添加参数。
- 某些资源无法使用此方法导出,需要在 Bicep 文件中手动定义它们。 你将了解如何在本单元稍后重新创建这些资源。
将部署保存到 JSON 模板
如果已从 Azure 门户手动部署资源,则可能已注意到在“查看 + 创建”选项卡上下载用于自动化的模板的选项。此选项保存一个 JSON ARM 模板,该模板基于在门户中创建资源时设置的名称和属性。
资源管理器还会跟踪资源部署。 部署操作包括 Azure 门户资源创建体验中提交的更改以及任何 ARM 模板部署。 对使用 Azure 门户、Azure PowerShell cmdlet、Azure CLI 或其他工具进行的现有资源的更改通常不会创建部署。
如果部署是使用兼容工具创建的,则可以从资源组的部署历史记录访问部署模板。 可以使用 Azure 门户、Azure CLI 或 Azure PowerShell 来保存部署。
使用此方法保存模板时,需要考虑一些事项:
- 保存的模板显示部署时资源的状态。 它不包括部署后所做的任何更改。
- 如果部署包含多个资源,则无法选择要包含和排除的特定资源。 此操作将下载初始部署中所有资源的定义。 但是,在迁移到进程的迁移阶段时,可以手动忽略不需要的资源。
- 该模板仅包含部署所需的资源属性。
- 该模板可能包含可用于在多个环境中重新部署模板的参数。 但是,需要确认这些参数是否适合你的需求。
- 该模板可能不包含多余的属性,但仍应检查该模板是否包含预期的所有内容,并删除任何不需要的属性。
注释
无论是通过导出现有资源还是通过保存部署来导出资源,都应将导出的文件视为起点,而不是直接使用。 而是将其作为创建最终模板的起点。
将现有资源插入到 Bicep 中
Visual Studio Code 的 Bicep 扩展包括 “插入资源 ”命令,该命令捕获 Azure 资源的 Bicep 表示形式。 此命令从 Azure 读取资源的 JSON 定义,删除识别为只读的属性,并将 JSON 反编译为 Bicep。 与导出函数一样,生成的 Bicep 代码可用作最终 Bicep 文件的起点。
可以通过打开 Visual Studio Code 命令面板来插入资源。 在 Windows 和 Linux 上使用 Ctrl+Shift+P,在 macOS 上使用 ⌘+Shift+P。
将源 JSON ARM 模板进行反编译
将 Azure 资源迁移到 Bicep 的第二步是将 JSON ARM 模板和 Azure 资源转换为 Bicep 模板。 Bicep 工具包括用于转换模板的 decompile
命令。 可以从 Azure CLI 或 Bicep CLI 调用 decompile
命令。
反编译过程不能保证从 JSON 到 Bicep 的完整映射。 在使用文件部署资源之前,你可能需要修改生成的 Bicep 文件以满足模板最佳做法。 将其视为迁移的起点。 在本模块的后面部分,你将了解如何解决在反编译过程中遇到的任何问题。
反编译模板后,已完成转换阶段。 现在,你有一个有效的 Bicep 文件可以作为起点。
迁移阶段
将资源迁移到 Bicep 的 迁移 阶段的目标是创建可部署 Bicep 文件的第一个草稿,并确保它定义迁移范围内的所有 Azure 资源。
迁移阶段包括三个步骤,按顺序完成这些步骤:
- 创建新的空白 Bicep 文件。
- 从反编译的模板中复制每个资源。
- 识别并重新创建任何缺失的资源。
创建新的 Bicep 文件
最好是创建新的 Bicep 文件。 在转换阶段中创建的文件是一个参考点,供你查看,但不应将其视为最终文件或部署它 as-is。
将资源复制到新的 Bicep 文件
将已转换的 Bicep 文件中的每个资源逐个复制到新的 Bicep 文件。 此过程可帮助你根据每个资源解决任何问题,并避免在模板变大时出现任何混淆。
重新创建不受支持的资源
并非所有 Azure 资源类型都可以通过 Azure 门户、Azure CLI 或 Azure PowerShell 导出。 例如,虚拟机扩展(如 DependencyAgentWindows
和 MMAExtension
(Microsoft Monitoring Agent)是无法导出的资源类型。
尝试使用 Azure 门户、Azure CLI 或 Azure PowerShell 导出资源时,将包含不受支持的资源类型,则会生成详细的错误消息。 需要在新的 Bicep 文件中重新创建未导出的任何资源,例如虚拟机扩展。 可以选择多种工具和方法来重新创建资源,包括 Azure 资源资源管理器、ARM 模板参考和 Azure 快速入门模板。
Azure 资源浏览器
Azure 资源资源管理器是嵌入在 Azure 门户中的工具。 门户不显示某些资源类型,但资源资源管理器提供资源的 JSON 表示形式。 若要访问资源资源管理器,请在搜索框中搜索它:
结果窗格显示订阅的已注册资源提供程序列表,以及你有权查看的所有资源、资源组和订阅的详细信息。 若要查看资源的 JSON 表示形式,请选择窗格左侧的层次结构:
通过选择资源,可以查看 JSON 表示形式,如以下示例所示:
{
"name": "DependencyAgentWindows",
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/rg-app-prod-truckline/providers/Microsoft.Compute/virtualMachines/vm-prod-001/extensions/DependencyAgentWindows",
"type": "Microsoft.Compute/virtualMachines/extensions",
"location": "eastus",
"properties": {
"autoUpgradeMinorVersion": true,
"provisioningState": "Succeeded",
"publisher": "Microsoft.Azure.Monitoring.DependencyAgent",
"type": "DependencyAgentWindows",
"typeHandlerVersion": "9.10"
}
}
可以使用 JSON 表示形式定义 Bicep 资源:
resource dependencyAgentWindows 'Microsoft.Compute/virtualMachines/extensions@2022-08-01' = {
parent: virtualMachine
name: 'DependencyAgentWindows'
location: 'eastus'
properties: {
autoUpgradeMinorVersion: true
publisher: 'Microsoft.Azure.Monitoring.DependencyAgent'
type: 'DependencyAgentWindows'
typeHandlerVersion: '9.10'
}
}
注释
JSON 表示形式包括一个名为 provisioningState
的属性。 该 provisioningState
属性是只读的,它由 Azure 自动设置,因此它不包括在 Bicep 资源定义中。
小窍门
Visual Studio Code 的 Bicep 扩展有助于在 Bicep 中定义 Azure 资源。 例如,资源的 Bicep 表示形式包括 API 版本,但导出的 JSON 版本没有。 在 Visual Studio Code 中,当你开始输入资源类型时,系统会自动建议 API 版本。
ARM 模板参考
ARM 模板参考是有关 Azure 资源的 ARM 模板结构、资源类型、API 版本和属性定义的信息来源。 本文档提供 Bicep 和 JSON 格式的示例。
可以选择特定的资源提供程序和资源类型,例如 Microsoft.Web/serverfarms
及其 API 版本。 可以查看哪些资源属性是必需的以及哪些资源属性是可选的。 您还可以查看帮助您了解属性功能的属性说明。
Azure 快速入门模板
Azure 快速入门模板存储库是社区参与的模板的集合。 此可搜索模板存储库提供了许多 Azure 资源和解决方案的示例。 在一些快速入门中,JSON ARM 模板和 Bicep ARM 模板都可供查看。 可以使用这些模板作为参考点来帮助生成和验证模板以供部署。
假设你想要找到一个模板来生成 Azure 应用服务计划和应用。 每个快速入门模板都提供将模板直接部署到 Azure 或查看 GitHub 上的模板的选项。
请记住,Azure 快速入门模板是社区贡献。 某些示例可能已过时,因为功能会定期添加到 Azure 服务。 这些示例还可能包括在使用模板时不需要的资源和属性。 但是,快速入门模板的存储库是一种有用的资源,可帮助你了解如何使用 ARM 模板部署资源。