引言
本文将详细介绍阿里云资源编排服务(Resource Orchestration Service 简称 ROS) 提供的 Terraform 托管服务,并对比 ROS 与 Terraform 的原生能力,帮助用户根据自身需求选择合适的 IaC 工具。
名词解释
- ROS:是阿里云一方的 IaC 工具,基于 IaC 理念的自动化部署服务。ROS 提供了 Terraform 托管服务,用户可以直接在 ROS 控制台使用 Terraform 模板进行部署。
- Terraform:由 HashiCorp 开发的基础设施即代码( IaC)工具,支持多云环境,可以管理阿里云、AWS、Azure 等多个云提供商的资源。
ROS 与 Terraform 原生能力的详细对比,请见附录。
ROS 对 Terraform 的支持
ROS 提供了 Terraform 托管服务,因此用户可以直接在 ROS 中使用 Terraform 模板进行部署。
通过 ROS 使用 Terraform 相较直接使用 Terraform CLI,增加了很多额外的能力,让用户拥有更好的体验,具体有以下几点:
- 和 ROS 模板一致的控制台体验:
- 统一界面:ROS 控制台提供了一致的用户体验,与 ROS 模板的管理方式相同,使用户能够在一个集中化的平台上管理所有资源。下图中展示了在 ROS 控制台和本地 Terraform CLI 中部署同一个 Terraform 模板的对比图:
- 可视化操作:ROS 提供了一种直观的拖拽方式,让用户能够轻松构建云上应用架构。目前,ROS 支持通过可视化界面生成对应的 ROS 模板进行资源的部署,这种方式有效降低了用户学习和使用 IaC 工具的门槛。近期,ROS 可视化编辑器将进一步增强,新增根据用户设计的架构图自动生成对应的 Terraform 模板的能力,为用户提供多种资源部署管理的方式。
- 支持参数/属性的动态查询和选择
- 支持动态查询参数(被资源属性引用)可选值
- 支持同参数被多属性引用的综合查询
- 支持可视化界面参数和属性的动态选择
ROS 可以在模板参数配置中指定 AssociationProperty 以获取所选地域下对应的资源,指定 AssociationPropertyMetadata 对不同参数添加筛选条件,以便在控制台动态选择参数配置。
- 根据模板询价:在部署前,ROS 可以根据您的 Terraform 模板自动计算并显示预计的成本,帮助您更好地进行预算规划。支持询价的 Terraform 资源可参考文档:Terraform 支持的功能和资源。
- 产品开通和角色检查:
- 自动检查:ROS 会自动检查 Terraform 模板中涉及的产品是否已开通,所需的角色和权限是否存在,确保部署前的准备工作完善。
- 提示引导:如果发现未开通的产品或缺失的角色,ROS 会提供明确的提示和引导,帮助用户快速完成必要的配置。
- 风险检查:比如在删除资源(如安全组)时,ROS 会自动检查可能带来的风险,帮助您避免潜在的问题。
- 支持模板版本管理和共享
- 标签和资源组传递:可将标签、资源组一次性传递给模板中所有资源。支持标签传递的 Terraform 资源可参考文档:Terraform 支持的功能和资源。
Terraform 托管服务的限制
相比于本地 Terraform CLI,ROS 提供的 Terraform 功能由于安全原因设定了一些限制,主要限制如下:
- 只允许特定可信的Provider:只允许使用云厂商官方的provider,如alicloud、AWS、Azure等
- 对可能造成危害的函数方法做了强限制:例如能够执行任意命令或访问敏感数据的一些功能函数,如Provisioner功能
- 文件读取路径校验:只能允许用户读取自己传入的文件路径,这样做可以防止恶意用户读取系统中的敏感文件或目录,从而保护系统的安全性和隐私
在 2023 年 8 月 10 日,HashiCorp 将 Terraform 的许可证从 MPL 切换为商业源代码许可证 (v1.1)(BSL)。BSL的目标是限制商业化使用,可以复制修改,但是不允许商业用途,导致集成了Terraform的产品会受到影响。
为了保持 Terraform 的开源,Gruntwork、Spacelift 等人提出了 OpenTofu 计划,创建了一个名为 OpenTofu 的 Terraform 分支,来实现真正意义上的开源 Terraform。
目前 ROS 提供的 Terraform 托管服务版本为 Terraform v1.5.7(MPL 2.0许可下的最后一个官方版本)。
近期 ROS 会逐步升级到 OpenTofu 的最新版本 v1.8,以支持 Terraform 最新的功能和特性。
IaC 选型建议
针对不同的云资源部署场景,选择合适的部署方式才能达到事半功倍的效果。
以下场景推荐用户选择 ROS 提供的 Terraform 托管服务:
- Terraform 入门体验:可视化的界面能够让小白更快体验的 IaC 工具的乐趣,界面化的直观操作可以显著降低学习曲线。
- 对部署成功率要求较高的场景:Terraform 部署时需要动态地进行参数查询和选择,确保部署不会因为库存、资源属性不正确等问题失败。
- 需要对成本预估和预算规划:在部署前,ROS 可以根据 Terraform 模板自动计算并显示预计的成本,帮助用户更好地进行预算规划。
- 成熟的 Terraform 方案:一些经过验证的 Terraform 模版可以沉淀为 ROS 的一键部署方案,使得用户能够快速体验和应用这些方案。
ROS 的Terraform 托管服务提供了对阿里云的原生支持,省去了用户下载、安装、配置 Terraform 的繁琐步骤,具有完善的模版管理系统,为用户提供了更加安全、成熟、高效的资源管理方式,是企业实现基础设施自动化管理的理想选择。
以下场景推荐用户直接使用本地 Terraform CLI:
- Terraform 深入学习:本地 Terraform CLI 能够让用户更快掌握 Terraform 知识,通过本地快速调试加速学习过程。
- 多云环境管理:如果需要管理多个云提供商(如 AWS、Azure、Google Cloud 和阿里云)的资源,本地 Terraform CLI 是更好的选择。
- 高级定制和特殊功能需要:如果需要用到 Provisioner功能、Backend功能时,需要使用本地 Terraform CLI。
参考文献
附录
ROS 与 Terraform 的横向对比
注1:白底为核心能力,灰底为增强能力
注2:数据截止至 2024.10.31
图例: ✅ 支持 ☑️ 部分支持 ❌ 不支持 |
ROS |
Terraform |
资源覆盖度 |
|
|
产品开通 |
✅ |
✅ |
产品开通&角色检查 |
✅ 自动检查产品开通状态及角色权限 |
❌ |
生命周期管理 |
|
|
界面 |
✅ |
✅
|
询价 |
✅ |
Terraform Cloud提供费用估算能力,支持AWS、Azure、GCP,但不支持阿里云 |
可视化参数/属性动态查询和选择 |
✅
|
☑️ 支持 data source 动态查询参数 但不支持可视化参数的选择 |
预校验 |
✅
|
✅
|
语法能力 |
中 |
强 相比ROS提供多的语法能力,比如: |
模板/架构RAM策略查询 |
✅
|
❌ |
风险检查 |
✅ 支持检查删除资源(如安全组)时可能造成风险 |
❌ |
可视化架构 |
✅ 支持根据模板生成架构图,也支持拖拽架构图生成模板 但不支持对 Terraform 模板的可视化 |
✅
|
资源导入 |
✅ ROS资源栈:通过资源场景、资源导入纳管现有资源至资源栈,支持核心云产品 Terraform资源栈:通过资源导入纳管现有资源至资源栈,支持度与Terraform一致。 |
✅ 通过 terraform import导入 |
资源导出 (资源生成模板/架构) |
✅ 通过资源场景生成ROS模板 |
✅ GCP支持导出 TF 模板 |
模板/架构管理 |
✅ 模板版本管理 模板共享 |
☑️ 原生没有版本管理,可结合 git 进行管理 |
更改预览 |
✅ |
✅ terraform apply |
偏差检查、纠正 |
✅ |
❌
|
标签、资源组传递 |
✅ 可将标签、资源组一次性传递给模板中所有资源 |
❌ |
资源复制、迁移 |
✅ 通过资源场景复制、迁移一组资源 |
❌ |
动态多资源 |
✅ 指定 Count 创建多个相似资源 |
✅ 指定 count、for_each 创建多个相似资源 |
模块化 |
✅ |
✅ 支持模块 |
跨地域、跨账号一致性部署 |
✅ 资源栈组功能允许使用同一个模板跨账号、跨地域部署 |
✅ 需模板里显式声明地域、角色,并结合 Count 实现 |
监控大盘 |
❌ |
❌ |
自定义资源 |
✅ 允许基于FC、MNS、HTTP实现自定义资源 |
✅ 自行实现 provider |
第三方公共资源 |
❌ |
✅ |
云原生鉴权 |
✅ |
✅ |
多云支持 |
✅ 一般通过 Terraform 模板实现,也可通过自定义资源从 0 实现 |
✅ |
测试套件 |
✅ |
✅ 开源工具 terratest |
资源合规预检 |
✅ 控制台集成配置审计 |
开源工具 terraform-compliance |
安全性 |
使用临时AK或STS Token编排,有时效性,用户不感知。 |
用户主要通过环境变量中的 AK 配置身份认证,设置的AK大多数是永久性的明文AK,安全风险较高。 |
GuestOS 命令执行 |
✅ |
✅ |
GuestOS notify |
✅ ros-notify 机制能够实现 GuestOS 任务完成后通知 ROS |
❌ |