文章段落
一、Terraform 簡介
在現代 DevOps 團隊中,基礎設施即程式碼(Infrastructure as Code, IaC)已經成為不可或缺的一環。而提到 IaC 工具,Terraform 絕對是開發者們的首選之一。這款由 HashiCorp 開發的開源工具,不僅功能強大,更是以簡單易用的設計受到廣泛歡迎。
為什麼選擇 Terraform?
Terraform 之所以受到熱烈追捧,主要歸功於以下三大特點:
1. 多雲支援,靈活無縫
Terraform 支援多種主流雲端服務供應商,包括 AWS、Azure、Google Cloud 等。不僅如此,它還能跨多個平台進行整合,實現真正的多雲管理,為企業提供極大的彈性。
2. 簡潔明瞭的語法設計
Terraform 使用的是 HashiCorp Configuration Language(HCL),這是一種直觀的宣告式語言。相比傳統的腳本式工具,HCL 不僅易學易用,還能讓配置檔案更具可讀性,方便團隊協作。
3. 狀態管理,確保一致性
Terraform 內建的狀態管理功能,可以追蹤基礎設施的現況,確保所有變更都能被完整記錄和同步。這不僅提升了基礎設施的一致性,也大大降低了人為錯誤的風險。
二、Terraform 核心概念介紹 :
在使用 Terraform 的時候,需要先理解它的核心概念是成功管理基礎設施的關鍵。接下來我們將帶著您了解 Terraform 的幾個核心概念:Provider、Resources 和 State,這三個概念是 Terraform 在運作時的必要基礎。
Provider
Terraform 使用 Provider plugin 來支持與不同雲端平台或基礎設施的整合。每個 Provider plugin 負責與特定的雲平台(如 AWS、Google Cloud、Azure)或是其他基礎設施進行通信,執行資源的創建、管理與刪除操作。
Provider 的特點與用途
- Provider 是 Terraform 與外部平台交互的核心組件。
- 它封裝了與目標平台的 API 或 SDK 的通信邏輯,讓我們只需要專注於撰寫配置檔案。
- 在使用 Provider 之前,需要進行初始化(terraform init)並提供必要的憑證。
以 Google Cloud Provider 為設定範例:
- project :
Project 是 Google Cloud 管理資源的最小單位,這邊要填入的是要進行操作的 Google Cloud 專案,需要填入 Project ID。 - region :
所指的是我們的資源需要佈署的地理區域/機房,以上方截圖為例,asia-east1 指的是 Google Cloud 台灣機房,若要指定佈署在其他區域,可以參考官方說明。
這個 provider 區塊定義了 Terraform 與 GCP 的互動,是 Terraform 創建資源時的必要前置要件:
- 連接到指定的 GCP 專案 (範例中為 linen-team-442506-r7)
- 在指定的區域 (asia-east1) 中創建與管理資源
關於 Provider 的更多資訊可以參考此篇官方文件。
Resources
Resources 是 Terraform 說明建置資源的區塊,用來描述具體的基礎設施。無論是創建虛擬機器、配置網絡,還是設置存儲資源,都是通過 Resources 進行定義。
Resources 的特點
- 資源是 Terraform 配置的核心,描述了要建立的基礎設施屬性和期望狀態。
- 每個資源都對應特定的 Provider plug-in,並由該 plug-in 負責具體執行。
- 資源之間會自動建立依賴關係,Terraform 會盡量確保它們按照正確順序進行創建或修改。
以下使用 Terraform 配置 Google Cloud – Compute Engine 虛擬機器的範例:
- “google_compute_instance”:
- 要佈署的是 GCP Compute Engine 虛擬機器服務
- Terraform 會根據這個設定在 GCP 中創建一台 VM
- “vm_instance”:
- 這是 Terraform 內部的資源名稱,可以用來引用這個 VM 資源
- 例如在配置文件中,如果需要引用這台 VM,可以使用 google_compute_instance.vm_instance
參數解析
- name = “example-instance”
- 設定 VM 的名稱為 “example-instance”。
- 這個名稱會在 GCP 的 Compute Engine 控制台中顯示。
- machine_type = “e2-medium”
- 指定 VM 的機器類型為 “e2-medium”。
- e2-medium 提供 2 個 vCPU 和 4 GB RAM。
- GCP 提供各種機器類型,客戶可以根據需求選擇合適的規格。
- zone = “asia-east1-a”
- 指定 VM 部署的可用區域 (Zone) 為 “asia-east1-a”,即台灣機房的可用區 a。
- Zone 是區域 (Region) 中的子單位,例如 asia-east1 下有 asia-east1-a、asia-east1-b 等。
boot_disk 區塊
boot_disk {
initialize_params {
image = “debian-cloud/debian-11”
}
}
- boot_disk:
- 定義 VM 的啟動磁碟。
- 每個 VM 都必須要有一個啟動磁碟來存放操作系統。
- initialize_params:
- 初始化啟動磁碟的參數。
- image:
- 指定磁碟的作業系統映像為 Debian 11。
- “debian-cloud/debian-11” 是 GCP 官方提供的 Debian 映像。
network_interface 區塊
network_interface {
network = “default”
}
- network_interface:
- 定義 VM 的網路介面。
- 每個 VM 至少需要一個網路介面來連接到網路。
- network = “default”:
- 將 VM 放置在 GCP 預設的 VPC 網路 (default) 中。
關於更多可設定的屬性可以參考此篇官方文件。
State
Terraform 使用 State(狀態檔) 來追蹤基礎設施的當前狀態,這樣做可以確保操作的一致性並避免重複操作。狀態檔是 Terraform 核心運作流程中不可或缺的一部分。
State 的作用
- 追蹤現有資源:記錄哪些資源已被 Terraform 管理,並儲存它們的屬性(例如 ID、名稱、位置等)。
- 執行變更計畫:比較狀態檔中的現有資源狀態與配置檔案中的期望狀態,生成變更計畫。
- 避免重複操作:確保 Terraform 不會因為缺乏資訊而重複創建資源或意外刪除現有資源。
狀態檔的格式
狀態檔是一個 JSON 格式的檔案,並命名為 terraform.tfstate。默認情況下,Terraform 會將狀態檔案儲存在當前目錄的 terraform.tfstate 文件中。
以文章中範例的 network_interface 來舉例,它紀錄了機器放置在 default VPC 裡面的 default subnet , ip 位置為 10.140.15.75,至於其餘留空的屬性則是因為我們的 VM 配置並沒有設定這些欄位,GCP 會幫我們依據預設值進行處理。
關於 State 的更多資訊可以參考此篇官方文件。
三、使用 Terraform 在 Google Cloud 建立第一台虛擬機器
在了解上述 Terraform 核心概念後,接下來我們會以 Google Cloud Shell 作為工作環境使用 Terraform code 來進行建立。由於 Cloud Shell 已經內建了許多工具,可以直接使用 Google Cloud 專案內帳號的權限進行驗證,因此用戶不需要額外進行憑證設置或安裝,只需要專注於在 Terraform 的配置與部署。透過以下五個簡單步驟,就能完成快速完成部署:
步驟 1:建立 main.tf 檔案
主要功能
在 Terraform 中,main.tf 會用來定義基礎設施資源和配置。這個檔案通常是 Terraform 配置的核心,即前述的核心區塊,日後也可以再結合其他檔案(如 variables.tf、outputs.tf)來做使用。
步驟 2:初始化工作環境 – terraform init
terraform init 這個指令的作用是準備 Terraform 運行所需的環境。
主要功能
1. 下載 Provider plug-in:
Terraform 會根據配置檔案中定義的 Provider,從官方模組倉庫下載所需的 plug-in。例如:配置檔案內如果指定 Google Cloud,Terraform 就會下載 Google Cloud Provider plug-in。
2. 驗證配置檔案:
Terraform 會檢查配置檔案的語法和結構是否正確,確保環境初始化時不會出現問題。
步驟 3:生成變更計畫 – terraform plan
terraform plan 用於分析配置檔案,並生成一個詳細的「執行計畫」,幫助使用者預覽 Terraform 即將執行的操作。
主要功能
1. 比較狀態檔與配置檔案
Terraform 會將現有的狀態(State)與配置檔案中的目標狀態進行比對,找出需要變更的資源。
2. 生成差異清單
顯示需要新增(Add)、修改(Change)或刪除(Destroy)的資源清單,讓使用者了解變更會帶來的影響。
3. 模擬執行效果
plan 會模擬整個執行過程,但不會實際對基礎設施進行任何更動。
步驟 4:套用變更 – terraform apply
terraform apply 是實際執行計畫的指令,會根據 plan 中定義的內容,對基礎設施進行變更。
主要功能
1. 根據計畫進行操作
Terraform 會執行計畫,新增、修改或刪除資源,確保基礎設施達到配置檔案中定義的狀態
2. 更新狀態檔
執行完成後,Terraform 會自動更新 terraform.tfstate 檔案,記錄最新的基礎設施狀態
3. 交互式確認
默認情況下,執行 apply 時需要手動輸入 yes 來確認變更
步驟 5:確認資源
接著我們就可以前往 Google Cloud console 查看我們建立出來的資源。
結論
簡單來說,Terraform 是一款能夠幫助開發者使用程式碼來定義、部署及管理雲端資源的工具。無論是建立虛擬機器、配置網路,還是管理容器編排集群,Terraform 都能輕鬆勝任。而且,它採用了宣告式的配置方式,只需要定義「想要的結果」,Terraform 就能自動完成相關部署,讓基礎設施管理變得更高效。