Terraform 作為現代基礎架構即程式碼(IaC)的代表性工具,其重要性日益凸顯。本文旨在提供一個全面的 Terraform 技術,從 IaC 的基本概念出發,逐步深入 Terraform 的實務應用。涵蓋了 Terraform 的安裝與組態、狀態管理、模組的使用、CLI 的高階操作技巧等。同時,也為準備 Terraform Associate 認證的工程師提供一個學習路徑,並針對認證考試目標進行詳細解析。此外,本文還將探討 IaC 的核心概念,以及 Terraform 的多雲支援和供應商無關的特性,以及狀態管理的優勢,例如冪等性、依賴管理和效能最佳化。最後,文章也涵蓋了 Terraform 的基礎知識,包括安裝、版本管理、提供者組態以及多提供者使用等,讓讀者能快速上手並掌握 Terraform 的核心功能。

HashiCorp Terraform 技術與實務解析

深入理解Terraform基礎架構即程式碼(IaC)概念

何謂基礎架構即程式碼(IaC)?

基礎架構即程式碼(Infrastructure as Code, IaC)是一種透過程式碼來定義和管理基礎架構的方法。這種方法允許開發者和維運團隊使用與軟體開發相同的工具和實踐來管理基礎架構,從而提高自動化程度、減少錯誤並增強一致性。

IaC的優勢

IaC模式帶來多項優勢,包括但不限於:

  • 版本控制:能夠對基礎架構組態進行版本控制,方便追蹤變更歷史和回復。
  • 重複使用性:可重複使用的組態程式碼減少了重複勞動,提高了效率。
  • 一致性:確保不同環境之間的一致性,減少了因手動組態差異導致的錯誤。
  • 自動化:自動化佈署和管理基礎架構,大大提高了工作效率。

Terraform的目的與優勢

多雲與供應商無關的優勢

Terraform支援多雲環境,能夠管理多個雲供應商的資源,如AWS、Azure、Google Cloud等。這種供應商無關的特性使得企業能夠避免被特定供應商繫結,靈活選擇最合適的雲端服務。

狀態管理的優勢

Terraform透過狀態檔案來跟蹤和管理資源的狀態,這使得資源的管理更加透明和可控。狀態檔案還允許Terraform在執行變更前預覽變更內容,從而避免不必要的錯誤。

Terraform基礎知識

安裝與版本管理

Terraform及其提供者的安裝和版本管理是使用Terraform的第一步。瞭解如何安裝Terraform、如何指定提供者版本以及如何管理這些版本對於穩定和可重複的基礎架構佈署至關重要。

外掛式架構

Terraform的外掛式架構允許透過提供者來擴充套件其功能。每個提供者負責與特定的基礎架構服務進行互動,如AWS、Azure等。

使用多個提供者

在單一組態中使用多個提供者能夠管理跨多個雲或服務的資源。這需要了解如何組態和使用多個提供者。

Terraform CLI的高階用法

terraform fmt格式化程式碼

使用terraform fmt命令可以自動格式化Terraform組態程式碼,以保持程式碼風格的一致性。

terraform taint標記資源

terraform taint命令用於標記一個資源為「受損」,這會在下一次應用時強制替換該資源。

terraform import匯入現有基礎架構

透過terraform import,可以將現有的基礎架構資源匯入到Terraform狀態中,從而實作對這些資源的管理。

與Terraform模組互動

模組來源選項

Terraform模組可以來自多個來源,包括本地路徑、Terraform Registry、Git儲存函式庫等。瞭解這些來源的優缺點有助於選擇最合適的模組來源。

模組輸入與輸出

模組可以接受輸入變數並提供輸出值。正確使用模組的輸入和輸出可以提高程式碼的重用性和模組化程度。

導航Terraform工作流程

寫入 -> 計劃 -> 建立

Terraform的工作流程包括寫入組態、生成執行計劃以及應用變更。這個流程確保了變更的可預見性和安全性。

初始化工作目錄

使用terraform init初始化工作目錄,這一步驟是使用Terraform管理基礎架構的第一步。

狀態管理

狀態鎖定

狀態鎖定機制防止了多個使用者同時修改狀態檔案,從而避免了狀態檔案的損壞。

遠端狀態儲存

將狀態檔案儲存在遠端(如S3、Consul)可以實作狀態檔案的分享和保護,防止狀態檔案丟失。

讀取、生成和修改組態

使用變數和輸出

變數和輸出是Terraform組態中的重要組成部分。變數允許使用者自定義組態,而輸出則提供了從Terraform狀態中檢索資訊的方法。

安全秘密注入最佳實踐

安全地注入秘密資訊(如API金鑰、密碼)是基礎架構即程式碼實踐中的一個重要方面。應當使用安全的方法來儲存和注入這些秘密,避免將其硬編碼在組態檔案中。

Terraform 認證:掌握基礎與實踐

Terraform Associate 認證是 HashiCorp 為 IT、DevOps 和維運人員設計的入門級認證,旨在驗證候選人對基礎設施即程式碼(Infrastructure as Code, IaC)概念和 Terraform 工具的理解與應用能力。本文將探討該認證的考試目標、準備方法以及實踐經驗。

考試目標與結構

Terraform Associate 認證考試根據 HashiCorp 公佈的考試目標,每個終端目標(terminal objective)細分為多個支援目標(enabling objectives),以全面評估考生的知識和經驗。考試內容涵蓋 Terraform 的基本概念、組態管理、資源操作以及企業功能等。

準備方法

  1. 理論學習:閱讀官方檔案和相關,瞭解 Terraform 的核心概念和功能。
  2. 實踐操作:透過實際操作來鞏固理論知識。使用 Terraform 建立和管理基礎設施,嘗試不同的組態和場景。
  3. 模擬考試:利用模擬題進行練習,熟悉考試格式和題型。

重點章節與目標

Objective 8: 瞭解 Terraform 組態語言

  • 8C: 理解集合和結構型別的使用:掌握 Terraform 中集合型別(如列表、對映)的應用。
  • 8D: 建立和區分資源和資料組態:學習如何定義資源和資料來源,並理解兩者的區別。
  • 8E: 使用資源定址和資源引數連線資源:瞭解如何透過資源引數和參照來關聯不同資源。
  • 8F: 使用 Terraform 內建函式編寫組態:熟悉 Terraform 提供的內建函式,以簡化組態編寫。
  • 8G: 使用動態塊組態資源:學習動態塊的使用,以實作更靈活的資源組態。
  • 8H: 描述內建的依賴管理:理解 Terraform 如何自動管理資源之間的依賴關係。

Objective 9: 瞭解 Terraform 企業功能

  • 9A: 描述 Sentinel、Registry 和 Workspaces 的優勢:瞭解 Terraform 企業版中的關鍵功能。
  • 9B: 區分 OSS 和 TFE 工作區:比較開源版和企業版 Terraform 的工作區差異。
  • 9C: 總結 Terraform Cloud 的特點:學習 Terraform Cloud 如何簡化團隊協作和基礎設施管理。

實踐經驗的重要性

雖然閱讀和檔案對於準備考試至關重要,但實際操作經驗是不可替代的。透過實際使用 Terraform,您可以更深入地理解其工作原理,並在實踐中鞏固所學知識。

基礎設施即程式碼(IaC)概念解析

Terraform 是基礎設施即程式碼(Infrastructure-as-Code, IaC)的典型範例,因此 HashiCorp 要求考生具備對 IaC 的基本理解。本章節將探討 IaC 的核心概念和相關主題,而非僅侷限於 Terraform 本身。

1A:解析基礎設施即程式碼(IaC)

基礎設施可被視為應用程式賴以執行的資源。傳統上,這些資源包括伺服器、儲存裝置和網路設施。隨著虛擬化技術的出現,伺服器資源被進一步劃分為實體資源和虛擬機器。雲端服務供應商則引入了額外的抽象層,從基礎設施即服務(IaaS)開始,逐步發展至平台即服務(PaaS)和軟體即服務(SaaS)。傳統基礎設施的佈署往往依賴手動且繁瑣的流程,容易出現錯誤和不一致性;而雲端服務供應商和其他供應商提供的各種服務,則引入了軟體驅動的建立和組態模式。

IaC 的定義與特點

基礎設施即程式碼(IaC)是一種透過機器可讀格式來定義和提供基礎設施資源的做法。使用 IaC 管理的基礎設施可以包括裸機伺服器、虛擬機器、網路資源、儲存卷,甚至是作為服務提供的資料函式庫。雖然 IaC 經常被應用於雲端環境,但並不侷限於雲端;只要基礎設施管理系統具備可程式設計的介面,就可以參與 IaC。

IaC 的格式可以是宣告式(定義期望的結果)或命令式(定義提供的過程)。宣告式提供方案(如 Terraform)專注於佈署的最終狀態,並依賴解釋引擎來建立和組態實際資源。命令式提供方案(如批次指令碼)則關注實際的提供過程,可能參考包含設定和組態值的檔案。為 IaC 建立的程式碼可以儲存在版本控制系統(VCS)中,以實作變更追蹤和團隊協作。IaC 還可以與其他常見的軟體開發實踐(如自動化測試、佈署Pipeline和可重用元件)結合使用。

內容解密:

此圖示展示了宣告式 IaC 和命令式 IaC 的主要區別。宣告式 IaC(如 Terraform)定義了期望的最終狀態,由解釋引擎負責建立和組態資源。命令式 IaC(如批次指令碼)則直接定義了資源的提供過程。兩者都可以利用版本控制系統進行變更追蹤和團隊協作。

IaC 的關鍵點

IaC 的核心在於,基礎設施是透過機器可讀的程式碼來定義和提供的,而不是透過人工操作入口、命令列或 API 手動完成。如果某一過程是透過人員手動執行,則不被視為 IaC。

重點整理
  1. IaC 的定義:透過機器可讀格式定義和提供基礎設施資源。
  2. 宣告式與命令式 IaC:宣告式關注最終狀態,命令式關注提供過程。
  3. IaC 的應用範圍:不僅限於雲端環境,只要具備可程式設計介面的基礎設施管理系統均可使用。
  4. IaC 與軟體開發實踐的結合:可與版本控制、自動化測試、佈署Pipeline等實踐結合使用。

補充資訊

本章重點回顧

  • 瞭解 IaC 的基本概念及其重要性
  • 區分宣告式和命令式 IaC
  • 認識 IaC 在現代基礎設施管理中的應用範圍和潛力

深入理解基礎設施即程式碼(IaC)與 Terraform 的應用

IaC 概念解析

基礎設施即程式碼(Infrastructure as Code, IaC)是一種透過機器可讀的檔案來定義基礎設施佈署的做法,能夠以自動化的方式進行基礎設施的組態。IaC 的主要優勢包括一致性、可重複性以及效率的提升。

一致性與可重複性

透過將基礎設施定義為程式碼,可以確保在多個構建版本和環境中佈署的一致性。當使用相同的程式碼來建立 staging 和 production 環境時,維運團隊無需擔心兩個環境之間的不一致性。在雲端環境中,使用相同的程式碼在多個區域佈署基礎設施,能夠確保每個區域的設定保持一致。

提升效率

IaC 允許將常見的基礎設施元件和佈署模式定義一次並重複使用。例如,對於新的應用程式佈署 web 伺服器是一個常見的模式。透過將 web 伺服器的佈署定義在程式碼中,可以在每次需要佈署 web 伺服器時重複使用。此外,如果需要更改 web 伺服器的組態,只需更新一次程式碼,即可將更改推播到所有應用環境中。

Terraform 的多雲與供應商無關特性

Terraform 並非唯一的 IaC 解決方案。除了 Terraform 外,還有公有雲供應商提供的 IaC 解決方案,如 AWS 的 CloudFormation 和 Azure 的 Resource Manager(ARM)Templates。Terraform 的最大特色在於其供應商無關的特性,能夠跨多個雲端和服務提供一致的工具、流程和語言(HashiCorp Configuration Language, HCL)。

多雲支援

Terraform 支援多個公有雲,包括 AWS、Azure、Google Cloud Platform(GCP)、Alibaba Cloud(AliCloud)等。透過不同的供應商,Terraform 能夠提供跨雲端和服務的一致性管理。

Terraform 狀態管理的優勢

Terraform 使用狀態(state)來跟蹤資源的建立和變更。狀態包含了資源的中繼資料,能夠對映到實際的資源上。狀態管理帶來了多個好處,包括冪等性(idempotence)、依賴管理以及效能最佳化。

冪等性

每次執行 Terraform 組態時,Terraform 會檢查實際環境是否與預期組態一致。只有需要變更的資源才會被更新,其他資源保持不變。如果組態沒有變化,Terraform 不會對環境進行任何更改。

依賴管理

當資源被建立時,Terraform 會建立資源之間的依賴關係。例如,EC2 例項依賴於子網。當刪除資源時,Terraform 會根據狀態檔案中的依賴關係來決定刪除順序,確保依賴關係正確處理。

效能最佳化

透過維護狀態檔案,Terraform 可以快速檢查資源屬性,而無需每次都查詢實際資源。這大大提高了規劃執行的效能。預設情況下,Terraform 會在每次規劃執行前重新整理狀態,但也可以透過 --refresh=false 引數來跳過重新整理,以進一步提高效能。

程式碼解析:

此範例展示瞭如何使用 Terraform 在 AWS 上建立一個簡單的基礎設施,包括 VPC、子網和 EC2 例項。首先,我們定義了 AWS 供應商並指定了區域。接著,我們建立了一個 VPC 和一個子網,並在該子網中建立了一個 EC2 例項。其中,aws_vpcaws_subnetaws_instance 分別代表了 VPC、子網和 EC2 例項的資源型別。透過這種方式,Terraform 能夠根據程式碼定義自動建立和管理基礎設施。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Terraform技術與實務解析

package "安全架構" {
    package "網路安全" {
        component [防火牆] as firewall
        component [WAF] as waf
        component [DDoS 防護] as ddos
    }

    package "身份認證" {
        component [OAuth 2.0] as oauth
        component [JWT Token] as jwt
        component [MFA] as mfa
    }

    package "資料安全" {
        component [加密傳輸 TLS] as tls
        component [資料加密] as encrypt
        component [金鑰管理] as kms
    }

    package "監控審計" {
        component [日誌收集] as log
        component [威脅偵測] as threat
        component [合規審計] as audit
    }
}

firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成

@enduml

此圖示展示了使用 Terraform 建立基礎設施的主要步驟,從定義供應商到建立 EC2 例項,每一步驟都按照一定的順序進行,以確保基礎設施的正確組態。

Terraform 基礎知識解析

在深入瞭解 Terraform 的基礎知識之前,我們需要先掌握其安裝、提供者(Provider)的使用以及組態管理的基本概念。Terraform 是一個強大的基礎設施即程式碼(IaC)工具,支援多雲環境和提供者無關的方法,使其成為跨多個雲端服務和平台的理想選擇。

處理 Terraform 和提供者安裝與版本控制

Terraform 安裝步驟

Terraform 是使用 Golang 編寫的,並為多個作業系統編譯為單一的二進位制檔案。安裝 Terraform 的過程非常簡單,主要步驟如下:

  1. 下載 Terraform:前往 Terraform 官方網站下載頁面¹³,根據您的作業系統型別選擇合適的套件下載。Terraform 以單一的 .zip 檔案形式分發。

  2. 解壓縮套件:下載完成後,將套件解壓縮到您選擇的目錄。Terraform 以單一的二進位制檔案 terraform 執行。其他檔案可以安全地移除,不影響 Terraform 的功能。

  3. 設定 PATH 環境變數:為了能夠在任意路徑下執行 Terraform,您需要將包含 Terraform 二進位制檔案的目錄新增至 PATH 環境變數中。

    • Linux 和 Mac 使用者可以參考此 Stack Overflow 問題¹⁴的解答來設定 $PATH
    • Windows 使用者可以參考此 Stack Overflow 問題¹⁵的解答來設定 PATH

提供者(Provider)組態與版本控制

Terraform 的資源和資料來源都是透過提供者系統來啟用的。提供者是一個可執行的外掛程式,包含了與特定服務 API 互動所需的程式碼。通常,這包括了驗證服務、管理資源和存取資料來源的方法。

提供者可以在組態檔案中明確定義,也可以透過使用提供者的資源或資料來源來隱含定義。提供者區塊中的實際引數會根據提供者的不同而有所不同,但所有提供者都支援 versionalias 等後設引數。

例如,Azure 提供者的區塊可能如下所示:

provider "azurerm" {
  version = "=1.41.0"
  tenant_id = var.tenant_id
  subscription_id = var.subscription_id
}

在這個例子中,version 引數用於限制提供者的版本,以避免下載可能包含破壞性變更的新版本。如果未指定版本,Terraform 將在初始化期間自動下載最新的提供者。

內容解密:

  • provider "azurerm":指定使用 Azure Resource Manager 提供者。
  • version = "=1.41.0":指定所需的提供者版本。
  • tenant_idsubscription_id:設定 Azure 提供者的驗證資訊。

HashiCorp 建議使用 required_providers 區塊來組態 Terraform 組態,如下所示:

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=1.41.0"
    }
  }
}

這種語法是在 Terraform 0.13 版本中引入的,包含了 source 引數,用於指定提供者的來源。

內容解密:

  • required_providers:定義了 Terraform 組態所需的提供者。
  • source:指定提供者的來源,這裡使用的是 HashiCorp 官方的 AzureRM 提供者。
  • version:指定所需的提供者版本。

下一步

在下一章中,我們將繼續探索 Terraform 的高階功能,包括如何使用 provisioners 來進一步組態和管理資源。

¹³https://www.terraform.io/downloads.html ¹⁴https://stackoverflow.com/questions/14637979/how-to-permanently-set-path-on-linux ¹⁵https://stackoverflow.com/questions/1618280/where-can-i-set-path-to-make-exe-on-windows