如何有效检测、识别和管理 Terraform 配置漂移?

作者|Krishnadutt Panchagnula
翻译|Seal软件
链接|https://betterprogramming.pub/detecting-identifying-and-managing-terraform-state-drift-997366a74537

 

在理想的 IaC 世界中,我们所有的基础设施实现和更新都是通过将更新的代码推送到 GitHub 来编写和实现的,这将触发 Jenkins 或 Circle-Ci 中的 CI/CD 流水线,并且这些更改会反映在我们常用的公有云中。但现实并没有这么顺利,原因可能有很多,例如:
 

  • 公司仍处于云自动化的初级阶段;

  • 不同团队中的多个利益相关者正在通过控制台开发概念验证;

  • 引入临时手动热修复以稳定当前生产;

  • 用户并不知道 IaC 工具。
     

鉴于这些原因,系统中引入了不同类别的漂移,每种类别都有自己的补救措施。本文介绍了 Terraform 漂移、其类别、修复策略以及监测 Terraform 漂移的工具。为了更好地理解这些概念,我们将会带你探究什么是 Terraform 漂移以及在 Terraform 中如何检测这种漂移。
 

什么是 Terraform 漂移?

当我们使用 Terraform 创建资源(即 terraform apply)时,它会存储有关当前基础设施的信息,本地或远程支持在名为 terraform.tfstate 。随后 terraform apply 将根据基础设施的当前状态进行更新。但是,当我们通过控制台或 CLI 进行手动更改时,这些更改会应用到云环境中,但不会在状态文件中看到。
 

Terraform 漂移可以理解为从 Terraform 中定义的基础设施的实际状态与云环境中存在的基础设施状态观察到的漂移/差异。

 


 

在上述几种情况下,在 Terraform 代码之外进行基础架构更改都会导致 Terraform 状态文件的状态与云环境的状态截然不同。因此,当我们下次应用 Terraform 代码时,我们会发现 Terraform 漂移,这可能会导致 Terraform 资源更改或销毁。因此,了解不同类型的漂移如何渗透到我们的基础设施中可以帮助我们有效减轻此类风险。
 

漂移类型

我们可以将 Terraform 配置漂移分为三类:
 

  • Emergent drift —— 在 Terraform 生态系统之外进行基础设施更改时观察到的漂移,该生态系统最初是通过 Terraform 应用的(因此它们的状态存在于 Terraform 状态文件中)。

  • Pseudo drift —— 由于列表中的订购项目和其他提供商的特性而在计划/应用周期中看到的“变化”。

  • Introduced drift —— 在 Terraform 之外创建的新基础设施。
     

不过关于引入漂移(Introduced drift)是否应当被考虑进来一直存在争议,因为基础设施完全是通过控制台设置的。但使用 Terraform 是通过代码完全自动化基础设施流程,因此任何包含手动创建的基础设施都被认为是配置漂移。
 

管理 Emergent Drift

如前所述,当 Terraform 应用和管理的基础设施在 Terraform 生态系统之外进行修改时,会观察到浮现漂移(Emergent Drift)。这时我们可以根据习惯的首选状态进行管理:
 

  • 基础设施状态:如果我们的首选状态是云中的状态,那么可以更改 Terraform 配置图(通常是main.tf文件)及其依赖模块,以便下次运行时 terraform apply配置文件和 Terraform 状态文件同步。
     

  • 配置状态:如果我们的首选状态是配置文件中的状态,我们只需使用配置文件运行 terraform apply 即可。这将取消云中的所有更改并应用 Terraform 配置文件中的配置。
     

管理 Pseudo Drift

当配置文件中某些资源或资源的某些参数的顺序与状态文件中不同时,这就是伪漂移(Pseudo Drift)了。这种漂移并不常见。为了更好地理解这一点,我们以创建多可用区 RDS 为例。
 

resource "aws_db_instance" "default" {allocated_storage = 10engine = "mysql"engine_version = "5.7"instance_class = "db.t3.micro"availability_zone = ["us-east-1b","us-east-1c","us-east-1a"]# Us-east -1a was added latername = "mydb"username = "foo"password = "foobarbaz"parameter_group_name = "default.mysql5.7"skip_final_snapshot = true
}

 

起初我们只需要 east-1b 和 1c,但后来添加了 1a。当我们应用此配置时,它运行成功。作为细心的 SRE 工程师,我们通过运行terraform plan来确认一切都是正常进行的。但惊讶的是,我们可能会看到它通过“availability zone”行的更改再次添加此资源。当我们再次应用此更改时,此更改日志可以在后续生命周期terraform apply中显示。
 

为了便于管理,我们应该运行terraform show来显示当前的状态文件。找到可用区参数并查看这些参数作为列表传递的顺序,将这些值复制到 Terraform 配置文件中。
 

管理 Introduced Drift

当在云上的 Terraform 生态系统之外配置新基础设施时,就会出现引入漂移。这是最可怕的漂移类型,由于 Terraform 状态文件中没有跟踪这些变化,因此需要工程师们认真努力地进行检测和处理。引入漂移很难检测,需要通过控制台查看每个资源、读取云监视日志、检查计费控制台或向完成此更改的人询问确认。当我们运行terraform destroy时,某些资源无法销毁,也会发生这种情况。
 

如果我们可以识别手动配置的资源,则根据其所在的环境有两种方法进行处理:
 

  • 重新配置:如果资源不在生产级环境中,建议销毁该资源,然后在 Terraform 配置文件中为其创建一个模块。这样,基础设施就可以通过 Terraform 状态文件进行记录、跟踪和监控,并且所有资源都是通过 Terraform 创建的。

  • Terraform 导入:如果资源存在于生产级环境中,则很难重新创建它。在本例中,我们使用“terraform import”导入资源。Terraform 导入帮助我们为相关资源创建 Terraform HCL 代码。获得此资源后,我们可以将此代码复制到 Terraform 配置文件中,应用该文件后,将使用与云中存在的状态相同的配置来更新状态文件。
     

漂移识别和监控

只有当我们能够检测到存在漂移时,才能完成所有这些漂移管理。在浮现漂移和伪漂移的情况下,我们可以使用terraform plan命令来识别它们,该命令会将当前状态文件与云中的资源(之前使用 Terraform 创建)进行比较。但在引入漂移的情况下会失败,因为在 Terraform 生态系统之外创建的资源没有状态。因此,如果我们可以提前检测到这种漂移并通过 IaC 工具实现自动化那就再好不过了。这里我们列出了以下两种工具来提前检测引入漂移。
 

CloudQuery

如果您喜欢使用以数据为中心的方法和可视化仪表板,那么此解决方案很适合您。CloudQuery 是一个开源工具,它将状态文件与我们所需的云提供商中的资源进行比较,然后格式化该数据并将其加载到 PostgreSQL 数据库中。由于漂移检测命令是在 PostgreSQL 之上创建的,并且具有托管或非托管列,因此我们可以使用此标志作为筛选器,在我们最喜欢的仪表板解决方案(例如 Tableau 或 Power BI)中进行可视化,以监控基础设施状态漂移。
 

有关更多信息,请参阅 https://www.cloudquery.io/docs/cli/commands/cloudquery。
 

providers:# provider configurations- name: awsconfiguration:accounts:- id: <UNIQUE ACCOUNT IDENTIFIER># Optional. Role ARN we want to assume when accessing this account# role_arn: < YOUR_ROLE_ARN ># Named profile in config or credential file from where CQ should grab credentialslocal_profile = default# By default assumes all regionsregions:- us-east-1- us-west-2# The maximum number of times that a request will be retried for failures.max_retries: 5# The maximum back off delay between attempts. The backoff delays exponentially with a jitter based on the number of attempts. Defaults to 30 seconds.max_backoff: 20## list of resources to fetchresources:- "*"

 

Driftctl

如果您偏向使用终端的 CLI,那么 DriftCtl 很适合您。该工具可以帮助我们跟踪和检测单个命令可能发生的托管和非托管漂移。
 


 

由于这是一个基于 CLI 的工具,因此可以轻松集成到 Jenkins 管道中编写的 CI/CD 流水线中,并且结果可以作为输出推送到 GitHub 中的 PR。如果你对这款工具不感兴趣,请将其作为系统中的 cron 作业运行。创建一个日志组来收集日志,然后使用日志监控解决方案(例如 Fleuentd 或 Prometheus/graphana 包)来进行可视化并创建警报解决方案。
 

了解更多工具相关信息,请阅读 https://docs.driftctl.com/0.35.0/installation
 

#to scan local file
driftctl scan
# To scan backend in AWS S3
driftctl scan --from tfstate+s3://my-bucket/path/to/state.tfstate

 

结 论

最后,我想就编写更好的代码和采用更优的编码实践总结几点我的思考:

  • 始终尝试构建自动化基础设施。即使您执行手动步骤,也请尝试将它们导入 Terraform 脚本,然后进行应用。
  • 渐进地、逐步地增加编写和应用的代码,避免一次性编写和应用超长代码。
  • 实施带有自定义警报系统的漂移跟踪系统,确保该系统将向 SRE 发送有关观察到的基础漂移的信息。
     

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCv之滤波器

目录 一、卷积 二、方盒滤波与均值滤波 三、高斯滤波 四、中值滤波 五、双边滤波 一、卷积 图像卷积就是卷积核在图像上按行华东遍历像素时不断的相乘求和的过程 相关知识点: 步长:就是卷积核在图像上移动的步幅.(为充分扫描图片&#xff0c;步长一般为1)padding:指在图片…

【C语言进阶(九)】常见内存错误以及柔性数组

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 常见内存错误 1. 前言2. 对NULL指针…

【C++】list的使用

今天我们来进入到C另一个容器list的学习 目录 一、list的介绍 二、list的使用 2.1 构造函数 2.2 迭代器函数接口 2.3 容量函数接口 2.4 元素访问函数接口 2.5 常用修改函数接口 2.6 常用操作函数接口 一、list的介绍 文档介绍&#xff1a;list - C Reference (cpluspl…

html+JavaScript实现一个好看的颜色码查询器,支持查询、转换、颜色选择器和颜色码对照表

前言 相信大家平时工作的时候应该会经常用到颜色码吧&#xff0c;比如说想找个好看的颜色&#xff0c;或者有个颜色码但是不知道这个码是什么颜色的&#xff0c;这个时候我们就可以用颜色码对照表或者颜色码查询来查看了。 当然也可以用截图软件或者取色器或者PS来查看&#…

安卓设备监听全部输入信号

前言&#xff1a; 最近团队收到一个产品需求&#xff0c;需要监听安卓设备上用户是否有输入行为&#xff0c;以免定制推荐的时候打搅到用户。这里指的是设备上所有应用的输入行为&#xff0c;而不是单指某一个应用。 这个需求还是蛮有挑战性的&#xff0c;需要涉及到很多FW层…

vue新增删除内容排序问题解决处理

本次答题选项的删除添加是个人最初比较头疼的地方。比如ABCD四个选项&#xff0c;删除c选项后&#xff0c;点击【新增答题类型】选项按钮&#xff0c;则默认创建是E选项。再或者就是ABCD四个选项位置删除任意一个后&#xff0c;顺序被打乱等&#xff0c;最后解决了&#xff0c;…

【状态估计】基于UKF法、AUKF法的电力系统三相状态估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【项目 进程2】2.3 进程创建 2.4父子进程虚拟地址空间 2.5GDB多进程调试

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 2.3 进程创建2.4 父子进程虚拟地址空间父子进程之间的关系&#xff1a; 2.5 GDB多进程调试 2.3 进程创建 系统允许一个进程创建新进程&#xff0c;新进程即为子进程…

Vue2 ➔ Vue3 都做了哪些改变?

不是吧&#xff0c;兄弟&#xff0c;Vue3 都出来多久了&#xff0c;你还对这个感兴趣&#xff0c;说&#xff01;是不是没好好卷&#xff1f;&#x1f60f; 俺也一样 &#x1f602;&#xff0c;Vue3 出来之后只是简单了解了一下&#xff0c;然后还是转头一直在写 Vue2。当然&a…

基于weka手工实现多层感知机(BPNet)

一、BP网络 1.1 单层感知机 单层感知机&#xff0c;就是只有一层神经元&#xff0c;它的模型结构如下1&#xff1a; 对于权重 w w w的更新&#xff0c;我们采用如下公式&#xff1a; w i w i Δ w i Δ w i η ( y − y ^ ) x i (1) w_iw_i\Delta w_i \\ \Delta w_i\eta(y…

Maven —— 项目管理工具

前言 在这篇文章中&#xff0c;荔枝会介绍如何在项目工程中借助Maven的力量来开发&#xff0c;主要涉及Maven的下载安装、环境变量的配置、IDEA中的Maven的路径配置和信息修改以及通过Maven来快速构建项目。希望能对需要配置的小伙伴们有帮助哈哈哈哈~~~ 文章目录 前言 一、初…

设计模式-组合模式在Java中的使用示例-杀毒软件针对文件和文件夹进行杀毒

场景 组合模式 组合模式(Composite Pattern)&#xff1a; 组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。 组合模式对单个对象&#xff08;即叶子对象&#xff09;和组合对象&#xff08;即容器对象&#xff09;的使用具有一致性&#xff0c; 组合模式…