AWS CloudFormation と CDK

在 AWS 云平台中,AWS CDK(Cloud Development Kit)AWS CloudFormation 有着紧密的联系。它们的关系大致可以概括为:CDK 最终会将你的代码转换成 CloudFormation 模板,然后由 CloudFormation 去创建和管理相应的资源。以下从几个角度进行解释。

1. CDK 与 CloudFormation 的核心区别

  1. CloudFormation

    • 模板(Template) 形式(JSON 或 YAML)来定义并部署 AWS 资源。
    • 模板通过 CloudFormation 服务进行解析和执行,最终创建或更新资源栈(Stack)。
    • 使用方式较为“声明式”:在模板中描述需要哪些 AWS 资源、如何配置。
  2. AWS CDK

    • 使用 TypeScript、Python、Java、.NET、Go 等常见编程语言来编写基础设施代码。
    • 通过 CDK CLI(命令行)将这些“代码”编译(或称“合成”)成 CloudFormation 模板(JSON/YAML)。
    • 也可以直接通过 CDK CLI 将合成后的模板部署到 AWS CloudFormation,由其完成真正的资源创建或更新。
    • 使用方式更具“过程式”或“面向对象”风格:可以复用组件、逻辑判断和语言特性,简化大规模基础设施的定义。

2. CDK 命令与 CloudFormation 的关联

CDK CLI 提供了一系列常见的命令来帮助你完成从开发、测试到部署的完整流程。最核心的几个命令和它们对应的 CloudFormation 行为如下:

  1. cdk synth

    • 将你用 TypeScript/Python/Java 等语言编写的 CDK 代码,合成为 CloudFormation 模板
    • 结果会在本地生成一个或多个 .template.json 文件。
    • 单纯生成模板,不会直接与 CloudFormation 交互,不会对实际的 AWS 资源进行操作。
  2. cdk diff

    • 对比本地合成出的新模板,与当前已部署到 AWS 中的 CloudFormation Stack 之间的差异。
    • 方便在 cdk deploy 前了解将会做哪些变更,例如添加新资源、删除资源、修改已有资源配置等。
    • 本质上还是在比较 本地新模板云端当前模板 的差异。
  3. cdk deploy

    • 将合成出的 CloudFormation 模板 上传到 CloudFormation,并由 CloudFormation 根据模板来创建或更新相应的资源。
    • 在部署前,CDK CLI 通常会提示你检查变更(与 cdk diff 结果类似)并让你确认。
    • 部署成功后,对应的 Stack 及相应的资源在 AWS 中便会被创建或更新。
    • 若遇到资源冲突、不兼容更新,CloudFormation 会进行回滚或给出错误提示。
  4. cdk destroy

    • 命令会调用 CloudFormation 删除 对应的 Stack,进而清理所有相关的 AWS 资源。
    • 需要特别谨慎使用,因为这可能会删除生产环境中正在使用的资源。
  5. cdk bootstrap

    • 用于在指定账户和区域中创建一个所谓的 “Bootstrapping Stack”,其中会包含 CDK 在后续部署时所需的各种支持性资源(如 S3 存储文件、IAM 角色等)。
    • 只需在第一次使用某个 AWS 账号或区域时执行一次。后面再用同一账号或区域时,就不必重复执行。

3. 具体工作原理

  1. 编写代码(CDK App)

    • 在本地使用你熟悉的编程语言(如 TypeScript、Python、Java 等)来定义一个或多个 Stack。
    • 在代码中直接引用构造(Construct),例如 new s3.Bucket(...)new lambda.Function(...)new ec2.Vpc(...) 等。
    • 通过编程语言的逻辑,可以更好地组织和复用基础设施配置。
  2. CDK CLI 合成(Synth)

    • 当运行 cdk synth,CDK CLI 会将这些代码编译并转换成一个标准的 CloudFormation 模板(JSON/YAML)。
    • 可以在本地查看生成的模板内容。
  3. CDK CLI 部署(Deploy)

    • 当运行 cdk deploy,CDK CLI 首先会执行 cdk synth 的过程获得模板,然后将模板提交给 CloudFormation。
    • CloudFormation 根据模板中的资源配置去创建或更新 AWS 资源栈(Stack)。
    • 如果出现问题,比如 IAM 权限不足、资源冲突、某些不兼容变更等,会出现报错或回滚。
  4. CloudFormation 实际执行

    • 本质上,最终是 CloudFormation 服务在后端将模板中描述的资源(EC2、S3、IAM、Lambda、API Gateway 等)进行创建、更新或删除。
    • 整个过程由 CloudFormation 提供的 Stack 概念统一跟踪和管理。

4. 何时直接用 CloudFormation,何时用 CDK?

  • 直接使用 CloudFormation 模板

    • 适合对声明式模板比较熟悉,且所需部署的资源类型或数量并不复杂的场景。
    • 更贴近原生 AWS 配置,只要能写 JSON/YAML 文件并掌握语法即可。
  • 使用 CDK

    • 当基础设施规模变大,或者需要灵活的编程逻辑(如条件、循环、函数式配置)时,CDK 能带来更好的开发体验和可维护性。
    • 可以利用 IDE 提示、代码复用、面向对象等特性来减少模板的冗余、降低出错风险。
    • 仍可随时查看合成后的 CloudFormation 模板,以便排查问题或与原有流程结合。

5. 总结

  1. CDK 是一个更高层次的开发框架,让你通过写代码(面向对象或过程式),在本地就能管理和组织复杂的云资源定义。
  2. CloudFormation 是底层“执行引擎”,当 CDK 代码被合成为模板并部署时,依赖的正是 CloudFormation 去完成基础设施的实际创建和更新。
  3. CDK 命令行cdk synth, cdk diff, cdk deploy, cdk destroy 等) 的操作对象最终都是 CloudFormation,它通过将生成的模板推送到 CloudFormation 并触发创建或更新 Stack 来完成部署。

因此,可以把 CDK 理解成一层编程语言对声明式模板的“包装”,而 CloudFormation 则是负责在 AWS 上真正落地资源的 服务后台。在实际项目中,CDK 简化了使用 CloudFormation 部署资源的过程,并带来了更灵活、更可维护的基础设施编程方式。