了解基础设施即代码工具:Cloudformation vs Terraform
AWS CloudFormation和Terraform – 不确定选哪个?本文将帮助您做出明智的决策。
Cloud Computing已经彻底改变了DevOps的世界。它不再只是一个流行词,它已经到来并且将改变我们开发和维护应用程序的方式。尽管使用云计算的原因有无数个,适用于各种规模的企业,但有一个小小的限制,那就是您必须手动配置基础设施。
您必须去云提供商的控制台并告诉他们您想要什么。这对小型用例效果很好,但如果有不同的人在控制台上进行配置更改会怎样呢?您可能会得到一个非常复杂的基础架构,随着时间的推移将变得越来越难以维护。在云中,没有有效的协作或跟踪基础架构更改的方法。实际上,确实有一种方法。Infrastructure as a Code.
基础设施即代码(IAAC)是云计算中非常流行的术语。它是使用代码来管理您的IT基础设施的过程。是的,就是这样。而不是去控制台手动完成所有操作;基础设施即代码,也称为IAAC或IAC,允许您编写配置文件,然后配置您的云基础设施。IAAC为我们提供了一致性、简便快捷的维护以及消除人为错误的好处。
使用IAAC与亚马逊网络服务
AWS是世界上领先的云计算服务,市场份额是紧随其后的下一个云提供商的两倍。AWS上有超过200种服务,可以满足成百上千种用例。
当开始使用AWS的IAAC时,您经常会将选择范围缩小到AWS CloudFormation和开源工具Terraform之间。要在这两者之间做出选择,了解两个工具提供的众多特性可能会让人感到非常压力。在本文中,我们将研究AWS CloudFormation和Terraform之间的区别,以帮助您决定哪个工具更适合您的需求。
Terraform vs. AWS CloudFormation:区别
模块化
在大型组织中使用IAAC时,模块化可能是选择正确工具的重要因素。
CloudFormation
CloudFormation没有原生支持模块。它允许您使用称为嵌套堆栈的东西作为模块。
例如,您可以有一个标准配置,用于在组织中配置S3存储桶。因此,您创建一个标准的CloudFormation模板,用于创建S3存储桶。现在,当最终用户想要创建S3存储桶时,他们可以使用此CloudFormation模板作为嵌套堆栈并创建标准的S3存储桶。
还有一个鲜为人知的AWS服务,即AWS Service Catalog,它可以帮助您处理AWS CloudFormation的模块化问题。服务目录是一个专门为希望限制AWS服务范围以满足合规性、安全性、成本或性能要求的组织而设计的AWS服务。猜猜看?AWS服务目录在后台使用CloudFormation模板。
让我们通过一个例子快速理解。如果不正确使用S3存储桶,可能很快对您的机密数据造成灾难。让我们以相同的例子来看,您想要在组织中使用S3的标准方式。第一种选择是创建嵌套堆栈模板,可在其他CloudFormation堆栈中使用,并且同样好用。
如果您不希望用户将此标准模板作为嵌套堆栈使用,您可以使用AWS服务目录。服务目录将允许用户从控制台的用户界面中使用此标准模板,并指定一些参数进行轻微自定义。这将允许您控制在您的AWS账户中如何配置基础设施,防止任何不需要的情况发生。
Terraform
Terraform对模块拥有原生支持。它允许您创建标准配置,类似于AWS CloudFormation,并在其他terraform配置中使用它。
由于Terraform是一个开源工具,您还可以在Terraform注册表中找到并使用一些预先制作的开源模块。您也可以使用自己的配置创建自己的模块,并将其托管在私有模块注册表上。
就个人而言,如果模块化是一个重要的需求,我更愿意使用Terraform而不是CloudFormation。
在CloudFormation中使用嵌套堆栈不像在Terraform中使用模块那么容易。主要因素在于从CFN模板传递数据到嵌套堆栈可能相当复杂。
在CloudFormation中没有标准的共享模板位置。您有AWS服务目录,但那只是一种通过控制台强制执行某些规则来创建基础架构的方法。我们都是代码。当使用服务目录时,虽然某些复杂的任务被CloudFormation文件封装,但仍然需要手动进行一些操作,以指定参数以完成基础架构的创建。
另一方面,Terraform有一套创建、维护和共享模块的方法。您可以在Terraform模块注册表中查看模块的确切要求,并在您的terraform文件中非常容易地使用它们。
对基础架构的控制和治理
如果您想限制用户在您的AWS账户中可以创建的资源:AWS CloudFormation和Terraform均提供了相应的手段。
我们先谈谈CloudFormation。CloudFormation本身并不对模板的使用方式提供任何控制,但您可以使用AWS IAM策略,只允许您AWS账户中的用户使用标准CloudFormation模板创建资源。在我们的S3存储桶示例中,您可能希望限制用户的所有“S3创建”权限,并只允许他们从AWS服务目录或嵌套堆栈创建S3存储桶。
Terraform允许您使用“策略即代码”工具来控制用户可以创建的资源。Sentinel允许您通过Terraform强制执行基于逻辑的细粒度策略,以允许或拒绝用户操作。例如,您可以拒绝创建S3存储桶的所有资源,并只允许用户从标准模块创建S3存储桶。
状态管理
AWS CloudFormation和Terraform都需要跟踪它们正在维护的资源。
Terraform将您的基础架构状态存储在状态文件中。默认情况下,此文件存储在本地,但您可以将其存储在像S3这样的远程后端,并且可以让多个用户对同一套基础架构进行更改。
CloudFormation不维护一个状态文件,至少我们看不到。CloudFormation是一项托管服务,因此它会在后台执行所有状态维护和检查。
AWS CloudFormation和Terraform都有一种方式让您检查将对基础架构进行哪些更改。在Terraform中,您可以运行“terraform plan”命令,以查看Terraform计划如何应用您的配置更改。在CloudFormation中,用户可以通过变更集来查看此信息。
语言
Terraform使用HashiCorp Configuration Language(HCL),这是HashiCorp创建的一种语言。它与JSON非常相似,具有额外的内置功能和能力。
CloudFormation模板是用YAML或JSON格式编写的
日志和回滚
AWS CloudFormation和Terraform都具有良好的日志功能。根据我的经验,错误和问题通常都很直观。
CloudFormation:默认情况下,CloudFormation在堆栈更改失败的情况下会回滚所有更改。这是一个很好的功能,可以为任何调试目的禁用。
Terraform:如果失败,Terraform不会自动回滚您的更改。这不是问题,因为您始终可以运行terraform destroy命令来删除半配置的配置,并重新启动Terraform运行。
范围
Terraform并不限于AWS Cloud。在选择Terraform和CloudFormation之间的主要因素是,Terraform支持其他云提供商和服务。
因此,如果计划在多个云平台上使用IAC,Terraform是您的最佳选择。尽管CloudFormation是一个强大的工具,但它只限于AWS。使用Terraform,您可以在多个云平台上设置基础架构并部署应用程序,从而使您的应用程序更可用和稳健。
功能支持
通常,当AWS推出新的服务和功能时,CloudFormation将在Terraform之前进行更新,因为它是一个AWS服务。截至目前,这两个工具都涵盖了大多数这些服务的服务和功能。使用Terraform可能会有一些小缺点,但我们有解决方案。
您还可以在Terraform代码中创建一个CloudFormation堆栈。因此,如果您使用Terraform,它没有某个功能,您可以在Terraform代码中临时设置一个CloudFormation堆栈。
技术支持
付费的AWS技术支持计划还包括CloudFormation支持。
HashiCorp还提供有关Terraform的付费技术支持计划。
结论
AWS CloudFormation和Terraform都是强大且完善的工具。以上的区别将帮助您根据您的需求做出明智的选择。个人建议,如果您计划在未来使用多个云平台或目前正在使用多个云平台,则应将Terraform用作满足所有需求的一站式解决方案。如果您只需要AWS的IAC工具,则AWS CloudFormation和Terraform都是不错的选择。
如果您有兴趣学习Terraform,请查看这些online courses。