

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Terraform 作为 IaC 的工具 AWS Cloud
<a name="terraform"></a>

[HashiCorp Terraform](https://developer.hashicorp.com/terraform) 是一款基础设施即代码 (IaC) 工具，可帮助您管理云基础架构。使用 Terraform，您可以在配置文件中定义云和本地资源，您可以对其进行版本控制、重复使用和共享。然后，您可以使用一致的工作流程在整个生命周期中配置和管理所有基础架构。

开发人员使用一种名为 [Terraform](https://developer.hashicorp.com/terraform/language) 语言的高级配置语言。Terraform 语言的原生低级语法是[HashiCorp配置语言 (](https://developer.hashicorp.com/terraform/language/syntax/configuration)HCL)。Terraform 语言旨在便于人类阅读和写作。您可以使用 Terraform 语言来描述云或本地基础设施的所需终端状态。然后，Terraform 会生成达到该最终状态的计划，然后您执行该计划来配置基础架构。

**使用 Terraform 的优点：**
+ Terraform 与平台无关。您可以将其与任何云服务提供商一起使用。您可以跨云提供商和许多其他云提供商配置、测试 AWS 和部署基础架构。如果您的组织使用多个云提供商，Terraform 可以成为管理云基础架构的单一、统一、一致的解决方案。有关多云支持的更多信息，请参阅 Terraform 网站上的[多云配置](https://www.terraform.io/use-cases/multi-cloud-deployment)。
+ Terraform 是无代理的。它不需要在托管基础架构上安装任何软件。
+ Terraform 模块是重用代码并坚持*自己不要重复 (DRY)* 原则的强大方法。例如，您可能为包含亚马逊弹性计算云 (Amazon EC2) 实例、亚马逊弹性块存储 (Amazon EBS) 卷和其他按逻辑分组的资源的应用程序进行了特定的配置。如果您需要创建此配置或应用程序的多个副本，则可以将资源打包到 Terraform 模块中并创建该模块的多个实例，而不必多次复制整个代码。这些模块可以帮助您组织、封装和重用配置。它们还提供一致性并确保最佳实践。
+ Terraform 能够[检测和管理基础架构中的偏差](https://www.hashicorp.com/blog/detecting-and-managing-drift-with-terraform)（Terraform 博客文章）。例如，如果在 Terraform 之外修改了 Terraform 管理的资源，则可以使用 Terraform CLI 检测偏差并将其恢复到所需的状态。

**使用 Terraform 的缺点：**
+ 可能不支持与任何云提供商相关的新功能或新资源。
+ Terraform 不会像那样自动管理你的状态。 AWS CloudFormation默认情况下，它存储在本地文件中，但您也可以将其远程存储在 [Amazon S3 存储桶](https://developer.hashicorp.com/terraform/language/settings/backends/s3)中或通过 [Terraform Enter](https://developer.hashicorp.com/terraform/enterprise) prise。
+ Terraform 状态可能包含敏感数据，例如数据库密码，这可能会带来安全问题。最佳做法是加密状态文件，将其远程存储，对其启用文件版本控制，并使用最低权限对其进行读写操作。有关更多信息，请参阅[使用 AWS Secrets Manager 和 HashiCorp Terraform 保护敏感数据](https://docs.aws.amazon.com/prescriptive-guidance/latest/secure-sensitive-data-secrets-manager-terraform/introduction.html)。
+ 2023年8月，Hashicorp宣布将不再根据 [Mozilla](https://www.mozilla.org/en-US/MPL/) 公共许可证获得开源许可。相反，它现在是根据[商业来源许可证获得许可](https://github.com/hashicorp/terraform/blob/b145fbcaadf0fa7d0e7040eac641d9aef2a26433/LICENSE)的。