多年來,雲端開發經歷了一個重大的範式轉變。更新且更複雜的應用程式被快速部署到雲端,以最大程度地減少停機時間。在這一切過程中,基礎架構即代碼的概念和各種工具應運而生,以簡化應用程式開發的過程。

也許你會想知道:什麼是基礎架構即代碼?它如何改善開發過程和體驗,Terraform 又如何融入其中?好吧,我們將在本指南中探討所有這些問題以及更多。但在我們開始之前,這裡有一些先決條件:

  • 對雲端和雲端術語的基本知識

  • 可存取電腦以實現程式碼示例

  • 一個 GCP 帳戶

有了這些,讓我們開始吧。

以下是我們將涵蓋的內容:

  1. 基礎架構即代碼概述

  2. Terraform 是什麼?

  3. Terraform 的好處

  4. Terraform中常用的術語

  5. 演示項目:如何編寫Terraform配置

  6. 結論

基礎架構即代碼(IaC)概述

基礎架構即代碼是指使用基於代碼的配置文件生成雲基礎架構工具和應用程序。在運行時,這個過程自動化創建數據庫、虛擬機器和服務器的序列和過程。這樣可以通過減少手動部署雲服務的頻率,尤其是對於多個相同服務,來提高用戶體驗。

基礎架構即代碼有兩種明顯的方法:「命令式」方法和「聲明式」方法。

當您使用聲明式方法來生成基礎設施時,您只需詳細說明您期望/希望生成的基礎設施輸出,然後您使用的 IaC 工具會找出如何生成該輸出。

另一方面,命令式方法涉及指定實現所需基礎設施狀態的確切步驟。儘管命令式方法似乎更適合複雜的基礎設施設置,但聲明式方法同樣有效。

有些工具既能採用聲明式方法,也能採用命令式方法,而有些則只適合其中一種。全球使用的一些熱門 IaC 工具的示例包括 Terraform IaC, AWS Cloud Formation, Ansible, 和 Pulumi, Chef, 等等。

正如名稱所示 – 基礎設施如 代碼 – 創建基礎設施的代碼是用 IaC 領域內的各種模板語言編寫的。流行的模板語言包括 JSON、YAML、ARM 模板、HCL、Heat Scripts 等。

您也可以使用腳本工具來執行雲基礎設施。一些流行的工具包括 Bash 和 PowerShell。這些工具有時會預先安裝在大多數個人電腦上。

在所有這些工具中,Terraform因為各種原因而獨特 – 這是我們將在本文中檢視的工具。

Terraform是什麼?

Terraform是由HashiCorp於2014年開發的開源工具。它多年來已經演進,現在作為一個雲不可知基礎設施工具,允許您在多個雲服務提供商之間創建基礎設施。

Terraform還提供Terraform Cloud,一個基於雲的軟件即服務工具。它允許基於雲的部署雲工具,而不是使用我們在已廢棄的Terraform CLI工具中使用的舊的本地方法。

同樣,像其他利用模板語言的IaC工具一樣,Terraform中用於創建基礎設施的模板框架是HashiCorp模板語言(HCL)。

Terraform的好處

現在我將強調作為雲工程師使用Terraform的一些好處,以及該工具在雲生態系統中的關鍵作用。

1. 声明式方法

這種對雲基礎設施自動化的方法確保所有要部署的基礎設施(數據庫、伺服器等)都被明確說明並相應執行。這有助於避免衝突。

2. 衝突處理

除了其高效的雲端工具自動化功能外,Terraform 還具備一些強大的衝突檢測和處理特性。它處理衝突的一種方式是通過 Terraform plan 功能。此功能突顯出基礎設施編排中任何感知或潛在的衝突,讓在部署前能夠輕鬆修正。我將在後續部分進一步討論這一點。

3. 雲端無關

Terraform 是一個多用途、多雲自動化服務提供商,具備在主要雲服務提供商(AWS、GCP 和 Azure)中高效的基礎設施自動化能力。它還允許混合及跨提供商的自動化。

4. 使用者友好

Terraform 是最大的雲自動化工具之一,擁有最大的使用者社群。它提供了廣泛的初學者友好教程,幫助您快速掌握該工具。這裡有一個鏈接到它的 文檔,讓您能深入了解。

5. 文件管理能力

Terraform 自動在您的本地計算機上創建自動化狀態的本地備份,以確保在任何問題發生時能夠立即恢復和處理文件。必要時,它還提供遠程備份選項到遠程雲服務提供商。

6. 版本控制

就像 Git 版本控制系統一樣,Terraform 內建了一個版本控制系統,讓你能夠追蹤 Terraform 文件的變更。如果當前版本出現錯誤,它也讓你可以回到先前版本的代碼。例如。

7. 代碼重用性

Terraform 在其開發者文檔頁面上提供了各種代碼模板,方便重用。

現在我們已經強調了 Terraform 的好處,讓我們來了解一些在 Terraform 中常用的術語及其含義。

在 Terraform 中使用的常見術語

在開始使用 Terraform 之前,你應該熟悉一些經常出現的關鍵術語。以下是你需要知道的:

  1. 提供者:在 Terraform 中,提供者是一個編程介面,讓 Terraform 能夠與各種 API 和雲服務互動。例如,你會使用提供者來與像 GCP 或 Azure 這樣的雲服務提供商進行介面連接。

  2. 模塊:模塊是在 Terraform 框架內專門創建的,可作為重用組件,讓你輕鬆協調雲服務。你還可以在模塊中存儲有關雲服務的關鍵信息,然後使用模塊變數進行修改以確保唯一性。

  3. 資源: Terraform 中的資源是指要創建的雲基礎設施組件。例如包括雲網絡、虛擬機器、可用區域和其他基礎設施。

  4. 狀態: Terraform 中的狀態概念形成了其效率的基礎。狀態跟踪您的基礎設施資源的當前配置,並包含 Terraform 創建、修改或刪除的每個資源的詳細信息。Terraform 的版本控制系統使用它來跟踪您對代碼文件所做的任何更改,並使用該信息來根據需要銷毀和提供基礎設施。

  5. 工作區: 工作區的功能有點類似版本控制系統,因為它在工作文件周圍創建了某種約束。工作區讓您以清潔和隔離的方式在同一後端內管理單個基礎架構配置的多個實例。您可以使用工作區來分隔開發、暫存和生產等環境,同時使用相同的 Terraform 配置。

演示項目: 如何編寫 Terraform 配置

在這一部分,我們將深入探討如何撰寫我們的第一個 Terraform 文件,以僅使用幾行代碼來協調一個 Google Cloud 程式虛擬機。但在我們開始之前,我們將討論您在實施演示項目之前應該了解的各種命令。

常見 Terraform 命令

  • Terraform init: 這個命令初始化 Terraform 工具並下載必要的特定於雲服務提供商的文件。它還在 Terraform 和相應的雲服務提供商之間建立連接。在我們的情況下,這是在 GCP 和 Terraform 提供者之間建立的。

  • Terraform fmt 這個命令會自動確保最佳的程式碼格式和縮排。它確保程式碼的有序執行並最小化任何錯誤。

  • Terraform plan 這個命令概述了 Terraform 程式碼的執行步驟,並檢測執行過程中可能發生的任何錯誤。它還會突顯可能妨礙執行的 Terraform 程式碼中的任何錯誤。最後,它與 Terraform 狀態管理一起工作,以檢測狀態的任何變化,並根據需要取消提供或生成任何額外的雲端服務。

  • Terraform apply這個命令執行由Terraform plan命令實施的計劃 Terraform 狀態。

  • Terraform destroy這個命令是 Terraform 計劃中的最後一個命令,用於停用或銷毀所有使用 Terraform apply 命令創建的雲服務。重要的是要注意,您應該按順序執行上述命令,以確保基礎設施正確創建。

創建一個 IaC 驅動的 GCP 虛擬機

現在您已經學會了這些重要的命令,讓我們通過創建我們的第一個 IaC 驅動的 GCP 虛擬機來測試它們。

在您的代碼編輯器中,輸入以下代碼:

provider "google" {
  project = "your-gcp-project-id"  # Replace with your GCP Project ID
  region  = "us-central1"          
  zone    = "us-central1-a"        
}

這段代碼突顯了我們用來生成所需雲資源的雲提供商。在我們的例子中,它是 Google 雲計劃。分配給它的名稱只是“google”。其他雲提供商如 AWS 和 Azure 分別是“aws”和“azure”。

第二行識別了GCP訂閱識別碼,這對於每個GCP帳戶都是獨一無二的(有助於促進準確的整合)。您應該在提供的空間中使用您自己的。

您還需要包括適合的資源區域和資源可用區域。這將作為我們將要創建的虛擬機器的物理基礎,以便我們運行它。在這種情況下,我分別選擇了美國中部區域和1-a可用區域。您可以在這裡閱讀更多關於雲區域和可用區域的信息。

resource "google_compute_instance" "vm_instance" {
  name         = "example-vm"      
  machine_type = "e2-medium"          

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11" 
    }
  }

上面的代碼片段指定了將被組織的確切計算資源,而在我們的情況下,是一個被編碼為“vm_instance”的虛擬機器實例。’example-vm’是我們希望為此項目創建的虛擬機器分配的名稱。重要的是要注意,虛擬機器的名稱也必須是唯一的。我們選擇的虛擬機器類型是E2(通用用途)-medium類型虛擬機器。您可以在這裡獲取有關虛擬機器類型的更多信息。

此外,我們還指定了預期啟動的操作系統(“boot_disk”),在我這裡是Debian Linux操作系統第11版本的映像。

  network_interface {
    network = "default"  # Attach to the default VPC network
    access_config {

    }
  }

output "instance_ip" {
  value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip
}

完成虛擬機器的建立,我們需要設置一個虛擬網路,以允許遠端訪問該虛擬機器。網路介面模塊將虛擬機器連接到由 GCP 提供的預設 VPC(虛擬專用雲)網路。如果沒有 VPC 網路,我們將無法與虛擬機器進行交互。輸出模塊還會在終端中顯示預設訪問 IP 地址,以供我們連接虛擬機器使用。

以下是最終預期的代碼:


provider "google" {
  project = "your-gcp-project-id"  # Replace with your GCP Project ID
  region  = "us-central1"          
  zone    = "us-central1-a"       
}

resource "google_compute_instance" "vm_instance" {
  name         = "example-vm"         
  machine_type = "e2-medium"          

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"  
    }
  }

  network_interface {
    network = "default"  # Attach to the default VPC network
    access_config {

    }
  }

output "instance_ip" {
  value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip
}

從這裡開始,我們將使用以下圖像中突出顯示的命令來執行此代碼:

命令terraform -v確認 Terraform 已成功安裝在終端中。預期的輸出將是安裝的 Terraform 工具版本。

接下來執行的命令是terraform init函數,它初始化與雲服務提供商的通信,在我們的情況下是 GCP。還會安裝所有所需的依賴項。

還會運行terraform fmt命令以確保適當的代碼格式和縮進。然後依次執行terraform plan命令。

從上面的圖像中,您可以看到 Terraform 所打算使用的步驟來生成預期的虛擬機器。

成功執行 Terraform plan 後,我們將執行terraform apply函數來執行 Terraform plan 中概述的步驟。

這將生成一個提示,要求確認 Terraform 執行,如上所示。輸入“Yes”將允許操作順利進行。

當成功執行時,將顯示如上所示的成功訊息。透過這個方式,我們僅透過程式碼就建立了我們的雲基礎設施。接著可以呼叫 terraform destroy 命令來移除所建立的虛擬機器。

結論

在本文中,您已經學習了關於基礎設施即代碼的基礎知識。我們討論了 Terraform、它的優點,以及一些關鍵特性和命令。我們也展示了它在示範項目中的應用。

為了進一步增進您的知識,您可以參考 Terraform 的文件以獲得更多的程式碼範例。我也建議利用您新獲得的知識來自動化一個具有實際用途的專案。

如有任何意見或問題,歡迎隨時與我聯絡。您也可以在這裡查看我的其他文章。下次再會,繼續撰碼吧!