在雲端時代,基礎設施即程式碼(IaC)已成為標準實踐。本文將引導讀者使用 Terraform 在 Azure 上設定服務主體,並探討遠端狀態管理和工作區組態,實作更安全、高效的 Azure 資源管理。透過服務主體驗證,Terraform 可以自動化管理 Azure 資源,而遠端狀態儲存則解決了團隊協作的挑戰,確保狀態一致性。此外,工作區功能讓多環境佈署更加簡潔,避免組態檔案重複和維護困難。
設定 Azure 服務主體
安裝完成 Azure CLI 後,我們可以使用它來建立一個服務主體。執行以下命令:
az ad sp create-for-rbac --name TerraformSP --role="Contributor" --scopes="/subscriptions/your_subscription_id"
內容解密:
這條命令會建立一個名為 TerraformSP 的服務主體,並賦予它 Contributor 角色,使其能夠管理指定的 Azure 訂閱資源。請將 your_subscription_id 替換為您的實際訂閱 ID。
執行成功後,您將獲得如下輸出:
{
"appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"displayName": "TerraformSP",
"name": "http://TerraformSP",
"password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
內容解密:
輸出結果包含了服務主體的 appId、password 和 tenant 資訊,這些資訊將用於後續的 Terraform 組態中。
在 Terraform 中組態 Azure 供應商
獲得服務主體的驗證資訊後,我們需要在 Terraform 組態檔案中設定 Azure 供應商。建立一個名為 main.tf 的檔案,並新增以下內容:
provider "azurerm" {
features {}
subscription_id = "your_subscription_id"
client_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
client_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
tenant_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
內容解密:
在這個組態中,我們指定了 Azure 供應商,並提供了服務主體的驗證資訊。其中,subscription_id、client_id、client_secret 和 tenant_id 需要替換為實際的值。
初始化 Terraform 工作目錄
組態完成後,執行以下命令初始化 Terraform 工作目錄:
terraform init
內容解密:
這條命令會初始化 Terraform 工作目錄,下載必要的供應商外掛,並準備好 Terraform 組態環境。
透過上述步驟,我們成功地設定了 Azure 服務主體,並在 Terraform 中組態了 Azure 供應商。這使得我們能夠使用 Terraform 管理 Azure 資源,實作基礎設施即程式碼(IaC)的管理方式。
流程解密:
此流程圖展示了使用 Terraform 管理 Azure 資源的步驟,包括安裝 Azure CLI、建立服務主體、組態 Azure 供應商、初始化 Terraform,以及最終管理 Azure 資源。
管理 Azure 資源
現在,我們可以使用 Terraform 來建立、更新或刪除 Azure 資源。舉例來說,建立一個名為 resource_group.tf 的檔案,內容如下:
resource "azurerm_resource_group" "example" {
name = "example-resource-group"
location = "West US"
}
內容解密:
這段組態定義了一個 Azure 資源群組,名稱為 example-resource-group,位於 West US 區域。
執行以下命令應用此組態:
terraform apply
內容解密:
這條命令會根據組態檔案中的定義,建立或更新 Azure 資源。在執行前,Terraform 會顯示變更計劃,並等待使用者確認。
透過本章的學習,您已經掌握了使用 Terraform 管理 Azure 資源的基本流程,包括設定服務主體、組態 Azure 供應商,以及使用 Terraform 組態檔案定義和管理資源。這種基礎設施即程式碼的方法能夠提升資源管理的效率和一致性。
流程解密
圖表說明
此流程圖展示了使用 Terraform 管理 Azure 資源的完整工作流程。從安裝 Azure CLI 開始,到最終建立 Azure 資源群組,每個步驟都清晰地標示出來,幫助讀者理解整個流程的先後順序和邏輯關係。
使用 Terraform 管理 Azure 資源:深入解析與實戰範例
在前面的章節中,我們已經介紹了使用 Terraform 管理 Azure 資源的基本概念和設定方法。本章節將探討 Terraform 的進階用法,並提供實際範例來說明如何有效地管理 Azure 資源。
深入理解 Terraform 變數與輸入
Terraform 的彈性在於其能夠接受外部輸入,這些輸入可以是變數、環境變數或是檔案。正確地使用這些輸入可以大幅提升 Terraform 程式碼的可重複使用性和安全性。
變數定義的最佳實踐
在定義變數時,應當遵循以下最佳實踐:
- 明確資料型別:為變數指定明確的資料型別,例如
string、number或bool,以確保輸入值的正確性。 - 提供詳細描述:為每個變數提供清晰的描述,以便使用者理解其用途和預期輸入。
- 設定敏感資訊:對於包含敏感資訊的變數,例如密碼或金鑰,應將其標記為
sensitive = true以避免在輸出中暴露。 - 使用預設值:為變數提供合理的預設值,可以簡化使用者的輸入過程。
variable "rg_name" {
type = string
description = "資源群組的名稱"
default = "default-rg"
}
variable "rg_location" {
type = string
description = "資源群組的位置"
default = "East US"
}
管理複雜的 Azure 資源
除了基本的資源群組之外,Terraform 還可以用於管理更複雜的 Azure 資源,例如虛擬網路、儲存帳戶和虛擬機器等。
建立 Azure 虛擬網路範例
以下是一個使用 Terraform 建立 Azure 虛擬網路的範例:
resource "azurerm_virtual_network" "example" {
name = "${var.rg_name}-vnet"
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
}
resource "azurerm_subnet" "example" {
name = "${var.rg_name}-subnet"
resource_group_name = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.example.name
address_prefixes = ["10.0.1.0/24"]
}
使用 Terraform 管理多環境
在實際應用中,通常需要管理多個環境,例如開發、測試和生產環境。Terraform 可以透過不同的變數檔案或工作區來管理這些環境。
使用工作區管理多環境
Terraform 的工作區功能允許在同一個組態檔案下管理多個獨立的基礎設施狀態。
# 建立新的工作區
terraform workspace new dev
# 切換到指定的工作區
terraform workspace select dev
# 在不同的工作區中使用不同的變數檔案
terraform apply -var-file=dev.tfvars
設定 Terraform 後端
在建立後端之前,我們需要取得 STORAGE_ACCOUNT_NAME 的值。執行以下指令:
echo $STORAGE_ACCOUNT_NAME
假設輸出為 tfstate15153。接著,在工作區中建立一個名為 backend.tf 的檔案,內容如下:
terraform {
backend "azurerm" {
resource_group_name = "tfstate"
storage_account_name = "tfstate15153"
container_name = "tfstate"
key = "example.tfstate"
}
}
內容解密:
上述 backend.tf 檔案定義了 Terraform 的後端設定,使用 Azure Blob Storage 儲存狀態檔。其中:
resource_group_name指定了儲存帳戶所在的資源群組。storage_account_name是儲存狀態的 Azure Storage 帳戶名稱。container_name定義了儲存狀態的容器名稱。key指定了狀態檔的名稱,用於區分不同專案的狀態。
這個設定使 Terraform 能夠將狀態檔儲存在遠端,避免了本地狀態檔可能造成的協作問題和安全性風險。
使用新的後端設定初始化 Terraform 工作區:
terraform init
Terraform 會偵測到後端已變更,並檢查現有後端中是否有任何可用狀態。如果找到狀態檔,它會詢問是否要將目前的狀態遷移到新的後端。如果沒有,它會自動切換到新的後端。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Terraform Azure 服務主體與遠端狀態管理
package "Terraform 工作流程" {
actor "DevOps" as dev
package "本地開發" {
component [.tf 設定檔] as tf
component [terraform.tfvars] as vars
component [.tfstate] as state
}
package "Terraform Core" {
component [Init] as init
component [Plan] as plan
component [Apply] as apply
component [Destroy] as destroy
}
package "Providers" {
cloud "AWS" as aws
cloud "GCP" as gcp
cloud "Azure" as azure
}
database "Remote State" as remote
}
dev --> tf : 編寫配置
tf --> init : 初始化
init --> plan : 規劃變更
plan --> apply : 執行變更
apply --> aws : 建立資源
apply --> gcp : 建立資源
apply --> azure : 建立資源
apply --> state : 更新狀態
state --> remote : 同步狀態
@enduml流程解密:
此 Plantuml 圖表展示了 Terraform 初始化過程中後端變更的處理流程。當偵測到後端變更時,Terraform 會檢查是否有現有的狀態檔。如果存在,它會引導使用者將狀態遷移到新的後端;如果不存在,則直接切換到新的後端設定。
現在,執行 terraform plan 進行規劃:
terraform plan
輸出結果顯示 Terraform 將建立一個名為 terraform-exercise 的新資源群組。接著,使用 -auto-approve 標誌套用設定,讓 Terraform 立即套用變更:
terraform apply -auto-approve
此命令將自動套用 Terraform 組態,無需手動確認。
Terraform 遠端狀態管理與工作區組態
Terraform 作為基礎設施即程式碼(IaC)工具,在管理現代雲端基礎設施中扮演著關鍵角色。本文將探討 Terraform 的遠端狀態管理和工作區組態,幫助讀者掌握更高效的基礎設施管理方法。
為何需要遠端狀態管理
在預設情況下,Terraform 將狀態檔案儲存在本地的 terraform.tfstate 檔案中。然而在團隊協作環境中,這種做法會帶來諸多問題:
- 狀態檔案一致性問題:多個團隊成員同時修改基礎設施組態可能導致狀態檔案衝突。
- 安全性考量:敏感資訊可能儲存在狀態檔案中,需要適當的安全措施。
- 協作效率:需要集中管理機制來協調團隊成員的操作。
實作遠端狀態儲存
Azure Blob Storage 是 Terraform 支援的遠端狀態儲存解決方案之一。以下是一個典型的組態範例:
# backend.tf
terraform {
backend "azurerm" {
resource_group_name = "tfstate-rg"
storage_account_name = "tfstatestor123"
container_name = "tfstate"
key = "example.tfstate"
}
}
內容解密:
此組態將 Terraform 狀態檔案儲存在指定的 Azure Blob Storage 中。主要引數說明如下:
resource_group_name:儲存狀態檔案的資源群組名稱storage_account_name:儲存帳戶名稱container_name:容器名稱key:狀態檔案的儲存名稱
執行以下指令初始化遠端狀態組態:
terraform init -backend-config=storage_account_name=tfstatestor123 -backend-config=resource_group_name=tfstate-rg
流程解密:
- 建立儲存帳戶和容器
- 組態
backend.tf檔案 - 執行
terraform init進行初始化 - 使用
-auto-approve選項自動套用變更
terraform apply -auto-approve
Terraform 工作區管理
在多環境佈署場景中,工作區(Workspace)功能提供了有效的管理機制。常見的環境包括開發(dev)、測試(test)和生產(prod)。
工作區組態實務
傳統的做法是為每個環境建立獨立的目錄結構,包含重複的組態檔案:
├── dev
│ ├── backend.tf
│ ├── main.tf
│ ├── terraform.tfvars
│ └── vars.tf
├── prod
│ ├── backend.tf
│ ├── main.tf
│ ├── terraform.tfvars
│ └── vars.tf
└── test
├── backend.tf
├── main.tf
├── terraform.tfvars
└── vars.tf
這種方法存在明顯的缺點:
- 設定檔重複維護的工作量大
- 環境間的組態一致性難以保證
使用 Terraform 工作區的最佳實踐
透過工作區功能,可以簡化為單一目錄結構:
├── backend.tf
├── main.tf
├── terraform.tfvars
└── vars.tf
關鍵組態範例:
# vars.tf
variable "env" {
type = string
description = "環境變數:dev, test, 或 prod"
}
# main.tf
resource "azurerm_resource_group" "main" {
name = "${var.rg_prefix}-${var.env}"
location = var.rg_location
}
操作流程
- 初始化工作區:
terraform init
- 建立新的工作區:
terraform workspace new dev
- 執行規劃並儲存計畫:
terraform plan -var env=dev -out dev.tfplan
內容解密:
- 使用
-var選項動態傳遞環境變數 -out選項將執行計畫儲存至檔案,方便後續套用