全部產品
Search
文件中心

Terraform:Terraform State

更新時間:Aug 06, 2025

什麼是 Terraform State

Terraform State 是指 Terraform 狀態,是 Terraform 生命週期過程中必不可少的元素。本質上講,Terraform 狀態是你的基礎設施配置的中繼資料存放區庫,Terraform 把它管理的資源狀態儲存在一個狀態檔案中。

預設情況下,狀態儲存在一個名為 “terraform.tfstate” 的檔案中,但也可以遠程儲存,在團隊協作管理基礎設施的情境下,推薦採用遠程儲存。

Terraform 使用狀態來建立執行計畫並更改您的基礎設施。在任何操作之前,Terraform 會執行重新整理操作以用基礎設施的實際狀態來更新狀態。Terraform 狀態的主要目的是儲存遠端系統(如雲上)中的基礎設施對象和設定檔中聲明的資源執行個體之間的綁定關係,當 Terraform 通過設定檔建立或者更改了遠端對象時,它會將該遠端對象的標識記錄在與之對應的資源執行個體中,並儲存在狀態檔案中,之後,Terraform 可能會根據未來的配置更改更新或刪除該對象。

每個在資源塊中建立的基礎設施資源都是通過其resource_name在 Terraform 狀態中進行標識的,其對資源的管理流程大致如下:

  • 當第一次通過 terraform apply 應用 Terraform 配置時,會建立基礎設施資源,同時自動產生一個狀態檔案,該檔案引用資源塊中聲明的名稱

  • 如果一個資源已經在 Terraform 狀態檔案中有標識,那麼 Terraform 會將設定檔與狀態檔案和當前的資源遠端的實際狀態進行比較,並根據比較結果,會產生一個執行計畫

  • 當執行該計劃時,它會更新資源的狀態以匹配設定檔中的定義,如果由於遠端 API 限制無法實現就地更新參數,那麼該執行計畫將會先銷毀資源,然後再重新建立新的資源;如果是一個資源銷毀的計劃,將發起資源的銷毀操作

  • 計劃執行成功後,Terraform 狀態檔案會更新以反映當前的基礎設施狀態

  • 如果某資源已從當前 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 包括多種配置存取權限的方法,因此你可以以精細化的方式控制狀態檔案的存取權限。

配置遠端狀態儲存

阿里雲基於 OSS Bucket 提供了遠端狀態儲存的能力,同時利用Table Store 支援了遠端狀態檔案的加鎖能力,因此在配置遠端狀態儲存之前,首先需要準備好用於狀態檔案儲存體的 OSS Bucket 和 OTS 執行個體。我們展示如何在雲端儲存桶中遠程儲存 Terraform 狀態:

  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 Module

以下是來自 OSS Bucket 的狀態檔案片段:

{
  "version": 4,
  "terraform_version": "1.7.1",
  "serial": 9,
  "lineage": "5827f172-fc29-c293-cce7-7932f3537499",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "alicloud_oss_bucket",
      "name": "this",
      "provider": "provider[\"registry.terraform.io/hashicorp/alicloud\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "access_monitor": [
              {
                "status": "Disabled"
              }
            ],
            "acl": "private",
            "bucket": "tf-oss-backend-for-demo",

狀態包括了建立的資源的中繼資料,例如資源類型、資源名稱和供應商名稱等。

Terraform State 的最佳實務

針對 Terraform 狀態檔案,我們從狀態最佳化和安全性方面給出如下建議:

  1. 團隊協作情境使用遠端狀態

    首先,在團隊協作情境中應使用遠程狀態,以便鎖定和版本控制狀態檔案。阿里雲的客戶應使用 OSS 作為遠端狀態儲存後端,並使用 OTS 來鎖定狀態檔案。將敏感資訊與 Terraform 設定檔的版本控制分開,並確保只有構建系統和高許可權管理員可以訪問遠程狀態儲存 Bucket。為了防止意外地將開發環境的狀態檔案提交到原始碼版本控制系統中(如Github,Gitlab等),請為 Terraform 狀態檔案配置 gitignore。

  2. 不要在狀態中儲存敏感性資料

    許多資源和資料提供者會將敏感性資料以明文形式儲存在狀態檔案中,這是存在安全隱患的。如果可能,盡量避免在狀態檔案中儲存敏感資訊。

  3. 對狀態進行加密

    增加一層防禦,始終對遠端狀態檔案進行加密。阿里雲 OSS 儲存支援 KMS、AES256、SM4 三種加密方式的,客戶可以通過自訂的 KMS 金鑰組狀態檔案提供額外一層保護。

  4. 不要手動修改 Terraform 狀態

    狀態檔案是維護 Terraform 配置和阿里雲基礎設施資源之間的映射關係的關鍵,狀態檔案的損壞可能導致重大的基礎設施問題。因此不要嘗試手動修改 Terraform 狀態檔案內容。