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

news2024/12/29 9:37:07

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1019120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达观RPA实战-自定义控件创建excel表头

一、应用背景 工作中我们经常会对excel文件进行操作,比如获取表格数据后,需要在空白excel文件中先写入表头,在逐行写入数据。如果每次都需要在流程中进行表头的写入,流程会看起来很臃肿。此时,我们可以充分利用达观RPA中自定义控件来创建一个。后续涉及到写excel表数据,…

Sqilte3初步教程

文章目录 安装创建数据库创建和删除表插入行数据 安装 Windows下安装,首先到下载页面,下载Windows安装软件,一般是 sqlite-dll-win32-*.zip sqlite-tools-win32-*.zip下载之后将 其内容解压到同一个文件夹下,我把它们都放在了D…

儿童用白炽灯和护眼灯哪个好一点?适合儿童使用的台灯推荐

现今的近视已然成为普遍现象,而且有往低年龄段发展的趋势。对孩子来说,日常孩子在家里抹黑看书,晚上看手机不开灯等习惯,都会导致眼睛受损,继而引发近视。所以给孩子挑选一款合适的台灯还是很重要的!那么儿…

LeetCode 1159.市场分析2

数据准备 Create table If Not Exists Users (user_id int, join_date date, favorite_brand varchar(10)); Create table If Not Exists Orders (order_id int, order_date date, item_id int, buyer_id int, seller_id int); Create table If Not Exists Items (item_id int…

面试官问你前端性能优化时,他想问什么?

一直以来,前端性能优化都是面试过程中考察的热点题目。 相关的技术博客也层不出穷,我们总是能找到很多这样的文章, 从一个应用的各个层面开始分析,优化的种种手段,取得的种种效果。 往往篇幅越长,讲得越…

jQuery 框架学习笔记(基础)

What jQuery 是一种快速、简洁跨游览器的 JavaScript 函数库,其宗旨是“Write less, Do more”,它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。 注意&…

浏览器清除所有断点

浏览器清除所有断点 问题分析 问题 谷歌浏览器清除所有断点 分析 在打断点的 Source 栏下 1、右键Breakpoints下的内容。 2、弹出选项,点击remove all breakpoints。

MySQL常用函数集锦 --- 字符串|数值|日期|流程函数总结

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 目录 一、字符…

请问一下就是业务概念模型和业务逻辑模型有啥关系

请问一下就是业务概念模型和业务逻辑模型有啥关系? 业务概念模型和业务逻辑模型是业务建模的两个关键组成部分,两者密切相关但又有所不同。 1.业务概念模型:这是对业务术语、定义和关系的一种抽象表示。它是从业务专家那里获得的知识&#…

ES6的代理模式 | Proxy

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 正文 语法 Handler 对象常用的方法 handler.get 可撤消的Proxy Proxy的应用场景 校验器 私有属性 为什么要…

nacos安装和入门

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 一、Nacos在mac环境的服务搭建 1、首先进入Nacos官网,链接 2、点击前往Github,点击红色链接。 3、选择相应版本下载。 4、下载之后解压。 5、在终端执行以下命令启动Nacos…

为什么 InfiniBand 网络在高性能计算数据中心如此重要?

随着数据分析和机器学习等高数据吞吐量应用的快速扩展,对高带宽和低延迟互连的需求也扩展到更广阔的市场。为更好应对这一需求,越来越多的高性能计算数据中心选择采用InfiniBand技术。相较于以太网,InfiniBand是一种专为高速互连而设计的网络…

使用jupyter运行sympy库

1.首先下载sympy插件: (1)在下图这里输入cmd (2)pip install sympy 若出现不信任此资源错误,改成pip install sympy--trusted-host pypi.tuna.tsinghua.edu.cn (3)检查是否安装成功 python import sympy sympy.__version__&#…

PCB走线规则

1、线间距。 这里应该遵循3W规则,所谓3W就是为了减少线间串扰,应保证线间距足够大,当线中心不少于3倍线宽,则可 保持70%的电场不互相干扰。如要达到98%的电场不互相干扰,可使用10W的间距。——这是查阅华为PCB布线规则…

UDP与TCP报头介绍,三次握手与四次挥手详谈

先介绍我们UDP/TCP协议缓冲区 在UDP和TCP在数据传输和介绍时有有缓冲区概念的。 UDP缓冲区 UDP没有真正意义上的 发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后 续的传输动作; UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序…

repmgr管理pg高可用

repmgr用于管理 PostgreSQL 服务器集群内的复制和故障转移,类似dg-broker,可以实现swichover和failover。 整体架构 repmgr架构图如下: 每个节点都可通过 repmgrd 守护进程来监控节点数据库状态;每个节点元数据表可独立维护&…

Stream流处理快速上手最佳实践 | 京东物流技术团队

一 引言 JAVA1.8得益于Lambda所带来的函数式编程,引入了一个全新的Stream流概念Stream流式思想类似于工厂车间的“生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工处理。Stream可以看作是流水线上的一个工…

深度解析NLP文本摘要技术:定义、应用与PyTorch实战

目录 1. 概述1.1 什么是文本摘要?1.2 为什么需要文本摘要? 2. 发展历程2.1 早期技术2.2 统计方法的崛起2.3 深度学习的应用2.4 文本摘要的演变趋势 3. 主要任务3.1 单文档摘要3.2 多文档摘要3.3 信息性摘要 vs. 背景摘要3.4 实时摘要 4. 主要类型4.1 抽取…

【Linux进行时】进程状态

进程状态: ❓假设我们在上课,在B站上上课,请问我们的B站是不是一直运行呢?💡不是的! ❓假设我们同时打开了B站和PDF阅读器时,是怎么运行的呢? 💡每一个进程在CPU跑一会&a…

Layui快速入门之第十三节 日期与时间选择器

目录 一:基本用法 API 渲染 属性 弹出提示 2.8 获取实例 2.8 解除实例绑定 2.8 关闭日期面板 2.7 获取某月的最后一天 二:常规用法 三:多类型选择器 四:范围选择 五:直接静态显示 六:更多功能…