快速上手 Terraform:打造基礎設施即程式碼的利器

快速上手 Terraform:打造基礎設施即程式碼的利器

一、Terraform 簡介

在現代 DevOps 團隊中,基礎設施即程式碼(Infrastructure as Code, IaC)已經成為不可或缺的一環。而提到 IaC 工具,Terraform 絕對是開發者們的首選之一。這款由 HashiCorp 開發的開源工具,不僅功能強大,更是以簡單易用的設計受到廣泛歡迎。

為什麼選擇 Terraform?

Terraform 之所以受到熱烈追捧,主要歸功於以下三大特點:

1. 多雲支援,靈活無縫

Terraform 支援多種主流雲端服務供應商,包括 AWS、Azure、Google Cloud 等。不僅如此,它還能跨多個平台進行整合,實現真正的多雲管理,為企業提供極大的彈性。

截圖自:Terraform 官網

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 為設定範例:

截圖自:Google Cloud Shell
  • project :
    Project 是 Google Cloud 管理資源的最小單位,這邊要填入的是要進行操作的 Google Cloud 專案,需要填入 Project ID。
  • region :
    所指的是我們的資源需要佈署的地理區域/機房,以上方截圖為例,asia-east1 指的是 Google Cloud 台灣機房,若要指定佈署在其他區域,可以參考官方說明

這個 provider 區塊定義了 Terraform 與 GCP 的互動,是 Terraform 創建資源時的必要前置要件:

  1. 連接到指定的 GCP 專案 (範例中為 linen-team-442506-r7)
  2. 在指定的區域 (asia-east1) 中創建與管理資源

關於 Provider 的更多資訊可以參考此篇官方文件

Resources

Resources 是 Terraform 說明建置資源的區塊,用來描述具體的基礎設施。無論是創建虛擬機器、配置網絡,還是設置存儲資源,都是通過 Resources 進行定義。

Resources 的特點

  • 資源是 Terraform 配置的核心,描述了要建立的基礎設施屬性和期望狀態。
  • 每個資源都對應特定的 Provider plug-in,並由該 plug-in 負責具體執行。
  • 資源之間會自動建立依賴關係,Terraform 會盡量確保它們按照正確順序進行創建或修改。

以下使用 Terraform 配置 Google Cloud – Compute Engine 虛擬機器的範例:

截圖自:Google Cloud Shell
  • “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 的作用

  1. 追蹤現有資源:記錄哪些資源已被 Terraform 管理,並儲存它們的屬性(例如 ID、名稱、位置等)。
  2. 執行變更計畫:比較狀態檔中的現有資源狀態與配置檔案中的期望狀態,生成變更計畫。
  3. 避免重複操作:確保 Terraform 不會因為缺乏資訊而重複創建資源或意外刪除現有資源。

狀態檔的格式

狀態檔是一個 JSON 格式的檔案,並命名為 terraform.tfstate。默認情況下,Terraform 會將狀態檔案儲存在當前目錄的 terraform.tfstate 文件中。

截圖自:Google Cloud Shell

以文章中範例的 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 檔案

截圖自:Google Cloud Shell

主要功能

在 Terraform 中,main.tf 會用來定義基礎設施資源和配置。這個檔案通常是 Terraform 配置的核心,即前述的核心區塊,日後也可以再結合其他檔案(如 variables.tf、outputs.tf)來做使用。

步驟 2:初始化工作環境 – terraform init

terraform init 這個指令的作用是準備 Terraform 運行所需的環境。

截圖自:Google Cloud Shell

主要功能

1. 下載 Provider plug-in:
Terraform 會根據配置檔案中定義的 Provider,從官方模組倉庫下載所需的 plug-in。例如:配置檔案內如果指定 Google Cloud,Terraform 就會下載 Google Cloud Provider plug-in。
2. 驗證配置檔案:
Terraform 會檢查配置檔案的語法和結構是否正確,確保環境初始化時不會出現問題。

步驟 3:生成變更計畫 – terraform plan

terraform plan 用於分析配置檔案,並生成一個詳細的「執行計畫」,幫助使用者預覽 Terraform 即將執行的操作。

截圖自:Google Cloud Shell

主要功能

1. 比較狀態檔與配置檔案
Terraform 會將現有的狀態(State)與配置檔案中的目標狀態進行比對,找出需要變更的資源。
2. 生成差異清單
顯示需要新增(Add)、修改(Change)或刪除(Destroy)的資源清單,讓使用者了解變更會帶來的影響。
3. 模擬執行效果
plan 會模擬整個執行過程,但不會實際對基礎設施進行任何更動。

步驟 4:套用變更 – terraform apply

terraform apply 是實際執行計畫的指令,會根據 plan 中定義的內容,對基礎設施進行變更。

截圖自:Google Cloud Shell

主要功能

1. 根據計畫進行操作
Terraform 會執行計畫,新增、修改或刪除資源,確保基礎設施達到配置檔案中定義的狀態
2. 更新狀態檔
執行完成後,Terraform 會自動更新 terraform.tfstate 檔案,記錄最新的基礎設施狀態
3. 交互式確認
默認情況下,執行 apply 時需要手動輸入 yes 來確認變更

步驟 5:確認資源

接著我們就可以前往 Google Cloud console 查看我們建立出來的資源。

截圖自:Google Cloud Console

結論

簡單來說,Terraform 是一款能夠幫助開發者使用程式碼來定義、部署及管理雲端資源的工具。無論是建立虛擬機器、配置網路,還是管理容器編排集群,Terraform 都能輕鬆勝任。而且,它採用了宣告式的配置方式,只需要定義「想要的結果」,Terraform 就能自動完成相關部署,讓基礎設施管理變得更高效。

發佈留言