terraform-state詳解

一、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…