iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
DevOps

Terraform 從零開始 - 實戰Lab打造GCP雲端自動化架構系列 第 15

Day 15 — Terraform基礎 — Backend 遠端狀態後台的概念與使用

  • 分享至 

  • xImage
  •  

文章目標:說明 Terraform 的後端設定,以及如何選擇和配置後端來管理狀態。

Day 15 — Terraform基礎 — Backend 的概念與使用

文章同步分享到

1. Backend 遠端狀態後台

Backend 遠端狀態後台介紹

Terraform 會使用一個遠端狀態後台(Remote State Backend)來存儲和共享 Terraform 的狀態信息。這有助於團隊合作、安全性、可追蹤性和管理 Terraform 代碼的版本控制。

說得這樣複雜,其實Backend 遠端狀態後台它本質就是一個戰情中心,所有的狀態都會到這個地方做交換,同時將訊息做同步,幫助我們控制架構的情況,而不是將狀態存在本地端。

Terraform Backend 遠端狀態後台 — 戰情中心 (圖片來源:freepik)

Backend 遠端狀態後台概念與實作

  1. 概念:Backend 是指遠端狀態後台,用於儲存 Terraform 配置的狀態,使多個開發人員可以協同編輯配置

  2. 用途:Terraform 會將狀態文件存儲在遠端位置,例如 AWS S3、GCP Storage 或 HashiCorp Consul 等,以協調多個開發人員對同一基礎設施進行更改。

  3. 常見Backend類型:AWS S3、GCP Storage、Azure Blob、HashiCorp Consul、HashiCorp Terraform Cloud 等。

  4. 配置方式:可以在 Terraform 配置文件中定義 Backend,也可以使用命令行參數或環境變數指定 Backend。

Terraform Backend 遠端狀態後台配置

Terraform Backend(遠端狀態後台)- GCS 狀態存儲 Backend

2. 實際Terraform操作

任務目標

  1. 使用GCP的cloud shell環境,來執行terraform (沒有使用過請參閱Terraform 工作流程)

  2. 產生一個GCS存儲服務作為狀態後台 state backend

  3. 在部署一個新的GCS存儲服務,並將狀態存在狀態後台 state backend

啟動cloud shell並輸入代碼

創建專案以後,右上角先啟動cloud shell,並選擇使用vscode 編輯器開啟新頁面。

啟動cloud shell

新建或開啟main.tf的檔案

進入vscode 編輯器後,新建或開啟main.tf的檔案,並複製下列程式碼到視窗中,我們要利用這些程式碼練習,可以先輸入練習後,再來回來看代表的意義。

範例程式碼:產生一個GCS存儲服務作為狀態後台 state backend

可以到下方的github連結中,下載對應的參考程式碼

  1. Terraform-from-zero-to-hero-10-Lab-GCP-Infrastucture-as-Code

  2. Day 15 — Terraform基礎 — Backend 遠端狀態後台的概念與使用

這邊建議直接下載github連結的整個檔案來練習,首先按照下列步驟

  1. 先進入state-bucket 資料夾產生遠端的gcs作為backend
cd state-bucket
terraform init
terraform apply -auto-approve

or 快捷部署

tf init
tfd
  1. 回到原先路徑,部署新的 bucket
cd ..
terraform init
terraform apply -auto-approve

or 快捷部署

tf init
tfd
  1. 觀察GCS檔案是否產生state.json檔案

Terraform Backend(遠端狀態後台)- GCS 狀態存儲 Backend

3. 詳細說明state-bucket的產生方式

首先創建一個state-bucket的資料夾,裡面包含三個檔案,分別是 0-provider.tf, 1-variables.tf, 2-main.tf,我們會在裡面創建GCS作為state-bucket,以供後續的部署使用

0-provider.tf,

##################################################################################
# CONFIGURATION
##################################################################################
terraform {
  # 指定 terraform 的最小版本
  required_version = ">=1.0"
  required_providers {
    # provider 中的最小版本
    google = {
      source  = "hashicorp/google"
      version = ">= 4.40.0"
    }
  }
}

##################################################################################
# PROVIDERS
##################################################################################
provider "google" {
  # your project name
  project = "terraform101-384507"
}

這個檔案主要用於配置 Terraform 的提供者(provider),以確保 Terraform 可以正確地與 Google Cloud Platform(GCP)進行交互。

  • terraform :這個區塊設定了 Terraform 的版本要求,確保使用的版本符合最低要求大於4.40.0版本。同時,它也定義了所需的提供者和版本。

  • provider "google" :這個區塊指定了要使用的 GCP 提供,指定了 GCP 專案 ID(由 var. GCP_PROJECT 變數提供)。

1-variables.tf

variable "GCP_PROJECT" {
  description = "GCP Project ID"
  type        = string
  default     = "terraform101-384507"
}

variable "gcs_name" {
  type    = string
  default = "terraform-101-state-bucket"
}

variable "location" {
  type    = string
  default = "asia-east1"
}

這個檔案用於定義 Terraform 使用的變數,以實現更高度的可配置性和重用性。

  • variable "GCP_PROJECT":這是 GCP 專案 ID 的變數,它描述了 GCP 專案的 ID。它的預設值是 "terraform101-384507",但可以在使用時指定不同的值。

  • variable "location":這是定義網路服務所在位置(地區)的變數。

  • variable "gcs_name":這是用於定義 Google Cloud Storage 名稱的變數。

2-main.tf

resource "google_storage_bucket" "quick_start_gcs" {
  name          = var.gcs_name
  location      = var.location
  force_destroy = true
}

這個檔案的用途是定義和配置一個 Google Cloud Storage 存儲資源(Google Storage Bucket):

  • name:terraform-101-state-bucket 是這個資源的名稱,用於在 Terraform 配置中識別和引用這個存儲資源實例。。

  • location:通過變數 var.location,你可以指定存儲資源的位置,這表示存儲資源存放的地理位置。

  • force_destroy:表示當你刪除 Terraform 資源時,即使存儲資源中有數據,也將強制刪除存儲資源。。

最後執行 terraform apply -auto-approve來部署對應的資源到雲端架構上,就可以得到下列的結果。

terraform apply -auto-approve

Google Cloud Storage 存儲資源作為 state-bucket (1/2)

Google Cloud Storage 存儲資源作為 state-bucket (2/2)

Terraform tip:可以利用下列的 Terraform tip,來增進部署效率。

  1. 打開終端機中的 .bashrc or .zshrc 檔案

  2. 在文件最下方加入下列指令

  3. 執行 source ~/.zshrc 或是 source ~/.bashrc 讓下面的 alias 快捷鍵生效

alias tf="terraform"
alias tfv="terraform validate"
alias tfdp="terraform apply -auto-approve plan.out"
alias tfd="terraform apply -auto-approve"
alias tfr="terraform destroy -auto-approve"
alias tfp="terraform plan -out plan.out"

4. 詳細說明如何引用state-bucket作為狀態後台,進行terraform部署

state-bucket的資料夾外層創建四個檔案,分別是創建四個檔案,分別是 0-provider.tf, 1-variables.tf, 2-main.tf, 3-output.tf,我們會利用剛剛創建GCS得作為狀態後台state backend,來實際的練習。

跟之前的練習非常相似,此處0-provider.tf的backend設定是最大的不同點。

0-provider.tf,

##################################################################################
# CONFIGURATION
##################################################################################
terraform {
  # 指定 terraform 的最小版本
  required_version = ">=1.0"
  required_providers {
    # provider 中的最小版本
    google = {
      source  = "hashicorp/google"
      version = ">= 4.40.0"
    }
  }
}

##################################################################################
# PROVIDERS
##################################################################################
provider "google" {
  # your project name
  project = "terraform101-384507"
}

##################################################################################
# Backend
##################################################################################
terraform {
  backend "gcs" {
    bucket = "terraform-101-state-bucket"
    prefix = "terraform/state"
  }
}

這個檔案主要用於配置 Terraform 的提供者(provider),以確保 Terraform 可以正確地與 Google Cloud Platform(GCP)進行交互。

  • terraform :這個區塊設定了 Terraform 的版本要求,確保使用的版本符合最低要求大於4.40.0版本。同時,它也定義了所需的提供者和版本。

  • provider "google" :這個區塊指定了要使用的 GCP 提供,指定了 GCP 專案 ID(由 var. GCP_PROJECT 變數提供)。

  • backend "gcs":這是Terraform使用GCS作為後端的配置。bucket:這個參數指定了用於存儲Terraform狀態文件(state file)的GCS存儲名稱。在這個例子中,存儲資源名稱是 "terraform-101-state-bucket"。這個存儲資源應該提前在Google Cloud中創建
    prefix:這個參數指定了Terraform狀態文件的存儲路徑(prefix),在這個例子中,狀態文件將存儲在 "terraform/state" 目錄下。這個路徑可以根據項目的需要進行自定義,通常用於區分不同的Terraform項目。

1-variables.tf

variable "GCP_PROJECT" {
  description = "GCP Project ID"
  type        = string
  default     = "terraform101-384507"
}

variable "gcs_name" {
  type    = string
  default = "quick-start-gcs-bucket-state"
}

variable "location" {
  type    = string
  default = "asia-east1"
}

這個檔案用於定義 Terraform 使用的變數,以實現更高度的可配置性和重用性。

  • variable "GCP_PROJECT":這是 GCP 專案 ID 的變數,它描述了 GCP 專案的 ID。它的預設值是 "terraform101-384507",但可以在使用時指定不同的值。

  • variable "location":這是定義網路服務所在位置(地區)的變數。

  • variable "gcs_name":這是用於定義 Google Cloud Storage 名稱的變數,此處我們使用 quick-start-gcs-bucket-state 來做對應的區分。

2-main.tf

resource "google_storage_bucket" "quick_start_gcs" {
  name          = var.gcs_name
  location      = var.location
  force_destroy = true
}

這個檔案的用途是定義和配置一個 Google Cloud Storage 存儲資源(Google Storage Bucket):

  • name:terraform-101-state-bucket 是這個資源的名稱,用於在 Terraform 配置中識別和引用這個存儲資源實例。。

  • location:通過變數 var.location,你可以指定存儲資源的位置,這表示存儲資源存放的地理位置。

  • force_destroy:表示當你刪除 Terraform 資源時,即使存儲資源中有數據,也將強制刪除存儲資源。

3-output.tf

output "bucket_name" {
  value = google_storage_bucket.quick-start-gcs.name
}

output "bucket_location" {
  value = google_storage_bucket.quick-start-gcs.location
}

這兩個 Terraform 輸出使你能夠取得已經建立的 Google Cloud Storage 存儲資源的名稱和位置,以便在需要時可以在其他 Terraform 模塊、外部工具或文件中使用這些信息

  • bucket_name:通過 value 欄位設置,它將等於 Terraform 資源 google_storage_bucket.quick-start-gcs 的名稱 (name)。這允許你在部署後輕鬆地檢索存儲資源的名稱,以便在其他 Terraform 代碼或外部應用程序中使用。

  • bucket_location:通過 value 欄位設置,它將等於 Terraform 資源 google_storage_bucket.quick-start-gcs 的位置 (location)。
    這允許你在部署後輕鬆地檢索存儲資源的位置,以便了解存儲資源在 Google Cloud 中的地理位置信息。

最後執行 terraform apply -auto-approve來部署對應的資源到雲端架構上,就可以得到下列的結果。

terraform apply -auto-approve

引用state-bucket作為狀態後台,進行terraform部署

引用state-bucket作為狀態後台,進行terraform部署第二個GCS成功

terraform部署第二個GCS成功,查看狀態檔案

terraform部署遠端狀態檔案 state.json

5. 總結 Summary

  1. Backend 遠端狀態後台介紹:介紹了Terraform 使用遠端狀態後台來存儲和共享 Terraform 的狀態信息的重要性。它可以作為一個中央控制點,幫助團隊協作、確保安全性、可追蹤性,並有效地管理 Terraform 代碼的版本控制。

  2. Backend 遠端狀態後台概念與實作:遠端狀態後台(Backend),它是用於儲存 Terraform 配置的狀態的遠端位置,以便多個開發人員可以協同工作。常見的後端類型,如 AWS S3、GCP Storage、Azure Blob、HashiCorp Consul、HashiCorp Terraform Cloud 等。配置後端的方式,可以在 Terraform 配置文件中定義,也可以使用命令行參數或環境變數指定。

  3. 實際Terraform操作:提供了一個實際的操作示例,使用 Google Cloud Shell 環境來創建 GCS 存儲服務作為狀態後台 state backend。包括初始化 Terraform、創建存儲服務、觀察狀態文件等。

  4. 詳細說明state-bucket的產生方式:解釋如何創建 Google Cloud Storage 存儲資源,並使用變數來實現配置的可配置性。展示如何使用Google Cloud Storage作為 Terraform 記錄狀態檔案的方式與配置文件。

  5. 詳細說明如何引用state-bucket作為狀態後台:介紹了如何在 Terraform 配置中引用 GCS 存儲資源作為狀態後台。展示如何設置 Terraform 的提供者和後端,以將狀態文件存儲在 GCS 中。。

6. 相關連結

  1. Terraform-from-zero-to-hero-10-Lab-GCP-Infrastucture-as-Codehttps://github.com/qwedsazxc78/Terraform-from-zero-to-hero-10-Lab-GCP-Infrastucture-as-Code

  2. Terraform-project-best-practicehttps://github.com/qwedsazxc78/terraform-project-best-practice

  3. 歡迎訂閱我的udemy課程:Terraform 從零開始 - 10+實戰Lab打造GCP雲端自動化架構課程 - https://devops-with-alex.com/go/terraform


上一篇
Day 14— Terraform基礎 —State 的概念與使用
下一篇
Day 16 — Terraform/GCP基礎— GCP服務帳號 (Service Account) 與使用者 (User) 的差異
系列文
Terraform 從零開始 - 實戰Lab打造GCP雲端自動化架構31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言