基礎設施即代碼(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 文件。然而,將敏感憑證以明文形式儲存在代碼庫中,尤其是在代碼可能被多人訪問或儲存在版本控制系統中時,存在嚴重的安全隱患。

為了提升安全性,我們應採取以下改進措施:

  1. 移除配置文件中的憑證資訊: 修改 provider.tf 文件,移除直接寫入的身份驗證參數。配置將變為:

    provider "azurerm" {
      features {}
    }
    

    此配置僅聲明使用 azurerm 提供者,並保留了 features 塊以供將來可能進行的提供者行為自定義。

  2. 透過環境變數傳遞憑證: 將 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): 這些是資源的實際屬性,例如 namelocation,以及 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 的管理者將不僅是資源調度者,更是雲端架構的設計師與成本效益的精算師,能將基礎設施管理從執行層面提升至可審計、可預測的戰略高度。

玄貓認為,技術領導者應著重將此實踐從個人技能提升為團隊治理框架,方能將技術優勢,完全轉化為組織穩健發展的長期競爭力。