手動配置和管理基礎架構可能是一個複雜且容易出錯的流程。值得慶幸的是,像 Terraform 這樣的工具已經出現,能夠使用基礎架構作為程式碼 (IaC)來簡化基礎架構的管理。
然而,為了充分利用 Terraform 的全部潛力,了解 Terraform 狀態至關重要。這種狀態在確保基礎架構配置一致,並實現跨團隊有效協作方面發揮著重要作用。
本文將探討什麼是 Terraform 狀態、其重要性,以及如何有效管理與操作狀態檔案。
什麼是 Terraform State?
Terraform 狀態是 Terraform 功能的關鍵要素。它可作為您使用 Terraform 管理的基礎架構的持久記錄,基本上是您的配置檔案(.tf)中定義的資源與其真實世界的對應圖。
Terraform State 如何運作
Terraform 會將狀態資訊儲存在檔案中,通常預設名稱為 terraform.tfstate。每當您執行 terraform apply 指令時,此檔案會自動更新。以下是流程的細項:
- 擷取目前狀態:在應用 terraform 期間,Terraform 會讀取基礎架構並擷取其目前狀態,包括資源屬性和配置。
- 比較州:Terraform 會將此擷取狀態與您的 Terraform 組態檔案中定義的所需狀態進行比較。
- 識別變更:Terraform 根據前一步驟的比較結果,找出想要與目前狀態之間的差異。
- 套用更新:若有差異,Terraform 會套用必要的更新,使基礎架構與您定義的配置一致。
使用 Terraform State 的優勢和重要性
維持一致且精確的 Terraform 狀態對於確保可靠的基礎架構管理至關重要。原因如下:
- 減少配置漂移:隨著時間的推移,基礎架構配置可能會因為手動變更或外部因素而偏離預期狀態。最新的 Terraform 狀態可做為單一事實來源,反映您基礎架構的實際配置。
- 可靠的規劃與執行:Terraform 仰賴州檔案來規劃並應用基礎架構的變更。準確狀態可確保 Terraform 清楚掌握您現有的基礎架構。如此一來,它就能產生更可靠的執行計畫,並避免在變更應用過程中發生錯誤。
- 團隊協作:Terraform State 促進基礎架構專案的協作。藉由將狀態檔案儲存在中央位置,例如 HashiCorp Cloud Terraform Registry 等遠端後端,或是雲端儲存服務,多位團隊成員可以同時處理相同的基礎架構設定,並促進集中式基礎架構管理。
- 適用於大型基礎架構的可擴充性:隨著基礎架構的複雜性不斷增加,在本地管理 Terraform 狀態可能會變得繁瑣。將狀態儲存在遠端後端可讓您更有效地擴展 Terraform。遠端後端提供版本控制和存取控制等功能,讓大型和地理分散式基礎架構更容易管理狀態。
- 強化的資源追蹤:Terraform 狀態會保留所有配置資源及其配置的詳細記錄。此綜合日誌讓您更輕鬆地管理和更新基礎架構。想像一下,手動追蹤數百個資源及其配置有多困難。Terraform 狀態提供所有基礎架構細節的中央儲存庫,可免除此負擔。
- 高效率的變更偵測:Terraform 狀態讓 Terraform 能夠智慧地偵測基礎架構的變化。當您執行 terraform apply 時,它會比較所需的狀態與記錄的狀態,並只將更新套用至實際變更的資源。這可為您節省時間,並避免不必要的基礎架構修改。
- 簡化相依性管理:Terraform 狀態會追蹤資源之間的相依性。這一點至關重要,因為建立或更新資源的順序有時可能很重要。舉例來說,網路伺服器可能仰賴先建立的資料庫。Terraform 狀態會考量這些相依性,確保以正確的順序套用更新。
管理 Terraform 狀態
Terraform 提供儲存狀態檔案的彈性。您可以在開發人員的機器上選擇本機儲存設備,或利用遠端後端進行協作和擴充性。
- 本地後端:本機後端是預設選項,不需要額外的設定。狀態檔案儲存在本機檔案系統中,通常在工作目錄中命名為 terraform.tfstate。這種方法非常容易使用,適合小型個人專案或個人發展。然而,它並不適合協作或大型基礎架構。
- 遠端後端:遠端後端將狀態檔案儲存在集中位置,通常是 Amazon S3、Google Cloud Storage 或 Azure Blob Storage 等雲端儲存服務。遠端後端可讓多位團隊成員同時存取和修改基礎架構設定。這非常適合大型和地理分佈的基礎架構,提供版本控制和災害復原等功能。
設定 Terraform 狀態
具體的配置步驟因所選的遠端後端供應商而異。以下是將 Terraform 設定為使用 AWS S3 作為遠端後端的範例:
# Configure Terraform to use S3 as the remote backend
terraform {
backend "s3" {
bucket = "my-terraform-state" # Name of the S3 bucket to store the state file
key = "path/to/my/statefile" # Path within the bucket to store the state file
region = "us-west-2" # AWS region where the S3 bucket is located
}
}
組織和版本化狀態檔案的最佳做法
請考慮以下最佳做法,以維護易於管理的狀態檔案:
- 區隔:依環境(如開發、預備階段、生產)或專案區分狀態檔案,有助於維護組織,並在處理多個環境或專案時防止衝突。舉例來說,在開發與生產環境中,請考慮使用名為 terraform.tfstate.dev 與 terraform.tfstate.prod 的個別狀態檔案。
- 版本控制系統(VCS):Git 等版本控制系統可讓您追蹤狀態檔案隨時間的變化。如此可在必要時復原至先前的配置,並透過提供變更稽核軌跡來促進協作。
- 加密:加密狀態檔案,尤其是在使用遠端後端時,可在未經授權存取時保護存取金鑰或密碼等敏感資訊。大多數雲端儲存供應商為靜態資料提供伺服器端加密。您也可以探索用戶端加密工具,在將狀態檔案上傳至遠端後端之前,先將檔案加密。
操縱 Terraform 狀態
Terraform 提供與 Terraform 狀態互動的強大指令。這些指令可讓您管理現有的基礎架構、重新組織您的狀態檔案,以獲得更佳的可維護性,並從 Terraform 的控制中移除資源。
以下是一些常用的 Terraform 狀態指令:
- terraform 匯入:此命令對於在 Terraform 的管理下整合現有基礎架構元素(資源)至關重要。它讓 Terraform 能夠識別並追蹤已存在於雲端環境中的實體資源。這對於將現有基礎架構遷移至 Terraform 或管理最初在 Terraform 之外建立的資源非常有用。
- terraform 狀態:此核心指令提供各種子指令,可操作您的狀態檔案。其中一些包括:
- terraform 狀態清單:列出在目前狀態檔案中追蹤的所有資源。這有助於概覽 Terraform 管理的資源。
- terraform 狀態清單:列出在目前狀態檔案中追蹤的所有資源。這有助於概覽 Terraform 管理的資源。
- terraform 狀態清單:列出在目前狀態檔案中追蹤的所有資源。這有助於概覽 Terraform 管理的資源。
- 特拉福州展: <resource_name>顯示狀態檔案中儲存的特定資源詳細資訊,包括其屬性和組態。
- terraform 狀態 rm: <resource_name>從狀態檔案移除資源。這不會破壞雲端中的實際基礎架構資源,只會將其從 Terraform 的管理中移除。
狀態操縱的常見情境
以下是您需要操作 Terraform 狀態的一些實際情境,以及一些指令範例,以協助達成:
- 新增現有資源:使用 terraform 匯入功能,在 Terraform 的控制下提供現有的基礎架構資源。在將現有基礎架構遷移至 Terraform 或管理最初在 Terraform 之外配置的資源時,此功能特別有用。例如,以下命令會將 ID 為 i-1234567890abcdef0 的現有 AWS EC2 執行個體匯入 Terraform,並為其指派邏輯名稱範例:
terraform import aws_instance.example i-1234567890abcdef0
- 移動資源:使用 terraform state mv 重新組織您的狀態檔案,以獲得更佳的可維護性。當您想要在模組內將相關資源分組,或單純地改善狀態檔案的整體結構時,這會很有幫助。例如,以下命令會將 aws_instance.example resources 移至名為 new_module 的新模組:
terraform state mv aws_instance.example
module.new_module.aws_instance.example
移除資源:使用 terraform state rm 將資源從 Terraform 的管理中移除,而不會破壞雲端中的實際資源。這對於您想要停止管理 Terraform 資源,但將資源本身保留在雲端環境中的情況非常有用。
結論
Terraform 狀態是 Terraform 基礎架構管理能力的基礎要素。透過了解並有效管理 Terraform 狀態,您可以確保基礎架構的一致性、可靠性和可擴充性。無論是使用本地或遠端後端,Pure Storage Portworx® 都能為您的容器工作負載提供使用 Kubernetes 的最佳持久性儲存解決方案。利用 Terraform 配置,無論 Terraform 狀態檔案的變更為何,都能確保資料始終儲存。