提升Terraform工作流程最佳实践

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

在本篇文章中,我们将讨论使用 Terraform 管理 IaC 的最佳实践,帮助您将 Terraform 技能提升到一个新的水平 。

如何构建 Terraform 项目

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

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

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

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

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

常见的做法是根据所有权和责任、变更率和管理难易程度来分离模块。对于每个模块,我们需要定义其输入和输出并彻底记录它们,以便使用者能够有效地使用它们。然后,我们可以利用outputs和terraform_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 代码命名规则的建议。最重要的不是规则本身,而是找到您的团队熟悉的规则,并共同努力使其保持一致。请参阅以下易于遵循的规则列表:

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何压缩视频?5种超简单的方法!

用视频来记录生活和重要信息变得越来越广泛,比如用手机拍摄美好瞬间、对线上会议或课堂的内容进行视频录制、保存各种精彩的电影文件、社交媒体上分享美好生活,但是由于视频本身包含的信息很多以及拍摄设备的进步,文件越来越大,占…

08 Php学习:iff语句、Switch语句

PHP 条件语句 当您编写代码时,您常常需要为不同的判断执行不同的动作。您可以在代码中使用条件语句来完成此任务。 在 PHP 中,提供了下列条件语句: if 语句 - 在条件成立时执行代码 if…else 语句 - 在条件成立时执行一块代码,…

FreeRTOS任务切换学习

FreeRTOS任务切换学习 所谓任务切换,就是CPU寄存器的切换。假设当由任务A切换到任务B时,主要分为两步: 1:需暂停任务A的执行,并将此时任务A的寄存器保存到任务堆栈,这个过程叫做保存现场; 2&am…

【STL】list

目录 1. list的使用 1.1 list的构造 1.2 list iterator的使用 1.3 list capacity 1.4 list element access 1.5 list modifiers 1.6 list的迭代器失效 2. list的模拟实现 3. list与vector的对比 1. list的使用 1.1 list的构造 1.2 list iterator的使用 1. begin与end为…

雨污管网开挖深度的计算

一般的管网工程都有纵断面设计图,结合纵断面里的 管内底埋深-管厚度(直径0.6管厚0.06,直径0.8承插管直径0.08厚) - 砂砾石基础一般0.15厚 - 路面结构层厚度就是沟槽开挖深度了,是不是很简单。 管内底埋深其实就是管内流水面到设计路面顶的高…

PyCharm+PyQt5配置方法

一、前言 PyQt5PyQt5是一套Python绑定Digia QT5应用的框架。Qt库是最强大的GUI库之一PyQt5-toolsPyQt5中没有提供常用的Qt工具,比如图形界面开发工具Qt Designer,PyQt5-tools中包含了一系列常用工具Qt Designer可以通过Qt Designer来编写UI界面&#xf…

Docker快速上手及常用命令速查

Docker快速上手 安装 在ubuntu上安装docker: sudo apt-get install docker docker -v #查看版本在centos7上安装docker:(docker在YUM源的Extras仓库中) yum install docker systemctl start dockerdocker常用命令速查 #查看docker信息 docker info #查看本地镜…

网络基础三——其他周边问题

3.1ARP原理 ​ ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议; ​ 以广播的形式(主机号填成全1)构建Mac帧,发送ARP请求包,告诉所有在局域网的主机我的IP地址和Mac帧,与目的IP相同的主…

[lesson16]类的真正形态

类的真正形态 类的关键字 struct在C语言中以及有了自己的含义,必须继续兼容 在C中提供了新的关键字class用于类的定义 class和struct的用法是完全相同的 在用struct定义类时,所有成员的默认访问级别为public 在用class定义类时,所有成员…

Leetcode算法训练日记 | day22

一、二叉搜索树的最近公共祖先 1.题目 Leetcode:第 235 题 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足…

liunx环境变量学习总结

环境变量 在操作系统中,环境变量是一种特殊的变量,它们为运行的进程提供全局配置信息和系统环境设定。本文将介绍如何自定义、删除环境变量,特别是对重要环境变量PATH的管理和定制,以及与环境变量相关的函数使用。 自定义环境变…

【复现】用友NC-Cloud文件上传漏洞_70

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 用友NC Cloud大型企业数字化平台,深度应用新一代数字智能技术,完全基于云原生架构,打造开放、…

MySQL进阶之(七)EXPLAIN 详解

七、EXPLAIN 详解 7.1 查询性能那些事7.1.1 查看系统性能参数7.1.2 统计 SQL 的查询成本7.1.3 定位执行慢的 SQL:慢查询日志01、开启慢查询日志参数02、关闭慢查询日志03、删除慢查询日志 7.1.4 查看 SQL 执行成本:SHOW PROFILE 7.2 EXPLAIN 语句输出中各…

pyqt5 QScrollArea组件

本示例中,演示了QScrollArea的使用,以及QScrollBar的样式设定,在代码中使用setStyleSheet设置样式,记得要优先设置scrollArea,再设置窗口的样式,不然QScrollBar的样式会不起作用,使用QSS设置没有…

SGD随机梯度下降

一、补充概念: 目标函数(Objective Function):这个术语通常指的是整个优化问题中需要最小化(或最大化)的函数。在机器学习和优化中,目标函数可以包括损失函数以及正则化项等。目标函数的最优化过…

Python程序设计 列表

教学案例八 列表 1. 计算并显示斐波那契数列 输入n,计算并显示斐波那契数列前n项.一行打印5项,每项显示宽度为6 什么是斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列、 因数学家莱昂纳多斐波那契&#xff…

基于SSM+Jsp+Mysql的农产品供销服务系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

windows系统安装mysql5.7

1、下载 下载路径:https://downloads.mysql.com/archives/community/ 2、创建配置文件my.ini 下载压缩包解压到安装目录(本机解压后在D:\mysql-5.7.44-winx64) 在bin的同级目录下创建my.ini文件 my.ini文件 [mysql] # 设置mysql客户端默认字符…

接口自动化测试(python+pytest+requests)

一、选取自动化测试用例 优先级高:先实现业务流程用例、后实现单接口用例功能较稳定的接口优先开展测试用例脚本的实现二、搭建自动化测试环境 核心技术:编程语言:python;测试框架:pytest;接口请求:requests安装/验证requests:命令行终端分别输入 pip install requests / p…

6.1Python之字典的初识

【1】字典的创建与价值 字典(Dictionary)是一种在Python中用于存储和组织数据的数据结构。元素由键和对应的值组成。其中,键(Key)必须是唯一的,而值(Value)则可以是任意类型的数据。…