基礎設施即代碼(Infrastructure as Code, IaC)是現代雲端維運提升效率與穩定性的關鍵方法論。本文將以 Terraform 為核心工具,深入探討其在 Azure 平台上的應用實踐。內容從 azurerm 提供者的安全配置著手,闡述如何將服務主體憑證從代碼中分離,再延伸至實際腳本編寫,透過定義資源群組、虛擬網絡及相關組件,具體展示宣告式語法如何管理雲端資源生命週期與依賴關係。此方法論不僅確保部署的一致性,更能將基礎設施納入版本控制,實現可追溯且可重複的自動化管理流程。
Terraform Azure 提供者配置與安全實踐
本章節將深入探討 Terraform Azure 提供者 (azurerm provider) 的配置細節,並強調安全管理 Azure 服務主體 (SP) 憑證的最佳實踐。內容將說明如何將 SP 的身份驗證資訊從 Terraform 配置文件中移除,轉而透過環境變數來傳遞,以降低敏感資訊洩露的風險。此外,本節還將介紹一種適用於本地開發和測試的便捷方式:直接使用 Azure CLI 進行登入,以簡化測試流程。
提升 Terraform Azure 提供者配置的安全性
在先前章節中,我們學習了如何創建 Azure 服務主體 (SP) 並將其身份驗證資訊(客戶端 ID、客戶端密碼、租用戶 ID)直接寫入 provider.tf 文件。然而,將敏感憑證以明文形式儲存在代碼庫中,尤其是在代碼可能被多人訪問或儲存在版本控制系統中時,存在嚴重的安全隱患。
為了提升安全性,我們應採取以下改進措施:
移除配置文件中的憑證資訊: 修改
provider.tf文件,移除直接寫入的身份驗證參數。配置將變為:provider "azurerm" { features {} }此配置僅聲明使用
azurerm提供者,並保留了features塊以供將來可能進行的提供者行為自定義。透過環境變數傳遞憑證: 將 Azure 服務主體的身份驗證資訊,透過 Terraform 特定的環境變數來傳遞。Terraform 會自動偵測並讀取這些變數來進行身份驗證。常用的環境變數包括:
ARM_SUBSCRIPTION_ID: Azure 訂閱 ID。ARM_CLIENT_ID: 服務主體的客戶端 ID。ARM_CLIENT_SECRET: 服務主體的客戶端密碼。ARM_TENANT_ID: Azure AD 租用戶 ID。
透過這種方式,Terraform 配置文件本身不再包含任何敏感的身份驗證資訊,極大地提高了安全性。這些環境變數的設定將在後續的「執行 Terraform 部署」章節中詳細介紹。
本地開發與測試的便捷配置
在本地進行開發和測試 Terraform 代碼時,為了追求更快的迭代速度和簡便性,例如在沙盒環境中進行快速驗證,使用個人 Azure 帳戶登入可能比創建和管理服務主體更為方便。
使用 Azure CLI 登入: 您可以透過執行 Azure CLI 的
az login命令來登入您的 Azure 帳戶。執行此命令後,系統會打開一個瀏覽器窗口,提示您輸入 Azure 帳戶的憑證進行驗證。az login成功登入後,Terraform 將能夠自動使用您當前 Azure CLI 會話的身份來進行資源管理和部署。這種方法簡化了本地開發測試流程,無需額外配置服務主體,但請注意,此方法主要適用於開發和測試環境,不建議用於生產環境的自動化部署。
Terraform 腳本編寫:部署 Azure 基礎設施實例
本章節將引導讀者實際動手編寫 Terraform 腳本,以部署一個包含資源群組、虛擬網絡、子網及帶有公共 IP 地址的虛擬機器的基礎 Azure 架構。內容將詳細解析 Terraform 資源塊的語法結構,並逐步展示如何定義這些資源。透過這個實例,讀者將能掌握 Terraform 腳本的基本編寫方法,為後續更複雜的雲端基礎設施管理奠定實務基礎。
編寫 Terraform 腳本以部署 Azure 基礎設施
為了說明 Terraform 在 Azure 中部署資源的應用,我們將構建一個簡單的 Azure 架構。此架構包含以下核心組件:
- Azure 資源群組 (Resource Group): 作為組織和管理 Azure 資源的邏輯容器。
- 網絡配置: 包括一個虛擬網絡 (Virtual Network) 和一個子網 (Subnet)。
- 虛擬機器 (Virtual Machine): 創建於子網內,並配置一個公共 IP 地址,使其能夠公開訪問。
在與 provider.tf 文件相同的目錄下,我們將創建一個名為 main.tf 的文件,並在其中編寫 Terraform 代碼來定義這些資源。
定義資源群組
首先,我們編寫用於創建 Azure 資源群組的 Terraform 代碼:
resource "azurerm_resource_group" "rg" {
name = "bookRg"
location = "West Europe"
tags = {
environment = "Terraform Azure"
}
}
Terraform 代碼的基本語法模型由以下四個部分組成:
- 資源類型或數據塊 (Type of resource or data block): 指明要管理的資源類型,例如
azurerm_resource_group。 - 資源名稱 (Name of the resource to be managed): 這是 Terraform 用於內部引用該資源的名稱,例如
azurerm_resource_group。 - 內部 Terraform ID (Internal Terraform ID): 這是您為該資源指定的邏輯名稱,用於在 Terraform 配置中引用它,例如
rg。 - 屬性列表 (List of properties): 這些是資源的實際屬性,例如
name和location,以及tags。
透過定義 azurerm_resource_group 資源塊,我們指示 Terraform 在 Azure 中創建一個名為 bookRg 的資源群組,並將其部署在 West Europe 地區。同時,我們還為該資源群組添加了 environment = "Terraform Azure" 的標籤,便於後續的資源管理和分類。
Terraform 腳本編寫:網絡資源與虛擬機部署
本章節將延續 Terraform 腳本的編寫,重點闡述如何定義 Azure 虛擬網絡 (VNet)、子網 (Subnet) 以及虛擬機器的相關網絡組件,包括網絡接口 (NIC)、公共 IP 地址和診斷存儲。內容將詳細解析這些資源之間的依賴關係,並展示如何利用 Terraform 的引用機制來實現資源的自動化配置。透過這些實踐,讀者將能更深入地理解 Terraform 如何管理複雜的雲端網絡架構。
定義網絡資源
在 Terraform 中,資源之間的依賴關係至關重要。Terraform 會根據這些依賴關係來確定資源的創建順序。
虛擬網絡 (Virtual Network)
我們首先定義一個虛擬網絡,並將其關聯到之前創建的資源群組。
resource "azurerm_virtual_network" "vnet" {
name = "book-vnet"
location = "West Europe"
address_space = ["10.0.0.0/16"]
resource_group_name = azurerm_resource_group.rg.name
}
在此代碼塊中:
name: 指定虛擬網絡的名稱為book-vnet。location: 設置虛擬網絡的部署區域為West Europe。address_space: 定義虛擬網絡的 IP 地址空間,這裡為10.0.0.0/16。resource_group_name: 這是關鍵的依賴關係聲明。通過引用azurerm_resource_group.rg.name,我們明確指示 Terraform,此虛擬網絡將創建在名為bookRg的資源群組中。Terraform 會確保在創建此虛擬網絡之前,bookRg資源群組已經存在。
子網 (Subnet)
接著,我們在虛擬網絡內創建一個子網。
resource "azurerm_subnet" "subnet" {
name = "book-subnet"
virtual_network_name = azurerm_virtual_network.vnet.name
resource_group_name = azurerm_resource_group.rg.name
address_prefix = "10.0.10.0/24"
}
在此代碼塊中:
name: 指定子網的名稱為book-subnet。virtual_network_name: 這裡再次體現了 Terraform 的引用機制。通過azurerm_virtual_network.vnet.name,我們將此子網與之前定義的book-vnet虛擬網絡關聯起來。這意味著 Terraform 會在虛擬網絡創建完成後,再創建此子網。resource_group_name: 同樣,指定子網所屬的資源群組為bookRg。address_prefix: 定義子網的 IP 地址範圍,這裡為10.0.10.0/24。
這種通過引用其他資源的屬性來建立依賴關係的方式,是 Terraform 管理複雜基礎設施的強大之處,它確保了資源的創建順序正確無誤。
定義虛擬機器的網絡組件
接下來,我們將配置虛擬機器的網絡相關組件,包括網絡接口、公共 IP 地址和診斷存儲。
網絡接口 (Network Interface, NIC)
網絡接口是虛擬機器連接到虛擬網絡的橋樑。
resource "azurerm_network_interface" "nic" {
name = "book-nic"
location = "West Europe"
resource_group_name = azurerm_resource_group.rg.name
ip_configuration {
name = "internal"
subnet_id = azurerm_subnet.subnet.id
private_ip_address_allocation = "Dynamic"
}
}
在此代碼塊中:
name: 指定網絡接口的名稱為book-nic。location: 設置部署區域。resource_group_name: 指定所屬資源群組。ip_configuration: 這是網絡接口的核心配置,定義了其 IP 地址配置。name: IP 配置的名稱。subnet_id: 關鍵的依賴聲明,通過azurerm_subnet.subnet.id引用了之前定義的子網的 ID,確保網絡接口被創建在正確的子網內。private_ip_address_allocation: 設置為Dynamic,表示將分配一個動態的私有 IP 地址。
從職涯發展的長期價值評估,掌握基礎設施即代碼(IaC)已非單純技術選項,而是管理者從被動維運轉向主動架構治理的思維躍遷。Terraform 作為核心實踐工具,其學習路徑正反映了此轉變過程。
此路徑的挑戰並非記憶語法,而是建立資源依賴的心智模型,並將安全實踐內化為本能。在正式環境採用服務主體、開發環境利用 CLI 登入的權衡,即是安全性與敏捷性間的決策智慧。將憑證自代碼剝離,不僅是技術操作,更是風險管理思維在工程文化中的具體落地,展現了技術領導者的成熟度。
展望未來,精通 IaC 的管理者將不僅是資源調度者,更是雲端架構的設計師與成本效益的精算師,能將基礎設施管理從執行層面提升至可審計、可預測的戰略高度。
玄貓認為,技術領導者應著重將此實踐從個人技能提升為團隊治理框架,方能將技術優勢,完全轉化為組織穩健發展的長期競爭力。