AWS CDK

使用 TypeScript 或 Python 等编程语言定义 AWS 基础设施,并作为 CloudFormation 模板部署的 IaC 框架

概述

AWS Cloud Development Kit (CDK) 是一个开源的 Infrastructure as Code (IaC) 框架,允许使用熟悉的编程语言 (TypeScript、Python、Java、C#、Go) 定义 AWS 基础设施。CDK 编写的代码在内部被转换 (合成) 为 CloudFormation 模板,并通过 CloudFormation 进行部署。通过 L1 (CloudFormation 资源的一对一映射)、L2 (内置最佳实践的高级抽象)、L3 (组合多个资源的模式) 三层构造,只需几行代码即可构建生产级基础设施。

L1、L2、L3 构造的使用区分

CDK 的构造按抽象程度分为 3 个级别。L1 构造 (CfnXxx) 是 CloudFormation 资源的直接包装器,可以访问 CloudFormation 中所有可配置的属性。L2 构造是最常用的级别,例如创建 s3.Bucket 时,加密启用、公共访问阻止、版本控制设置等会默认应用。L3 构造 (模式) 如 LambdaRestApi 可以一次性构建多个资源 (Lambda + API Gateway + IAM 角色)。实务中推荐以 L2 为中心,仅在 L2 无法满足的细节设置上使用 L1 的逃生舱口进行补充。

用编程语言编写 IaC 的优势与注意事项

CDK 最大的特点是可以使用 TypeScript 或 Python 等通用编程语言定义基础设施。可以利用循环、条件分支、函数、类继承等语言特性,轻松实现复杂基础设施模式的复用和动态配置生成。与 Terraform 的声明式语言 (HCL) 相比,代码表达力压倒性地强,但编程语言的灵活性也可能导致意外的资源变更风险。养成使用 cdk diff 确认差异的习惯很重要。需要多云支持时 Terraform 更合适,但在 AWS 专用环境中 CDK 的生产力尤为突出。IaC 相关书籍 (Amazon) 可用于系统学习设计模式。

栈拆分与测试策略

CDK 实务导入时首先要决定的是栈的拆分策略。将所有资源塞入一个栈会导致部署时间变长,且一个变更可能影响所有资源。推荐按职责拆分栈,如网络 (VPC)、数据存储 (RDSDynamoDB)、计算 (LambdaECS),栈间依赖通过 SSM Parameter Store 或 CloudFormation 导出实现松耦合。在测试方面,可以使用 cdk-nag 进行安全与合规检查,使用 Assertions 模块进行快照测试和细粒度测试,在 CI/CD 管道中自动验证基础设施代码质量。通过测试 CloudFormation 模板的转换 (合成) 结果,可以在部署前检测意外变更,这是 CDK 独有的优势。

共有するXB!