理解IaC工具:AWS CDK vs. Terraform
AWS CDK和Terraform-不确定选择哪一个?本文将帮助您作出明智的决策。
Cloud Computing彻底改变了信息和技术的世界。从我们部署和维护应用程序的方式到开发实践,云计算对一切都产生了很大影响。所有新的应用程序都是以云为本的,并与云服务兼容。
云计算帮助我们开发高可用性、可扩展性和高效性的架构,使云服务越来越受欢迎。随着云计算的兴起,需要将基础设施作为代码进行维护。通过控制台手动维护云资源可能是一项复杂的任务,很难进行跟踪。
Infrastructure as a code,即IAC或IAAC,解决了这个问题。通过使用IAC,我们可以将资源定义为代码,并使用此代码来提供云服务。使用基础设施作为代码允许多个开发人员协作进行基础设施,并跟踪开发人员所做的更改。
AWS中的基础设施即代码
AWS是全球最大且最广泛使用的云提供商。它拥有自己的IAC工具,即AWS CloudFormation或AWS CDK,并且还允许第三方IAC工具(如Terraform)提供资源。在选择AWS的IAC工具时,第三方工具Terraform是AWS托管工具AWS CloudFormation和AWS CDK的有力竞争者。
由于每个工具提供了如此多的选择和功能,选择合适的IAC工具可能会具有挑战性。在本文中,我们将讨论AWS CDK和Terraform之间的区别。AWS CDK在内部使用Cloudformation,因此要深入了解Cloudformation和Terraform,请参阅相关文章《了解IAC工具: CloudFormation vs. Terraform》。
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 vs. 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 documentation中查看此资源支持的其他参数。
如前所述,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代码都非常简单。如果您计划在一个小项目中使用基础设施即代码,不论是Terraform还是CDK都是很好的选择,因为它们在语言和易用性方面都非常出色。
但是,当为一个具有许多开发人员的大型项目选择合适的基础设施即代码工具时,Terraform存在一个缺点。尽管Terraform非常简单,但它是一种新语言,您需要培训开发人员学习一门与其他正在使用的编程语言不相似的全新语言。更重要的是,Terraform中的数据操作并不像其他编程语言那样简单。例如,对列表和对象进行迭代和转换值并不简单,特别是对于初学者来说。
就我个人而言,如果考虑易用性,我更喜欢AWS CDK而不是Terraform。在使用Terraform时,有时我不得不使用变通方法或复杂的脚本才能获得期望的结果。AWS CDK中对数据的控制以及轻松操作数据的能力对于AWS CDK来说是一个巨大的优势。
#2. 范围
Terraform是一个多云基础设施即代码工具,这意味着您不仅可以将Terraform与AWS一起使用,还可以与其他云提供商(如Azure或GCP)一起使用。Terraform是一个很好的工具,可以创建多云部署,并为应用程序提供任意数量的云提供商。
由于云提供商服务的问题,曾经有过全球广泛使用的平台因此而故障。在如今的时代,为应用程序选择多个云提供商是一个明智的决策。
AWS CDK是AWS提供的基础设施即代码工具。尽管CDK可能强大且成熟,但它仅限于AWS Cloud。
在考虑基础设施即代码工具的范围时,Terraform是明显的赢家。对于所有云平台来说,让开发人员使用同一个工具是非常合理的。
#3. 性能
当选择合适的基础设施即代码工具时,性能通常不是最重要的标准,但在大型项目中可能会有所影响。Terraform使用AWS SDK来部署资源,而CDK代码首先被转换为CloudFormation模板,然后再应用。
Terraform的速度比AWS CDK稍快,特别是因为CDK将代码转换为CloudFormation模板所需的时间。
#4. 模块化
Terraform和AWS CDK都可以用于创建模块。Terraform原生支持模块。您可以创建自己的模块,并将其托管在私有模块注册表中供组织内部使用。Terraform还有一个公共模块注册表,用于托管和使用公共模块。
在AWS CDK中,您可以创建可重用的函数、类,并在组织内共享此代码以实现相同的结果。这是AWS CDK的一个重大优点,因为其他AWS基础设施即代码工具 – CloudFormation不允许您创建和重用代码作为模块。您可以使用CloudFormation中的嵌套堆栈来实现此要求,但使用AWS CDK是一个更适合的替代方案。
总的来说,这两个工具在这个方面都非常相似。
#5. 控制和治理
最终,对AWS控制台的所有访问都由IAM(AWS的身份管理服务)控制。您可以在AWS CDK和Terraform中使用IAM策略来允许和拒绝某些操作。IAM允许您对帐户上可以执行的操作进行细粒度控制。
除了使用IAM来控制对账户资源的访问之外,Terraform还提供了一个名为Sentinel的代码框架。Sentinel允许您编写细粒度的策略以正确控制用户通过Terraform的操作。
总结
由于AWS CDK内部使用CloudFormation,我建议您阅读这篇文章以更好地了解AWS CDK和Terraform之间的区别。
总的来说,AWS CDK和Terraform都是成熟而强大的工具。在数据操作方面,Terraform稍显不足。然而,根据我的经验,一旦您对编写Terraform更加熟悉,使用解决方法和执行数据转换就变得更容易。对于多云操作,Terraform是一个明显的选择;然而,如果您打算使用AWS作为云提供商,AWS CDK是一个很好的替代选择。