使用 AWS CDK 通过编程语言实现 IaC - Construct 与 Stack 的设计
介绍通过 CDK 使用 TypeScript/Python 定义基础设施、L1/L2/L3 Construct 的选择以及测试方法。
CDK 概述
CDK 是支持 TypeScript、Python、Java、C#、Go 五种语言定义 AWS 基础设施的 IaC 框架。代替手写 CloudFormation 的 YAML/JSON 模板,使用编程语言的类和方法定义资源。CDK 自动生成 CloudFormation 模板并执行部署。
Construct 与测试
L1 Construct 是 CloudFormation 资源的一对一映射,需显式指定所有属性。L2 Construct 应用了最佳实践的默认值,例如 S3 存储桶默认启用加密和版本控制。L3 Construct(Pattern)是组合多个资源的高级抽象,LambdaRestApi 可一次性构建 API Gateway 和 Lambda。使用 Assertions 模块的 hasResourceProperties 测试生成的模板中包含预期的资源和属性。
CDK Pipelines 的自变异
CDK Pipelines 用 CDK 定义流水线本身,实现流水线配置变更也通过流水线部署的「自变异」模式。以 CodePipeline 为后端,自动配置源获取 → cdk synth → 自更新 → 部署各阶段。在多账户多区域部署中,可通过 Wave 和 Stage 概念声明式地描述并行部署和顺序控制。例如,先部署开发环境,经手动审批后部署生产环境的流程可用数十行代码定义。将 cdk diff 集成到 Pull Request 检查中,可在审查时可视化基础设施变更的影响范围,提前检测意外的资源删除或替换。 如需拓展开发工具知识,可参考Amazon 的专业书籍。
Aspects 与自定义规则的治理
CDK 的 Aspects 功能是遍历 Stack 内所有 Construct 进行横向验证或强制应用属性的机制。例如,可创建强制所有 S3 存储桶加密的 Aspect,或为所有 Lambda 函数添加标签的 Aspect。cdk-nag 库以 Aspects 形式提供 AWS 最佳实践和 NIST、HIPAA 等合规规则,在 cdk synth 时检测违规。也可创建自定义 Aspect 强制组织特有的规则(命名规范、禁止特定区域、禁止公共访问等)。由此实现在代码编写时即防止策略违规,而非通过 CloudFormation Guard 或 Config Rules 的事后检测。
CDK 的费用
CDK 本身不产生额外费用。CDK 是生成 CloudFormation 模板的工具,成本仅为部署的 AWS 资源使用费。使用 CDK Pipelines 构建 CI/CD 流水线时,会产生 CodePipeline 和 CodeBuild 的费用。cdk synth 生成的模板的 S3 存储(CDK 引导存储桶)也有少量存储费用,但实际上可忽略不计。与手写 CloudFormation YAML 相比,引入 CDK 的额外成本为零。
总结
CDK 通过编程语言定义基础设施,利用 L2/L3 Construct 的抽象化减少样板代码,通过 Assertions 模块实现基础设施的单元测试。CDK Pipelines 实现自变异的 CI/CD,Aspects 在代码编写时强制治理规则。适合希望将基础设施管理纳入软件工程实践的团队。