使用 AWS CDK 通过编程语言实现 IaC - Construct 与 Stack 的设计
介绍通过 CDK 使用 TypeScript/Python 定义基础设施、L1/L2/L3 Construct 的选择以及测试方法。
CDK 概述
CDK 是使用 TypeScript、JavaScript、Python、Java、C#/.Net、Go 定义 AWS 基础设施的 IaC 框架。无需手写 CloudFormation 的 YAML/JSON 模板,而是使用编程语言的类和方法定义资源。CDK 自动生成 CloudFormation 模板并执行部署。
Construct 与测试
L1 Construct 与 CloudFormation 的资源一一对应,直接指定资源的属性。L2 Construct 设置了偏安全的默认值,可以用较少的代码定义资源。L3 Construct(Pattern)是组合多个资源的高级抽象,LambdaRestApi 一次性构建 API Gateway 和 Lambda。使用 Assertions 模块中的 hasResourceProperties,测试生成的模板中包含预期的资源和属性。
通过 CDK Pipelines 实现自变异
CDK Pipelines 采用“自变异”的形式,即用 CDK 定义管道本身,并通过管道部署管道配置的变更。以 CodePipeline 为后端,自动配置源代码获取 → cdk synth → 自我更新 → 部署的各个阶段。在多账户 / 多区域的部署中,可以通过 Wave 和 Stage 的概念以声明方式描述并行部署和顺序控制。例如,可以用代码定义先部署到开发环境、插入人工审批后再部署到生产环境的流程。将 cdk diff 纳入拉取请求的检查后,可以在审查时确认基础设施变更的范围,并发现意外的资源删除或替换。
通过 Aspects 和自定义规则实现治理
CDK 的 Aspects 功能是遍历堆栈内所有 Construct,进行横向验证和强制应用属性的机制。例如,可以创建对所有 S3 存储桶强制加密的 Aspect,或为所有 Lambda 函数添加标签的 Aspect。cdk-nag 库以 Aspects 的形式提供 AWS 最佳实践以及 NIST、HIPAA 等合规规则,并在 cdk synth 时检测违规。也可以创建自己的 Aspect,强制执行组织特有的规则(命名规范、禁止特定区域、禁止公开访问等)。除了使用 CloudFormation Guard 和 Config 规则进行检查之外,还可以在 cdk synth 的时间点发现策略违规。
CDK 的费用
CDK 本身不产生额外费用。CDK 是生成 CloudFormation 模板的工具,费用仅为所部署的 AWS 资源的使用费。使用 CDK Pipelines 构建 CI/CD 管道时,会产生 CodePipeline 和 CodeBuild 的费用。存放 cdk synth 所生成模板的 S3(CDK 引导存储桶)会产生存储费用。使用 CDK 时的费用为所部署的资源和引导存储桶的费用。
与 CloudFormation 的关系及选择
CDK 将用编程语言编写的代码最终转换为 CloudFormation 模板并进行部署。也就是说,部署的实体是 CloudFormation,CDK 的定位是让其更易于编写的一层。如果是简单、静态的配置,也可以选择直接编写 CloudFormation 模板。另一方面,如果重复和条件分支较多,并且希望整理为可复用的组件,可以利用编程语言表达能力的 CDK 就是候选之一。根据需求进行选择,例如以无服务器为主时使用专用框架,处理多个云时使用其他工具。
利用语言能力的抽象化
在 CDK 中,可以将熟悉的编程语言的功能用于基础设施的定义。重复的配置可以用循环生成,环境之间的差异可以用条件分支表达。将常用的配置整理为根据输入组装合适资源组的组件(Construct)后,就可以复用。将组织的标准配置做成组件并以软件包形式共享,团队就可以使用相同的设计。以代码进行抽象,可以减少重复,并将变更集中到一处。
部署与生命周期
CDK 具备从开发到运维的支持机制。开始使用之前,进行准备部署所需资源的初始设置。部署变更之前,可以确认与当前配置的差异,在了解会发生什么变化之后再应用。可以按环境区分设置,从同一份代码向开发 / 生产部署不同的配置。确认手动创建的资源是否偏离了代码中的定义,并通过代码进行变更,就更容易防止配置偏差。借助这些机制,可以从同一份代码反复部署相同的配置。
总结
CDK 是利用编程语言的表达能力定义 AWS 基础设施的 IaC 框架。可以通过 L1 至 L3 的 Construct 层级选择抽象程度,使用 CDK Pipelines 构建自变异型 CI/CD,并通过 Aspects 在代码层面强制执行治理规则。能够用编程语言编写条件分支和循环是 CDK 的特点。
参考资料(AWS 官方)
本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。
如本页内容与官方文档不一致,请以官方文档为准。