AWS CloudFormation、SAM、CDK与Terraform的区别和关联是什么
你的整体理解方向基本正确,有几个细节偏差修正后就能把四个工具的关系理得很清楚:
四类基础设施即代码工具的定位与关联
各工具核心本质
- CloudFormation(CFn):你的描述完全准确,它是AWS提供的托管式基础设施编排服务,本身不是客户端工具。你向它提交JSON/YAML格式的资源定义模板,它就会自动处理资源依赖顺序、执行创建/更新/删除操作、跟踪资源状态、在变更出错时自动回滚,所有资源的生命周期状态都托管在AWS侧。
- SAM(Serverless Application Model):你对它的定位只说对了一半。它不是单纯调用CFn的CLI工具,而是由两部分组成:一是CFn的扩展语法规范,专门针对Serverless场景做了大量简写——比如用
AWS::Serverless::Function一个资源类型,就能替代原生CFn里需要手动配置的Lambda函数、执行角色、日志组、基础权限这一整套关联资源;二是配套的CLI工具,额外提供了Lambda本地调试、代码打包、版本发布等Serverless开发常用能力。SAM在部署时会先把扩展语法编译成原生CFn模板,最终所有资源变更还是交给CFn执行,完全绑定AWS生态,是Serverless场景的特化工具,不是通用IaC方案。 - CDK(Cloud Development Kit):你的推测有小偏差,它是直接构建在CFn之上的可编程IaC工具,并非基于SAM构建。你可以用TypeScript、Python、Go、Java等通用编程语言编写基础设施定义,支持用循环、条件判断、自定义抽象等代码能力封装复用逻辑,解决YAML/JSON模板写复杂逻辑冗余、难复用的问题。CDK执行
synth命令时会把代码编译成原生CFn模板,最终也是提交给CFn完成资源落地。CDK本身内置了对SAM语法的支持,可以直接在代码里用SAM的简写资源定义,不需要依赖SAM CLI就能完成部署。 - Terraform:你的理解基本准确,它是HashiCorp推出的厂商中立开源IaC工具,和AWS原生CFn体系是平行关系,部署资源时不会经过CFn,而是通过对应服务的Provider插件直接调用云服务API,资源状态由Terraform自行维护(默认存在本地,也可配置远端存储)。除了AWS之外,它还支持其他公有云、私有云、甚至各类第三方SaaS服务的资源编排,跨云统一管理的适配性更强。
核心链路与差异总结
- AWS原生工具链的执行链路完全统一:
CDK/SAM 编译生成原生CFn模板 -> 提交给CloudFormation服务执行资源变更,这三类工具的最终资源落地动作都由CFn完成,天然和AWS的IAM权限、CloudTrail审计等原生能力打通。 - Terraform是独立于AWS原生体系的第三方方案,资源变更全流程由Terraform自身控制,优势是跨云、跨服务的统一编排能力,劣势是对AWS新发布的服务/特性的适配速度通常会慢于CFn系工具。
- 几个容易混淆的边界:
- SAM是Serverless场景的特化扩展,不是通用IaC工具,用来定义非Serverless资源时和直接写原生CFn没有任何体验优势
- CDK是覆盖全品类AWS资源的通用可编程IaC工具,不是只能用于Serverless场景,运行时不依赖SAM
- CloudFormation本身是AWS的公开服务,除了CDK、SAM之外,你也可以直接通过控制台、AWS CLI、SDK提交模板调用它,不是必须绑定特定客户端工具
内容的提问来源于stack exchange,提问作者Ning
相关产品推荐
相关产品推荐

