20个最佳实践提升Terraform工作流程|Part 1

最佳,实践,提升,terraform,工作,流程,part · 浏览次数 : 23

小编点评

**使用 Terraform 管理 IaC 的最佳实践** **构建 Terraform 项目的策略** * **保持 Terraform 配置尽可能是比较合适的方式。** * **将 Terraform 代码分解为可重用的组件。** * **利用 outputs 和terraform_remote_state 来跨模块甚至不同 Terraform 状态引用值。** **最佳实践** **1. 确定 Terraform 配置结构** * 基于所有权和责任、变更率和管理难易程度来分离模块。 * 利用 outputs 和terraform_remote_state 来跨模块甚至不同 Terraform 状态引用值。 **2. 考虑使用远程状态** * 在不同状态之间共享参数的另一种选择是利用外部工具 [1] 来发布和使用数据。 **3. 组织 Terraform 代码** * 为特定所有者定义具有有限范围和爆炸半径的 Terraform 配置。 * 使用基于角色的访问控制 (RBAC) 对它们进行分段访问。 **4. 使用数据源** * 从数据源中获取属性值,例如 AWS 账户 ID。 **5. 格式化和验证 Terraform 代码** * 使用 fmt 和 validate 命令正确格式化和验证代码。 **6. 使用一致的命名规则** * 在名称中使用下划线_作为分隔符并使用小写字母。 **7. 遵守 Terraform 的命名规则** * 在资源名称中尽量不要重复资源类型。 * 使用单数名词来表示列表或地图。 **8. 使用 CI/CD 流水线或 pre-commit hook** * 通过 CI/CD 流水线或 pre-commit hook 自动完成 Terraform 代码格式化和验证。

正文

Terraform 是管理基础设施及代码(IaC)最常用的工具之一,它能使我们安全且可预测地对基础设施应用更改。刚开始上手 Terraform 可能会感觉有些不容易,但很快就能对该工具有基本的了解,随之可以开始运行命令、创建和重构 Terraform 代码。在此过程中,许多新用户面临着如何正确构建代码、使用高级功能、在 IaC 流程中应用软件开发最佳实践等方面的细微差别和问题。
 

在本篇文章中,我们将讨论使用 Terraform 管理 IaC 的最佳实践,帮助您将 Terraform 技能提升到一个新的水平。点击Seal博客可阅读更多关于 Terraform 的技术文章
 

如何构建 Terraform 项目

在开始讨论 Terraform 的一些最佳实践之前,我们先来看看构建 Terraform 项目的一些策略。在 Terraform 的世界中,构建配置的方式没有正确或错误之分,而且您在网上找到的大多数建议结构都带有很大的主观色彩。在决定如何设置 Terraform 配置时,最重要的是了解您的基础设施需求和用例,并制定适合您的团队和项目的解决方案
 

如果我们正在处理一个基础设施组件有限的小型项目,那么保持 Terraform 配置尽可能是比较合适的方式。在这类情况下,我们可以只配置根模块必需的文件,即根目录中存在的配置文件。一个小项目可以只包含这些文件main.tfvariables.tfREADME.md。您可能会发现方便使用的其他一些文件包括:outputs.tf(用于定义项目的输出值)、versions.tf(用于收集配置的任何固定版本)以及providers.tf配置与您使用的提供商相关的选项,尤其是在有多个提供商的情况下。
 

我们的主要入口点是main.tf,在简单的用例中,我们可以在那里添加所有资源。我们在variables.tf中定义变量,并在terraform.tfvars中为它们赋值。我们使用文件outputs.tf来声明输出值。
 


 

当处理较大的项目时,会更加复杂,我们需要找出适合项目的最佳结构。
 

首先将 Terraform 代码分解为可重用的组件,不同的团队可以相应地使用和定制。我们可以通过为基础设施部分创建单独的模块来实现这一点,这些模块应该在不同的环境、项目和团队中重用。
 

常见的做法是根据所有权和责任、变更率和管理难易程度来分离模块。对于每个模块,我们需要定义其输入和输出并彻底记录它们,以便使用者能够有效地使用它们。然后,我们可以利用outputsterraform_remote_state来跨模块甚至不同 Terraform 状态引用值。
 

请注意,使用terraform_remote_state数据源意味着访问整个状态快照,这可能会引发安全问题。在不同状态之间共享参数的另一种选择是利用外部工具 [1] 来发布和使用数据,例如 Amazon SSM Parameter Store 或 HashiCorp Consul。
 

接下来需要决定将所有 Terraform 代码保留在单个存储库 ( monorepo ) 中,或是将 Terraform 配置分离到多个代码存储库中。这两种方法都有缺点和优点。目前有一种趋势,即避免巨大的单一存储库并使用单独的配置来实现更快的模块开发和灵活性。
 

通常,我们必须处理大量不同的基础设施环境,而 Terraform 中有多种方法可以处理这个问题。一个合适且容易遵循的做法是为不同的环境单独配置 Terraform。这样不同的环境就有自己的状态,可以单独测试和管理,而共享行为则通过共享或远程模块实现。一种选择是每个环境使用单独的目录,并为每个目录保留单独的状态。另一种选择是将所有 Terraform 配置保留在同一目录中,并为每个环境传递不同的环境变量以相应地参数化配置。
 

这里您可以找到每个目录的三个不同环境的示例结构:生产staging测试。每个环境都有自己的状态,并在利用公共或共享模块的同时与其他环境分开管理。尽管这种方法会带来一些代码重复,但我们获得了更高的清晰度、环境隔离和可扩展性。
 


 

一般来说,我们希望为特定所有者定义具有有限范围和爆炸半径的 Terraform 配置。为了最大限度地降低风险,我们应该尝试将项目分解为小型工作区/堆栈,并使用基于角色的访问控制(RBAC)对它们进行分段访问。
 

Terraform 最佳实践

在前面的部分中,我们讨论了一些通用的 IaC 最佳实践。我们根据组织结构和需求探索了一些优化 Terraform 代码的选项。这里我们将深入研究将 Terraform 代码提升到新水平的具体要点,希望能够为你和你的团队提供有关实验、研究和实施对您的用例有意义的实践的提示和指导。
 

使用远程状态

在去做一些尝试和试验的时候使用本地状态是可以的,高于此情况的内容都可以使用远程共享状态位置。为状态使用远程后端是您在团队中工作时应该采用的首要最佳实践之一。选择一个支持状态锁定的选项,以避免多人同时更改状态。将状态视为不可变,避免手动状态更改。确保有状态备份,以便在发生灾难时可以使用。对于某些后端(例如 AWS S3),可以启用版本控制以实现快速轻松的状态恢复。
 

使用现有的共享和社区模块

检查是否已经有合适的用例的模块,避免自己编写所需模块重复造轮子,这样就能节省许多时间。您可以检查 Terraform Registry [2] 以获取可用模块。Terraform 拥有庞大成熟的社区,用户还可以借助社区的力量解决问题。热心的用户也可以通过改进社区或报告问题来帮助社区。
 

导入现有基础设施

如果您接手了一个已有几年历史的项目,那么其基础设施的某些部分很可能是手动创建的。不用担心,您可以将现有基础设施导入Terraform 并避免从多个端点管理基础设施。
 

避免变量硬编码

请尽量避免对变量进行硬编码。想一想,将您直接分配的值定义为变量对将来的更改是否更有意义。更重要的是,确认是否可以在不进行显式设置的情况下通过数据源获取属性值。例如,不要从控制台查找 AWS 账户 ID 并将其在terraform.tfvars中设置为:

aws_account_id=”99999999999”

 

我们可以从数据源中获取账户 ID。

data "aws_caller_identity" "current" {}

locals {
    account_id = data.aws_caller_identity.current.account_id
}

 

始终格式化并验证

在 IaC 中长期一致性至关重要,Terraform 为我们提供了一些工具来帮助我们实现这一目标。请记住运行用terraform fmt和 用terraform validate以正确格式化代码并捕获错过的任何问题。理想情况下应该通过 CI/CD 流水线或 pre-commit hook 自动完成。
 

使用一致的命名规则

我们可以在网上找到许多有关 Terraform 代码命名规则的建议。最重要的不是规则本身,而是找到您的团队熟悉的规则,并共同努力使其保持一致。请参阅以下易于遵循的规则列表:

  • 在名称中使用下划线_作为分隔符并使用小写字母。

  • 资源名称中尽量不要重复资源类型。

  • 对于单值变量和属性,请使用单数名词。对于列表或地图,使用复数名词来表明它代表多个值。

  • 始终对变量和输出使用描述性名称,并记住包含说明。
     

在下一部分,我们将继续探讨更多使用 Terraform 管理 IaC 的最佳实践。
 

原文链接:
https://spacelift.io/blog/terraform-best-practices

参考链接:
1.https://developer.hashicorp.com/terraform/language/state/remote-state-data#alternative-ways-to-share-data-between-configurations

2.https://registry.terraform.io/browse/modules

 

与20个最佳实践提升Terraform工作流程|Part 1相似的内容:

20个最佳实践提升Terraform工作流程|Part 1

将 Terraform 管理laC的技能提升到一个新的水平。

20个最佳实践提升Terraform工作流程|Part 2

将 Terraform 管理 IaC 的技能提升到一个新的水平。

Spring Boot 编写 API 的 10条最佳实践

10 个最佳实践,让您像专业人士一样编写 Spring Boot API,并结合编码示例和解释: 1. RESTful API 设计原则: 清晰一致的资源命名:使用准确反映 API 管理的资源的名词(例如,/products、/users)。 @GetMapping("/products/{id}"

20个 Git 命令玩转版本控制

想要在团队中处理代码时有效协作并跟踪更改,版本控制发挥着至关重要的作用。Git 是一个版本控制系统,可以帮助开发人员跟踪修订、识别文件版本,并在必要的时候恢复旧版本。Git 对于有一定编程经验的用户来说虽然不算太难,但是想要玩转一些高级功能也并不是件容易的事情。在这篇文章中,我将向你展示一些最实用的

[转帖]《Linux性能优化实战》笔记(二)—— CPU 上下文切换(上)

上一篇的最后一个例子,在多个进程竞争CPU时,我们看到每个进程实际上%usr部分只有20%多,70%多是在wait,但是load远远高于单个进程使用CPU达到100%。 这让我想到之前看的RWP公开课,里面有一篇连接池管理。为什么相同的业务量,起6千个连接(进程)远远要慢于200个连接,因为绝大多数

acme.sh的简单学习过程

acme.sh的简单学习过程 背景 公司内部测试环境为了节约费用(不要学我) 自己花十块到一百块之前从腾讯云购买一个域名 然后使用NDSPOD进行解析内网IP地址 偶尔需要申请临时证书进行HTTPS的验证. 但是免费的证书最多20个. 然后想了下就想试试acme.sh进行免费证书的申请 注意: 本方

我们从 CircleCI 安全事件获得的3个经验教训

CircleCI 作为业内最受欢迎的 CI/CD 平台提供商之一,有超过20万个 DevOps 团队使用其平台。该公司在今年1月在其官网报告了一起安全事件引起客户恐慌。在此事件中,有身份不明的恶意攻击者入侵了一名员工的笔记本电脑,利用恶意软件窃取了员工的 2FA 支持的单点登陆会话 cookie,使

[转帖]警惕Oracle数据库性能“隐形杀手”——Direct Path Read

一、 简介 Oracle 的11g版本正式发布到今天已经10年有余,最新版本也已经到了20c,但是Direct Path Read(直接路径读)导致性能问题的案例仍时有发生,很多12c的用户还是经常遇到这个问题,所以有必要把这个事情再跟大家讲一遍,通过2个典型案例加深理解。 早在2012年,盖国强大

Python 潮流周刊#56:NumPy 2.0 里更快速的字符串函数(摘要)

本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 本期周刊分享了 12 篇文章,12 个开源项目,赠书 5 本,全文 2100 字。

20个Golang片段让我不再健忘

本文使用代码片段的形式来解释在 go 语言开发中经常遇到的小功能点,由于本人主要使用 java 开发,因此会与其作比较,希望对大家有所帮助。