跳到主要内容
翻译页面

本页面由 AI 辅助从英文翻译而来。如两者存在差异,以英文版本为准。

StackQL vs Terraform

Terraform 是声明式预配工具:你编写描述期望状态的 HCL,Terraform 规划并应用更改,使现实向期望状态收敛,并在状态文件中跟踪它所管理的内容。StackQL 是面向云 API 的 SQL 查询和变更引擎:它直接读写实时的 Provider 状态,不保留状态文件。这两种工具回答的首要问题不同:Terraform 回答“如何声明这个环境并使其收敛?”,StackQL 回答“现在存在什么,以及如何更改它?”

何时使用哪一个​

在以下情况下使用 Terraform:

  • 你要预配的环境具有很深的依赖图(VPC、子网、网关、实例),其中 plan 阶段的排序很重要。
  • 你希望基础设施更改经由针对 HCL diff 的代码评审进行。
  • 你依赖 Terraform 模块生态以及围绕它建立的现有组织工作流。

在以下情况下使用 StackQL:

  • 你需要向实时基础设施提出问题:资源清单、审计、安全态势、成本输入,并且需要过滤、聚合和连接,包括跨 Provider 的连接。
  • 你需要独立于任何工具所记录的状态来检测漂移。
  • AI 智能体或自动化流水线需要一个自描述、可在运行时发现的控制平面接口,而不是编译式的 plan/apply 工作流。
  • 你希望预配时没有状态文件的运维开销(锁定、后端、状态手术),并接受以更简单的依赖模型作为交换。

当平台团队使用 Terraform 进行预配,并使用 StackQL 进行审计、核对和报告时,两者一起使用。这是实践中最常见的模式。

架构对比​

维度TerraformStackQL
主要操作plan/apply 收敛查询和变更
事实来源状态文件 + refresh实时 Provider API
语言HCLSQL
查询能力极少(数据源)完整的 SELECT,支持 WHERE、GROUP BY、JOIN,包括跨 Provider
变更模型由 diff 驱动的 apply直接执行 INSERT / UPDATE / DELETE / EXEC
依赖规划基于图,在 plan 阶段按查询顺序;通过 stackql-deploy 进行堆栈编排
漂移处理在 refresh/plan 时针对受管资源检测任何实时查询都是当前状态;可与任何基线比较
Provider 模型编译的 Go 插件来自开放注册表的、基于 OpenAPI 的声明式规范
智能体可访问性CLI 和 HCL,为人设计自描述的 SQL 接口面加内置 MCP 服务器
状态文件必需无

其中两项差异最为关键。第一,Provider 模型:Terraform 的 Provider 是编译后的程序,因此覆盖范围取决于插件开发;StackQL 的 Provider 是数据(扩展的 OpenAPI 规范),因此任何有文档记载的 API 操作,无论属于控制平面还是数据平面,都可以被映射。第二,事实来源:Terraform 的状态文件只描述 Terraform 管理的资源,而 StackQL 能看到凭据可见的一切,无论是否受管。未受管的资源恰恰是审计和事件响应需要找到的资源。

示例​

这是 Terraform 无法提出、而 StackQL 正是为之构建的那类问题,即一份实时的分区域资源清单:

SELECT region, COUNT(*) as num_functions
FROM aws.lambda.functions
WHERE region IN ('us-east-1','us-west-2','eu-west-1','ap-southeast-2')
GROUP BY region;

StackQL 将其作为并行的分区域 API 调用执行并聚合结果:没有需要刷新的状态,并且它统计账号中的每一个函数,而不仅仅是受 IaC 管理的函数。