一、Treeaform-state的作用

Terraform-state是指Terroform的状态,是terraform不可缺少的生命周期元素。本质上来讲,terraform状态是你的基础设施配置的元数据存储库,terraform会把它管理的资源状态保存在一个状态文件里。

默认情况下,状态保存在一个

名为terraform.tfstate的文件中,但也可以远程存储,在团队协作管理的基础设施场景下,推荐采用远程存储。

terraform 使用状态来创建执行计划并更改基础设施,在任何操作之前,terraform会执行刷新操作以用基础设施的实际状态来更新状态。terraform的状态的主要目的是存储在远端系统上(主要存储在对象存储中)和配置文件中声明的资源实例之间的绑定关系。当terraform通过配置文件创建或更改了远端对象时,它会将该远端对象存储的表示记录与之对应的资源实例中,并保存在状态文件中,之后,terraform会根据实际情况来更新或者删除资源。

在这里插入图片描述

每个资源块中常见的基础设施资源都是通过其resource_name在terraform状态中标识的,其对资源的管理流程大致如下;

  1. 当第一次通过terraform apply应用terraform配置时,会创建基础设施资源,同时自动生成一个状态文件,该文件引用资源块中声明的名称。
  2. 如果一个资源已经在terraform状态文件中有标识,那么terraform会将配置文件与状态文件和当前资源远端的实际状态进行比较,并根据比较结果,会生成一个执行计划。
  3. 当执行计划时,他会更新资源的状态以匹配配置文件中的定义,如果远端api限制无法实现就地更新参数,那么执行该计划会将先销毁资源,然后再重新创建资源,如果是一个销毁资源的计划,将发起资源的销毁操作
  4. 计划执行成功后,terraform状态文件会更新以反映当前的基础设施状态
  5. 如果某资源已从当前terraform配置中移除但是状态文件中仍然存在,terraform则会比较配置文件并销毁不存在的资源

二、存储terraform state

terraform 默认将本地状态文件保存在当前工作目录中,扩展名为.tfstate,因此他们不需要额外的维护。本地状态文件适用于只有一个开发人员的项目,当多个开发人员同时运行terraform并且每台机器都有对当前基础设施的理解和配置时,默认的本地配置文件就不适合了。

在团队协作开发场景中使用本地状态时主要存在以下几个问题:

  1. 本地状态没有共享访问权限
    当使用 Terraform 更新你的基础设施,团队中的每个成员都需要访问相同的状态文件,这意味着这些文件必须存储在一个共享的位置,比如 ECS 实例特定的位置,而这无形中增加了管理成本。
  2. 不能锁定本地状态文件
    如果两个团队成员同时运行 Terraform,他们可能会遇到竞争条件,因为多个 Terraform 进程可能同时在更新状态文件。在这种情况下,可能带来导致冲突、数据丢失和状态文件损坏等风险。
  3. 本地状态文件不保密
    当信息以明文形式存储在状态文件中时,敏感数据将存在被暴露的风险,例如数据库凭证,SSH 登录密码等。

因此,当一个团队中有多个开发人员通过编写代码来管理基础设施时,我们推荐你应该将状态文件存储在一个远端的中心位置。这样,当基础设施发生变化时,Terraform 状态文件会更新并同步,团队中的所有人员将始终使用最新的基础设施状态。

面对本地状态存在的问题,当使用远端状态存储时,这些问题将会得到解决:

  1. 远端状态文件会自动更新
    当远程存储时,状态文件会自动更新,即一旦配置了远程后端,每次运行 plan 或 apply 命令时,Terraform 将自动从远端加载状态文件。除此之外,它还会在每次 apply 后自动将状态文件同步存储在远端中,因此不存在手动错误的情况。
  2. 远端状态文件支持状态锁定
    当执行 Terraform 命令时,可以对远端状态文件进行加锁,这样如果多个开发人员同时运行 terraform apply,它不会因同时更新而损坏。
  3. 远端状态文件存储比本地存储更安全
    OSS Bucket 支持本地传输加密和远端加密功能。此外,OSS Bucket 包括多种配置访问权限的方法,因此你可以以精细化的方式控制状态文件的访问权限。

三、配置远端状态存储

  1. 创建远端状态所依赖的资源
    首先,将 alicloud_oss_bucket,alicloud_ots_instance,alicloud_ots_table 资源添加到 Terraform 配置文件中,例如 main.tf,并按照自身的需求对资源进行配置,如设置 Bucket 名称,OTS 实例名称,实例规格,表格名称等。完成配置后,运行 terraform apply 来创建 Bucket 以及其他资源。
  2. 配置远端状态
    接下来,将代码配置添加到一个名为 backend.tf 的新 Terraform 配置文件中,接着运行 terraform init 来配置你的 Terraform 远端状态。此时,Terraform 检测到本地已经有一个状态文件,并提示你将其复制到新的 OSS Bucket 中。输入 yes,terraform init 运行成功后,你的 Terraform 状态将存储在 OSS Bucket 中。

四、Terraform State 的最佳实践

针对 Terraform 状态文件,我们从状态优化和安全性方面给出如下建议:

  1. 团队协作场景使用远端状态
    首先,在团队协作场景中应使用远程状态,以便锁定和版本控制状态文件。阿里云的客户应使用 OSS 作为远端状态存储后端,并使用 OTS 来锁定状态文件。将敏感信息与 Terraform 配置文件的版本控制分开,并确保只有构建系统和高权限管理员可以访问远程状态存储 Bucket。为了防止意外地将开发环境的状态文件提交到源代码版本控制系统中(如Github,Gitlab等),请为 Terraform 状态文件配置 gitignore。
  2. 不要在状态中存储敏感数据
    许多资源和数据提供者会将敏感数据以明文形式存储在状态文件中,这是存在安全隐患的。如果可能,尽量避免在状态文件中存储敏感信息。
  3. 对状态进行加密
    增加一层防御,始终对远端状态文件进行加密。阿里云 OSS 存储支持 KMS、AES256、SM4 三种加密方式的,客户可以通过自定义的 KMS 密钥对状态文件提供额外一层保护。
  4. 不要手动修改 Terraform 状态
    状态文件是维护 Terraform 配置和阿里云基础设施资源之间的映射关系的关键,状态文件的损坏可能导致重大的基础设施问题。因此不要尝试手动修改 Terraform 状态文件内容。

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

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

相关文章

四、kubernetes 1.29 之 Pod 生命周期

一、概述当容器与 pause 容器共享网络(Network)、IPC(进程间通信)和 PID(进程命名空间)后,二者形成了一种紧密的 "共享命名空间" 关系,共同构成了 Kubernetes 中 "Po…

AI与环保:礼貌用语背后的能源挑战与解决方案

程序员的技术管理推荐阅读 窄化效应:程序员与管理者的隐形情绪陷阱 从“激励”到“保健”:80后与90后程序员,到底想要什么? 从“激励”到“保健”:80后与90后程序员,到底想要什么? 场景引入&…

OpenCV C++ 特征提取:从角点检测到对象识别

特征提取是计算机视觉的核心技术,通过识别图像中具有代表性的关键点及其描述信息,实现图像匹配、对象识别、姿态估计等高级任务。本章将系统讲解从基础的图像金字塔、角点检测,到复杂的 ORB 和 SIFT 特征提取与匹配,最终实现基于特征的对象检测完整流程。 一、图像金字塔 …

Codeforces Round 1049 (Div. 2) D题题解记录

大致题意:给定nnn个区间(li,ri)(l_i,r_i)(li​,ri​)。每次选取两个尚未被标记的区间(l1,r1)(l_1,r_1)(l1​,r1​)与(l2,r2)(l_2,r_2)(l2​,r2​),使得他们均被标记,同时可以任选x∈[l1,r1],y∈[l2,r2]x\in[l_1,r_1],y…

《WINDOWS 环境下32位汇编语言程序设计》第15章 注册表和INI文件

15.1 注册表和INI文件简介在一个操作系统中,无论是操作系统本身还是运行于其中的大部分应用程序,都需要使用某种方式保存配置信息。在DOS系统中,配置信息往往是软件的开发者根据自己的喜好用各种途径加以保存的,比如在磁盘上面写一…

JDK 17、OpenJDK 17、Oracle JDK 17 的说明

Java生态系统的核心概念:简单来说:JDK 17 是一个标准规范,定义了Java开发工具包第17个长期支持版应该包含什么功能。openjdk-17-jdk 是一个具体的实现,是遵循上述规范、由OpenJDK社区提供的开源软件包。下面我们通过一个表格和详细…

手写MyBatis第58弹:如何优雅输出可执行的SQL语句--深入理解MyBatis日志机制:

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

Spring Boot 监控实战:集成 Prometheus 与 Grafana,打造全方位监控体系

前言 在当今微服务架构盛行的时代,应用程序的监控变得尤为重要。Spring Boot 作为广泛使用的微服务框架,其监控需求也日益增加。Prometheus 和 Grafana 作为开源监控领域的佼佼者,为 Spring Boot 应用提供了强大的监控能力。本文将详细介绍如…

JS中的多线程——Web Worker

众所周知,JavaScript 是单线程运行的(至于为什么是单线程可以看一下这篇文章——事件循环机制),当浏览器主线程被大量计算任务阻塞时,页面就会出现明显的卡顿现象。Web Worker 提供了在独立线程中运行 JavaScript 的能…

【SQL注入】延时盲注

sleep(n)​​: 核心延时函数。使数据库程序暂停 n秒。​​if(condition, true_expr, false_expr)​​: 条件判断函数。如果 condition为真,执行 true_expr,否则执行 false_expr。​​用于将延时与判断条件绑定​​。​​mid(a, b, c)​​: 字符串截取函数…

IntelliJ IDEA 2025.1 Java Stream Debugger 快速使用指南

1. 功能概览 Java Stream Debugger 提供 Trace Current Stream Chain 功能,用来在调试时分析和可视化 Stream 操作链。 主要用途: 在运行时查看流操作链的每一步输出找出 map/filter 等操作的问题避免手动加 peek() 打印调试2. 使用入口 在 IDEA 2025.1 …

ARM-指令集全解析:从基础到高阶应用

一、ARM 指令集体系结构版本ARM 公司定义了多个指令集版本:ARMv1:原型机 ARM1,没有用于商业产品。ARMv2:扩展 V1,包含 32 位乘法指令和协处理器指令。ARMv3:第一个微处理器 ARM6 核心,支持 Cach…

第3讲 机器学习入门指南

近年来,随着企业和个人生成的数据量呈指数级增长,机器学习已成为日益重要的技术领域。从自动驾驶汽车到流媒体平台的个性化推荐,机器学习算法已广泛应用于各个场景。让我们深入解析机器学习的核心要义。3.1 机器学习定义机器学习是人工智能的…

深入理解跳表:多层索引加速查找的经典实现

跳表(Skip List)是一种多层有序链表结构,通过引入多级索引加速查找,其核心设计类似于“立体高速公路系统”,底层是原始链表,上面有各种高度的"高架桥"。 高层道路跨度大,连接远方节点…

Flutter 视频播放器——flick_video_player 介绍与使用

在移动端应用中,视频播放是一个常见的功能场景,例如短视频、直播、课程、广告展示等。 Flutter 本身并没有直接提供视频播放器组件,而是依赖第三方库来实现。 今天要介绍的库是 flick_video_player,它基于 video_player 封装&…

编写cmakelists文件常用语句

cmake_minimum_required (VERSION 3.10) 指定最小版本project(XXXX) 指定项目名字 ---------------set(MAIN_EXEC_NAME dwarf_parser) 定义变量${ MAIN_EXEC_NAME } 变量取值set(CMAKE_CXX_STANDARD 14) 指定c14标准,还有11、17、20等标准…

麒麟桌面系统找不到mbr启动,并重新安装grub

根据你提供的情况,“麒麟桌面系统找不到MBR启动”,这通常是由于GRUB引导损坏、MBR记录丢失或分区表异常导致的。你可以按照以下步骤重新安装GRUB并修复MBR启动: ✅ 步骤一:准备工具 使用银河麒麟LiveCD或U盘启动盘(可用Ventoy制作); 启动电脑,选择从U盘或光盘进入Live环…

【音频字幕】构建一个离线视频字幕生成系统:使用 WhisperX 和 Faster-Whisper 的 Python 实现

一、背景介绍 对于一端没有字幕外国视频、字幕,在不懂外语的情况下,怎么获取相关内容?作为技术宅,怎么自建搭建一个语音转文字的环境当前AI技术这么发达? 试试 二、系统设计 音频提取(仅仅是视频需要该逻辑、本身就是音…

Linux ALSA架构:PCM_OPEN流程 (二)

一 应用端源码路径: external\tinyalsa\pcm.c external\tinyalsa\pcm_hw.cstruct pcm *pcm_open(unsigned int card, unsigned int device,unsigned int flags, struct pcm_config *config) {...pcm->ops &hw_ops;pcm->fd pcm->ops->open(card, device,…

tp5的tbmember表闭包查询 openid=‘abc‘ 并且(wx_unionid=null或者wx_unionid=‘‘)

闭包查询 tbmember表闭包查询查询 openid‘abc并且islose0并且islogout0并且(wx_unionidnull或者wx_unionid’) Db::table(tbmember)->where([openid>abc,islose>0,islogout>0])->where(function ($query){$query->where(wx_unioni…