AWS CloudFormation と CDK
在 AWS 云平台中,AWS CDK(Cloud Development Kit) 与 AWS CloudFormation 有着紧密的联系。它们的关系大致可以概括为:CDK 最终会将你的代码转换成 CloudFormation 模板,然后由 CloudFormation 去创建和管理相应的资源。以下从几个角度进行解释。
1. CDK 与 CloudFormation 的核心区别
-
CloudFormation
- 以 模板(Template) 形式(JSON 或 YAML)来定义并部署 AWS 资源。
- 模板通过 CloudFormation 服务进行解析和执行,最终创建或更新资源栈(Stack)。
- 使用方式较为“声明式”:在模板中描述需要哪些 AWS 资源、如何配置。
-
AWS CDK
- 使用 TypeScript、Python、Java、.NET、Go 等常见编程语言来编写基础设施代码。
- 通过 CDK CLI(命令行)将这些“代码”编译(或称“合成”)成 CloudFormation 模板(JSON/YAML)。
- 也可以直接通过 CDK CLI 将合成后的模板部署到 AWS CloudFormation,由其完成真正的资源创建或更新。
- 使用方式更具“过程式”或“面向对象”风格:可以复用组件、逻辑判断和语言特性,简化大规模基础设施的定义。
2. CDK 命令与 CloudFormation 的关联
CDK CLI 提供了一系列常见的命令来帮助你完成从开发、测试到部署的完整流程。最核心的几个命令和它们对应的 CloudFormation 行为如下:
-
cdk synth
- 将你用 TypeScript/Python/Java 等语言编写的 CDK 代码,合成为 CloudFormation 模板。
- 结果会在本地生成一个或多个
.template.json
文件。 - 单纯生成模板,不会直接与 CloudFormation 交互,不会对实际的 AWS 资源进行操作。
-
cdk diff
- 对比本地合成出的新模板,与当前已部署到 AWS 中的 CloudFormation Stack 之间的差异。
- 方便在 cdk deploy 前了解将会做哪些变更,例如添加新资源、删除资源、修改已有资源配置等。
- 本质上还是在比较 本地新模板 与 云端当前模板 的差异。
-
cdk deploy
- 将合成出的 CloudFormation 模板 上传到 CloudFormation,并由 CloudFormation 根据模板来创建或更新相应的资源。
- 在部署前,CDK CLI 通常会提示你检查变更(与
cdk diff
结果类似)并让你确认。 - 部署成功后,对应的 Stack 及相应的资源在 AWS 中便会被创建或更新。
- 若遇到资源冲突、不兼容更新,CloudFormation 会进行回滚或给出错误提示。
-
cdk destroy
- 命令会调用 CloudFormation 删除 对应的 Stack,进而清理所有相关的 AWS 资源。
- 需要特别谨慎使用,因为这可能会删除生产环境中正在使用的资源。
-
cdk bootstrap
- 用于在指定账户和区域中创建一个所谓的 “Bootstrapping Stack”,其中会包含 CDK 在后续部署时所需的各种支持性资源(如 S3 存储文件、IAM 角色等)。
- 只需在第一次使用某个 AWS 账号或区域时执行一次。后面再用同一账号或区域时,就不必重复执行。
3. 具体工作原理
-
编写代码(CDK App)
- 在本地使用你熟悉的编程语言(如 TypeScript、Python、Java 等)来定义一个或多个 Stack。
- 在代码中直接引用构造(Construct),例如
new s3.Bucket(...)
,new lambda.Function(...)
,new ec2.Vpc(...)
等。 - 通过编程语言的逻辑,可以更好地组织和复用基础设施配置。
-
CDK CLI 合成(Synth)
- 当运行
cdk synth
,CDK CLI 会将这些代码编译并转换成一个标准的 CloudFormation 模板(JSON/YAML)。 - 可以在本地查看生成的模板内容。
- 当运行
-
CDK CLI 部署(Deploy)
- 当运行
cdk deploy
,CDK CLI 首先会执行cdk synth
的过程获得模板,然后将模板提交给 CloudFormation。 - CloudFormation 根据模板中的资源配置去创建或更新 AWS 资源栈(Stack)。
- 如果出现问题,比如 IAM 权限不足、资源冲突、某些不兼容变更等,会出现报错或回滚。
- 当运行
-
CloudFormation 实际执行
- 本质上,最终是 CloudFormation 服务在后端将模板中描述的资源(EC2、S3、IAM、Lambda、API Gateway 等)进行创建、更新或删除。
- 整个过程由 CloudFormation 提供的 Stack 概念统一跟踪和管理。
4. 何时直接用 CloudFormation,何时用 CDK?
-
直接使用 CloudFormation 模板
- 适合对声明式模板比较熟悉,且所需部署的资源类型或数量并不复杂的场景。
- 更贴近原生 AWS 配置,只要能写 JSON/YAML 文件并掌握语法即可。
-
使用 CDK
- 当基础设施规模变大,或者需要灵活的编程逻辑(如条件、循环、函数式配置)时,CDK 能带来更好的开发体验和可维护性。
- 可以利用 IDE 提示、代码复用、面向对象等特性来减少模板的冗余、降低出错风险。
- 仍可随时查看合成后的 CloudFormation 模板,以便排查问题或与原有流程结合。
5. 总结
- CDK 是一个更高层次的开发框架,让你通过写代码(面向对象或过程式),在本地就能管理和组织复杂的云资源定义。
- CloudFormation 是底层“执行引擎”,当 CDK 代码被合成为模板并部署时,依赖的正是 CloudFormation 去完成基础设施的实际创建和更新。
- CDK 命令行(
cdk synth
,cdk diff
,cdk deploy
,cdk destroy
等) 的操作对象最终都是 CloudFormation,它通过将生成的模板推送到 CloudFormation 并触发创建或更新 Stack 来完成部署。
因此,可以把 CDK 理解成一层编程语言对声明式模板的“包装”,而 CloudFormation 则是负责在 AWS 上真正落地资源的 服务后台。在实际项目中,CDK 简化了使用 CloudFormation 部署资源的过程,并带来了更灵活、更可维护的基础设施编程方式。