了解 IaC 工具:Cloudformation 与 Terraform

已发表: 2022-03-10

AWS CloudFormation 和 Terraform – 不确定选择哪一个? 本文将帮助您做出明智的决定。

云计算彻底改变了 DevOps 的世界。 它不再只是一个流行词。 它就在这里,它在这里改变了我们开发和维护我们的应用程序的方式。 虽然有无数理由说明您应该为各种规模的企业使用云计算,但有一点限制,您必须手动配置您的基础架构。

你必须去你的云提供商的控制台,告诉他们你想要什么。 这适用于小型用例,但如果您有不同的人在控制台中进行配置更改怎么办。 你最终可能会得到一个超级复杂的基础设施,而且只会变得越来越难以维护。 没有有效的方法来协作或跟踪云中基础设施的变化。 嗯,实际上是有的。 基础设施即代码。

基础设施即代码是云计算中非常流行的术语。 这是使用代码管理 IT 基础架构的过程。 是的,这是正确的。 而不是去控制台并手动执行所有操作; 基础架构即代码,即 IAAC 或 IAC,允许您编写配置文件,然后配置您的云基础架构。 IAC 为我们带来了一致性、简单快速的维护以及没有人为错误的余地等好处。

将 IAC 与 Amazon Web Services 结合使用

AWS 是全球领先的云计算服务,其市场份额是仅次于它的下一个云提供商的两倍。 AWS 上有超过 200 种服务可以满足成百上千的用例。

在开始将 IAC 与 AWS 结合使用时,您通常会将选择范围缩小到 AWS CloudFormation 和开源工具 Terraform。 在尝试在两者之间做出选择时,了解这两种工具提供的众多功能可能会让人不知所措。 在本文中,我们将了解 AWS CloudFormation 和 Terraform 之间的差异,以帮助您确定哪种工具更适合您的需求。

Terraform 与 A​​WS CloudFormation:差异

模块化

在大型组织中使用 IAC 时,模块化可能是选择正确工具的重要因素。

云形成

CloudFormation 没有对模块的本机支持。 它允许您使用称为嵌套堆栈的东西作为模块。

例如,您可以对如何在组织中预置 S3 存储桶进行标准配置。 因此,您创建了一个标准 CloudFormation 模板来创建 S3 存储桶。 现在,当最终用户想要创建 S3 存储桶时,他们可以将此 CloudFormation 模板用作嵌套堆栈并创建标准 S3 存储桶。

AWS 还有一项鲜为人知的服务,即 AWS Service Catalog,它可以帮助您实现 AWS CloudFormation 的模块化。 Service Catalog 是一项 AWS 服务,专为希望限制 AWS 服务范围以满足合规性、安全性、成本或性能要求的组织而设计。 你猜怎么着? AWS Service Catalog 在后端使用 CloudFormation 模板。

让我们通过一个例子快速理解这一点。 如果使用不当,S3 存储桶很快就会对您的机密数据造成灾难性影响。 让我们举同样的例子,您希望有一个标准的方式来说明您希望如何在您的组织中使用 S3。 第一个选项是创建嵌套堆栈模板,它可以在其他 CloudFormation 堆栈中使用并且同样出色。

如果您不希望用户必须将此标准模板用作嵌套堆栈,您可以使用 AWS Service Catalog。 服务目录将允许用户从控制台的 UI 中使用此标准模板并指定一些参数,以进行轻微的自定义。 这将允许您控制如何在您的 AWS 账户中预置基础设施并防止出现任何不需要的情况。

地形

Terraform 具有对模块的原生支持。 它允许您创建与 AWS CloudFormation 非常相似的标准配置,并将其用于其他 terraform 配置。

由于 Terraform 是一个开源工具,您还可以在 Terraform Registry 中找到并使用一些预制的开源模块。 您还可以使用自己的配置创建自己的模块,并将它们托管在私有模块注册表上。

就个人而言,如果模块化是一个很大的要求,我更喜欢使用 Terraform 而不是 CloudFormation。

在 CloudFormation 中使用嵌套堆栈不像在 Terraform 中使用模块那么容易。 主要因素是将数据从 CFN 模板传递到嵌套堆栈可能相当复杂。

没有可以共享 CloudFormation 模板的标准位置。 您拥有 AWS 服务目录,但这只是您通过控制台执行一些创建基础设施的规则的一种方式。 我们都是关于代码的。 在使用 Service Catalog 时,虽然一些复杂的任务被 CloudFormation 文件封装了,但您仍然需要通过手动任务去控制台并指定参数来制作您的 Infrastructure。

另一方面,Terraform 有一套创建、维护和共享模块的方法。 您可以在 Terraform 模块注册表中查看模块的确切要求,并非常轻松地在您的 terraform 文件中使用它们。

对基础设施的控制和治理

如果您想限制您的人员可以在您的 AWS 账户中创建的资源:AWS CloudFormation 和 Terraform 都为您提供了这样做的方法。

让我们先谈谈 CloudFormation。 CloudFormation 本身不对模板的使用方式提供任何控制,但您可以使用 AWS IAM 策略仅允许您的 AWS 账户中的用户仅使用标准 CloudFormation 模板来创建资源。 在我们的 S3 存储桶示例中,您可能希望限制用户的所有“S3 创建”权限,只允许他们从 AWS Service Catalog 或嵌套堆栈创建 S3 存储桶。

Terraform 允许您使用策略作为代码工具 Sentinel 来控制用户可以创建哪些资源。 Sentinel 允许您执行细粒度、基于逻辑的策略,以允许或拒绝用户通过 Terraform 执行的操作。 例如,您可以拒绝所有创建 S3 存储桶的资源,只允许用户从标准模块创建 S3 存储桶。

状态管理

AWS CloudFormation 和 Terraform 都需要跟踪它们维护的资源。

Terraform将基础设施的状态存储在状态文件中。 该文件默认存储在本地,但是您可以将其存储在 S3 等远程后端,并让多个用户对同一组基础架构进行更改。

CloudFormation不维护状态文件,至少不是我们可以看到的。 CloudFormation 是一项托管服务,因此它会在后台进行所有状态维护和检查。

AWS CloudFormation 和 Terraform 都可以让您检查将对您的基础设施进行哪些更改。 在 Terraform 中,您可以运行命令 - “terraform plan”以及 Terraform 计划如何应用您的配置更改。 在 CloudFormation 中,用户可以通过更改集查看此信息。

Terraform 使用 HashiCorp 配置语言 HCL,这是一种由 HashiCorp 创建的语言。 它与 JSON 非常相似,具有额外的内置特性和功能。

CloudFormation 模板以 YAML 或 JSON 格式编写

日志记录和回滚

AWS CloudFormation 和 Terraform 都具有良好的日志记录功能。 以我的经验,错误和问题很简单(大部分)。

CloudFormation:默认情况下,CloudFormation 会在堆栈更改失败的情况下回滚您的所有更改。 这是一个很好的功能,可以出于任何调试目的禁​​用。

Terraform: Terraform 不会在失败时自动回滚您的更改。 这不是问题,因为您始终可以运行 terraform destroy 命令来删除半配置的配置并再次重新启动 Terraform 运行。

范围

Terraform 不仅限于 AWS 云。 在 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,请查看这些在线课程。