了解 IaC 工具:AWS CDK 与 Terraform
已发表: 2022-03-31AWS CDK 和 Terraform – 不确定选择哪个? 本文将帮助您做出明智的决定。
云计算彻底改变了信息和技术的世界。 从我们部署和维护应用程序的方式到开发实践,一切都受到云计算的高度影响。 所有新应用程序都开发为云原生并与云服务兼容。
云计算帮助我们开发高可用、可扩展和高效的架构,这使得云服务的需求越来越大。 随着云计算的蓬勃发展,需要将基础设施作为代码进行维护。 通过控制台手动维护云资源可能是一项很难跟踪的复杂任务。
基础设施即代码,即 IAC 或 IAAC,解决了这个问题。 通过使用 IAC,我们可以将我们的资源定义为代码,并使用此代码来提供云服务。 使用基础架构即代码允许多个开发人员在基础架构上进行协作并跟踪开发人员所做的更改。
AWS 中的基础设施即代码
AWS 是全球最大、使用最广泛的云提供商。 它有自己的 IAC 工具 AWS CloudFormation 或 AWS CDK,还允许 Terraform 等 3rd 方 IAC 工具预置资源。 在为 AWS 选择 IAC 工具时,第三方工具 Terraform 是 AWS 托管工具、AWS CloudFormation 和 AWS CDK 的有力竞争者。
由于这些工具中的每一个都提供了如此多的选择和功能,因此选择正确的 IAC 工具可能具有挑战性。 在本文中,我们将讨论 AWS CDK 和 Terraform 之间的区别。 AWS CDK 内部使用 Cloudformation,因此要更深入地了解 Cloudformation 和 Terraform,请参阅相关文章了解 IAC 工具:CloudFormation 与 Terraform。
地形
Terraform 是最初由 Hashicorp 开发的开源基础设施即代码工具。 它是一个高度准确且成熟的工具,不仅支持 AWS,还支持其他云提供商。 Terraform 支持所有 AWS 服务,开发社区可以快速了解 AWS 添加到其服务中的任何新功能。 它允许我们用 Hashicorp 开发语言 (HCL) 编写代码。 HCL 是一种类似 JSON 的语言,用于定义基础设施资源。
AWS CDK
AWS CDK 是 AWS CloudFormation 的包装器。 要了解 AWS CDK 的工作原理,您应该对 AWS CloudFormation 有所了解。 AWS CloudFormation 是 AWS 托管的工具,允许我们以 YML 或 JSON 格式定义 AWS 基础设施。 尽管阅读 JSON 和 YML 很容易,但它们并不是真正的编程语言。 没有对循环和函数的原生支持,这使得维护大型基础设施变得越来越困难。 这就是 AWS CDK 的用武之地。
AWS CDK 是围绕 AWS CloudFromation 的包装器,它允许您使用熟悉的编程语言(如 JAVA 或 Python)来预置您的基础设施。 这使得编写和维护代码变得更加容易。
Terraform 与 AWS CDK:差异
#1。 语言和易用性
语言和易用性对于理解 AWS CDK 和 Terraform 之间的区别至关重要。
让我们先谈谈 Terraform。 Terraform 使用类似 JSON 的语言、HCL 或 HashiCorp 配置语言来定义资源和其他数据。 它非常简单,文档易于理解和遵循,即使对于初学者也是如此。
让我们看看创建 S3 存储桶的代码。
resource "aws_s3_bucket" "my_s3_bucket" { bucket = "my-tf-bucket" tags = { Name = "My bucket" Environment = "Dev" } }
该代码非常易于阅读,您可以在 Terraform 文档中查看此资源支持的其他参数。
如前所述,AWS CDK 是一个 CloudFormation 包装器,它允许我们以编程语言定义我们的资源。 让我们看看创建 S3 存储桶的 AWS CDK 代码。
import * as cdk from '@aws-cdk/core'; import * as s3 from '@aws-cdk/aws-s3'; export class BucketStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); new s3.Bucket(this, 'MyFirstBucket', { bucketName: 'my-first-bucket', }); } }
Terraform 代码看起来比 CDK 更简洁,但 Terraform 和 CDK 代码都非常简单。 如果您打算将 IAC 用于小型项目,就语言和易用性而言,Terraform 和 CDK 都是不错的选择。

但是,在为一个有很多开发人员的大型项目选择合适的 IAC 工具时,Terraform 有一个缺点。 就像 Terraform 一样简单,它是一种新语言,您需要用一种与其他正在使用的编程语言不同的全新语言来培训您的开发人员。 更重要的是,Terraform 中的数据操作不像其他编程语言那么简单。 例如,遍历列表和对象并转换值并不是那么简单,尤其是对于初学者而言。
就个人而言,如果考虑到易用性,我更喜欢 AWS CDK 而不是 Terraform。 使用 Terraform 时,有时我不得不使用变通方法或复杂的脚本来获得所需的结果。 我们对数据的控制以及以 AWS CDK 语言轻松操作数据的能力是 AWS CDK 的一大胜利。
#2。 范围
Terraform 是一个多云 IAC 工具,这意味着您不仅可以将 Terraform 与 AWS 一起使用,还可以与 Azure 或 GCP 等其他云提供商一起使用。 Terraform 是创建多云部署并为您的应用程序提供任意数量的云提供商的绝佳工具。
有时,由于云提供商的服务出现问题,广泛使用的全球平台出现故障。 在当今时代,为您的应用程序拥有多个云提供商是一个明智的决定。
AWS CDK 是适用于 IAC 的 AWS 产品。 尽管 CDK 功能强大且成熟,但它仅限于 AWS 云。
在考虑 IAC 工具的范围时,Terraform 显然是两者的赢家。 让您的开发人员为所有云平台使用单一工具是很有意义的。
#3。 表现
在选择正确的 IAC 工具时,性能通常不是最重要的标准,但在大型项目中可能很重要。 Terraform 使用 AWS 开发工具包部署资源,而 CDK 代码首先转换为 CloudFormation 模板,然后再应用。
Terraform 的运行速度会比 AWS CDK 稍快,特别是因为 CDK 需要花费时间将代码转换为 CloudFormation 模板。
#4。 模块化
Terraform 和 AWS CDK 都可以用来创建模块。 Terraform 具有对模块的原生支持。 您可以创建自己的模块并将它们托管在私有模块注册表中,以在您的组织内使用。 Terraform 还有一个公共模块注册表,用于托管和使用公共模块。
在 AWS CDK 中,您可以创建可重用的函数、类并在您的组织内共享此代码以实现相同的结果。 这是 AWS CDK 作为其他 AWS IAC 工具的一大优势 – CloudFormation 不允许您将代码创建和重用为模块。 您可以使用 CloudFormation 中的嵌套堆栈来实现此要求,但使用 AWS CDK 是更合适的替代方案。
总而言之,这两种工具在这方面都是相似的。
#5。 控制和治理
最终,对 AWS 控制台的所有访问都由 AWS 的身份管理服务 IAM 控制。 您可以将 IAM 策略与 AWS CDK 和 Terraform 结合使用,以允许和拒绝某些操作。 IAM 允许您对可以对您的帐户执行的操作进行细粒度控制。
除了使用 IAM 来控制对账户资源的访问之外,Terraform 还提供了一个策略即代码框架Sentinel 。 Sentinel 允许您编写细粒度的策略,以通过 Terraform 正确控制用户的操作。
结论
由于 AWS CDK 内部使用 CloudFormation,我建议您阅读 CloudFormation 与 Terraform 文章,以更好地了解 AWS CDK 和 Terraform 之间的区别。
总体而言,AWS CDK 和 Terraform 都是成熟而强大的工具。 在数据操作方面,Terraform 有一个轻微的缺点。 但是,根据我的经验,一旦您对编写 Terraform 更加熟悉,使用变通方法和执行数据转换就会变得更加容易。 对于多云操作,Terraform 是一个显而易见的选择; 但是,如果您希望使用 AWS 作为您的云提供商,AWS CDK 是一个很好的选择。