AWS CloudFormation和Terraform — 不确定该选择哪个?本文将帮助您做出明智的决定。
云计算已经彻底改变了DevOps世界。它不再仅仅是一个时髦词汇;它已经改变了我们开发和维护应用程序的方式。虽然有无数理由让您为各种规模的企业使用云计算,但存在一个小小的限制:您必须手动配置您的基础设施。
您必须进入您的云服务提供商的控制台,并告诉它们您需要什么。这在小型用例中运作良好,但如果有不同的人在控制台上进行配置更改会怎样呢?您最终可能会得到一个非常复杂的基础设施,这将变得越来越难以维护。没有有效的协作方式或跟踪云基础设施的更改。好在有基础设施即代码。
基础设施即代码(IaC)是云计算中一个时髦的术语。这是管理您的IT IaC的过程。没错。与其手动进入控制台做所有事情,IaC允许您编写配置文件来配置您的云基础设施。IaC给我们带来了诸如一致性、易于快速维护和没有人为错误的好处。
与亚马逊云服务一起使用IaC
AWS是全球领先的云计算服务,市场份额是下一个云服务提供商的两倍。它提供超过200种服务,可以满足数以百万计的用例。
开始使用AWS的IaC时,您经常会将选择范围缩小到AWS CloudFormation和开源工具Terraform。如果您想在这两者之间做出选择,了解这两种工具提供的众多功能可能会让人感到不知所措。在本文中,我们将研究AWS CloudFormation和Terraform之间的区别,以帮助您决定哪种工具更适合您的需求。
Terraform与AWS CloudFormation:区别
模块化
在大型组织中使用IaC时,模块化可能是选择合适工具的一个重要因素。
CloudFormation
CloudFormation没有原生支持模块。相反,它允许您使用称为嵌套堆栈的内容作为模块。
例如,您可以为在您的组织中设置一个S3存储桶创建一个标准的CloudFormation模板。当最终用户希望创建一个S3存储桶时,他们可以使用这个CloudFormation模板作为一个嵌套堆栈来设置标准的S3存储桶。
还有一项AWS服务,即AWS服务目录,可以协助CloudFormation的模块化。AWS服务目录是为那些需要限制AWS服务范围以满足合规性、安全性、成本或性能要求的组织设计的。它在后端使用CloudFormation模板。
让我们通过一个例子快速理解这一点。如果不正确使用,S3存储桶对您的机密数据很快可能会造成灾难。让我们拿同样的例子来说。您希望在您的组织中有一个标准的使用S3的方式。第一种选择是创建嵌套堆栈模板,它可以在其他CloudFormation堆栈中使用,效果同样不错。
或者,您可以使用AWS服务目录,允许用户从控制台UI中使用这个标准模板并指定一些参数进行轻微定制。这将允许您控制基础设施在您的AWS账户中如何被设置,并防止任何不需要的情况发生。
CloudFormation对嵌套堆栈和AWS服务目录的使用也可以支持大型组织中的标准配置,尽管可能需要更多的手动配置。
Terraform
Terraform原生支持模块。它允许您创建类似于AWS CloudFormation的标准配置,并在其他Terraform配置中使用。
由于Terraform是一个开源工具,您还可以在Terraform注册表中找到并使用一些预先制作的开源模块。您还可以根据自己的配置创建自己的模块,并将其托管在私有模块注册表中。
Terraform原生支持模块,提供了一种简单的模块化方法。然而,在大型团队中管理模块可能需要额外的治理,以确保正确使用。
在CloudFormation中使用嵌套堆栈并不像在Terraform中使用模块那样简单。主要原因是将数据从CFN模板传递到嵌套堆栈可能会很复杂。
CloudFormation没有集中式的模板共享库。AWS服务目录允许您管理此过程,但主要通过控制台强制执行规则。虽然CloudFormation模板可以封装复杂任务,但用户在创建资源时仍需指定参数。
另一方面,Terraform有一套方法来创建、维护和共享模块。您可以在Terraform模块注册表中查看模块的具体要求,并轻松地在Terraform文件中使用它们。
基础设施的控制与治理
如果您想限制您的员工在AWS账户中可以创建哪些资源,AWS CloudFormation和Terraform为您提供了实现这一目标的手段。
CloudFormation
CloudFormation 通过 IAM 策略提供控制,允许您管理用户对资源的访问。然而,这种控制是针对 AWS 的,如果您的基础架构完全基于 AWS,这可能是理想的。
在我们的 S3 存储桶示例中,您可能希望限制用户的所有“S3 创建”权限,并只允许他们从 AWS 服务目录或嵌套堆栈创建 S3 存储桶。
Terraform
Terraform 允许您使用一种名为 Sentinel 的策略即代码工具来控制用户可以创建哪些资源。Sentinel 将使您能够执行细粒度的基于逻辑的策略,通过 Terraform 允许或拒绝用户操作。例如,您可以拒绝创建 S3 存储桶的所有资源,并只允许用户从标准模块创建 S3 存储桶。
状态管理
AWS CloudFormation 和 Terraform 需要跟踪它们维护的资源。
Terraform
Terraform 将您的基础架构状态存储在一个状态文件中。默认情况下,此文件存储在本地;但是,您可以将其存储在像 S3 这样的远程后端,并允许多个用户对相同的基础架构进行更改。
CloudFormation
CloudFormation 在后台内部进行状态维护,因此用户无需担心手动管理状态文件。这对于那些希望获得完全托管服务的用户来说是一个好处。
AWS CloudFormation和Terraform都允许您检查将对基础架构进行的更改。在Terraform中,您可以运行命令”terraform plan”来查看Terraform计划如何应用您的配置更改。在CloudFormation中,用户可以通过Change Sets查看此信息。
语言
Terraform
Terraform使用HashiCorp配置语言HCL,这是HashiCorp创建的一种语言。它与JSON非常相似,具有额外的内置功能和能力。
CloudFormation
CloudFormation模板以YAML或JSON格式编写。
日志和回滚
AWS CloudFormation和Terraform都具有良好的日志记录功能。根据我的经验,错误和问题通常很明了。
CloudFormation
默认情况下,CloudFormation会在堆栈更改失败时回滚所有更改。这是一个很好的功能,但可以为调试目的而禁用。
Terraform
如果Terraform失败,它不会自动回滚您的更改。这不是问题,因为您始终可以运行Terraform destroy命令来删除半部署的配置,然后重新启动Terraform运行。
范围
Terraform
Terraform的多云支持允许您跨AWS、Azure、Google Cloud和其他平台部署基础架构,并在多云环境中工作时提供灵活性。
CloudFormation
CloudFormation 与 AWS 紧密集成,使其成为仅限 AWS 的基础设施的良好选择,但对多云设置的支持有限。
功能支持
CloudFormation
AWS CloudFormation 通常会首先接收新服务和功能的更新,因为它与 AWS 的紧密集成。
Terraform
在 Terraform 缺少某些 AWS 功能的情况下,您可以将 CloudFormation 堆栈直接集成到您的 Terraform 代码中作为解决方案。
技术支持
CloudFormation
付费的 AWS 技术支持计划也涵盖 CloudFormation 支持。
Terraform
HashiCorp 也为 Terraform 提供了付费的技术支持计划。
结论
AWS CloudFormation 和 Terraform 都是强大且成熟的工具,各自具有优点。以上差异可以帮助您确定哪个工具最适合您的需求。如果您计划使用多个云平台,Terraform 提供多云支持,而 AWS CloudFormation 是 AWS 特定环境的优秀选择。最终,这两种工具都是可行的,并能有效管理基础设施即代码(IaC)。正确的选择取决于您的需求,无论您是专注于 AWS 还是与多个云服务提供商合作。
Source:
https://dzone.com/articles/understanding-iac-tools-cloudformation-vs-terraform