适用于 IaC 的 AWS CDK 与 SDK

AWS CDK VS SDK for IaC

我最近开始使用 AWS 和 IaC,我正在使用 Cloudformation 来配置我的 AWS 资源,但我发现 AWS 同时提供了一个 SDK 和一个 CDK,使您能够以编程方式而不是简单地配置资源 json/yaml.

但是根据文档,我并没有真正理解它们之间的区别,有人可以向我解释它们之间的区别以及您应该使用什么用例吗?

AWS SDK 是一个库,主要用于通过为您处理数据(反)序列化、凭证管理、故障处理等来简化对 AWS 服务的访问。也许,对于特定场景,您可以使用 AWS SDK作为代码工具的基础设施,但是它可能很麻烦,因为它不是库的预期用途。

基于https://docs.aws.amazon.com/whitepapers/latest/develop-deploy-dotnet-apps-on-aws/infrastructure-as-code.html,IaC的专用工具是AWS CloudFormation和AWS CDK。

AWS CDK 是 CloudFormation 之上的抽象。 CDK 脚本实际上在合成脚本时转换为 CloudFormation 定义。

可以用一个例子来最好地描述差异:想象一下,对于堆栈中的每个 lambda 函数,您想要创建一个错误 CloudWatch 警报并连接到 SNS 主题。

使用 CloudFormation,您将 a) 需要为每个 lambda 函数编写一组非常相似的 yaml/json 定义以确保监控,b) 使用嵌套堆栈模板,c) 使用 CloudFormation 模块。

使用 CDK,您可以编写通用代码构造 - class 或方法,它可以为给定的 lambda 函数创建警报并为给定的主题创建 SNS 警报操作。

换句话说,CDK 可以帮助您以一种非常熟悉的方式概括和重用您的 IaC 来开发您的业务代码。代码比 CF 定义更短、更易读。

当您需要在不同的 AWS 区域设置类似的资源并且每个环境具有不同的 AWS 账户时,差异会更加显着。您可以使用单个 CDK 代码库管理所有 AWS 账户和区域。

CDK: 是一个用于对您的基础设施或堆栈进行建模和配置的框架。 Stack 可以包含一个数据库,例如:DynamoDB、S3 Bucket、Lambda、API Gateway 等。它提供了一种编写代码以在 AWS 中创建基础设施的工具。也称为基础设施即代码。 Check here

SDK:这些是亚马逊提供的各种语言的代码库,如Java、Python、PHP、Javascript、Typescript 等。这些库有助于与您通过 CDK 或控制台创建的 AWS 服务(如在 DynamoDB 中创建数据)进行交互。 SDK 通过 API 简化了在您的应用程序中使用 AWS 服务的过程。 Check here

我发现对我来说不同之处在于 CDK 编码了 CloudFormation JSON/YAML。第一反应,代码很好,但是代码方面的好处是您可以针对代码编写单元测试。因此,您可以针对 CDK 中提供的服务建立安全感或保险政策。

还有其他方法可以测试 CF,但是,有开发背景,感觉更舒服。

首先介绍一些背景知识: CloudFormation 是亚马逊针对“基础设施即代码”方法的解决方案,用于管理跨 accounts/regions。这是通过使用他们的声明性 yaml/json-based 模板语言来定义它,然后通过各种方式(控制台、cli、APIs...)执行模板来完成的。更多信息:

还有其他流行的 IaC 解决方案或工具可以帮助更轻松地实现它,例如 Terraform and Kubernetes(也使用声明性模板定义所需状态的容器编排)。

IaC 的潜在好处:在高层次上,您可以更好地跟踪和审计您的基础设施,重用 definitions/processes,以更 一致 的方式进行所有更改,更快 感谢您的所有自动化和保证可以使用 infra-as-code 方法。您可能熟悉前面答案中提到的这些以及更多内容,例如:

  • 版本控制您的基础设施定义,
  • 更高效和逻辑复杂的模板构建方式,
  • 能够针对它们编写测试,
  • 在使用模板进行真正的基础设施更改之前进行比较(参见“更改集”),
  • 检测实时基础设施何时与您的定义不同,
  • 自动回滚,
  • 以及通过 CF 等框架提供的许多其他状态管理协助,在执行常规操作职责时可能需要这些协助。

CDK: 这是为了帮助 自动化 CloudFormation 作为 IaC 方法的一部分来配置和部署资源。它允许您使用各种流行的编程语言来帮助创建、测试和管理您的 CF 设置。 AWS 的一些动机:“YAML 是一种用于描述集群所需状态的出色格式,但它没有用于表达逻辑和可重用抽象的原语。”“AWS CDK 使用编程语言的熟悉性和表达能力来建模您的应用程序。”更多信息:https://docs.aws.amazon.com/cdk/v2/guide/home.html

然而,Amazon 知道其他解决方案,现在很高兴在 CDK 主页上指出它们,淡化了它与 CF 的原始联系。如果您不想,则不需要使用 CloudFormation;具体来说,他们提到您可以在以下帮助下使用相同的 CDK 结构:

  • cdktf 由其创建者 Hashicorp 维护的 Terraform
  • cdk8s for Kubernetes by AWS。回复:“我们意识到这与我们的客户在通过 CloudFormation 模板定义他们的应用程序时遇到的问题完全相同,这个问题由 AWS Cloud Development Kit (AWS CDK) 解决,我们可以应用来自 AWS CDK 的相同设计概念帮助所有 Kubernetes 用户。”

SDK: AWS 的所有服务都有 API,各种 SDK 可让您访问它们。比如我可以使用AWS的Java SDK来manage an API Gateway. If I wanted to script some custom deployment process, I could do so with the SDK, managing all the state, etc. myself. You could probably even re-implement the CloudFormation service with the various underlying APIs... The APIs have varying levels of documentation though. E.g. CloudFormation Java APIs are only mentioned in the raw API reference,而不是更友好的Developer Guide