iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0
DevOps

30 天 Terraform 學習筆記:從零開始的 IaC 實戰系列 第 20

Day 20 - Terraform 迴圈與條件邏輯:for_each、count、條件表達式

  • 分享至 

  • xImage
  •  

昨天我們聊到Resource Lifecycle,了解如何透過 create_before_destroyprevent_destroy 等設定來保護資源不被意外刪除,或避免服務在更新時中斷。

今天要進入另一個常遇到的主題:迴圈與條件邏輯。
因為在現實的專案裡,很少只有一兩個資源,更多時候我們會需要建立一組相似的資源,或根據環境、參數來決定要不要建立。這時候如果一個一個手動複製貼上,不僅麻煩,還很容易出錯。Terraform 就提供了 countfor_each 與條件表達式,幫助我們用更程式化的方式產生資源。

count:最簡單的迴圈

count 是 Terraform 最直覺的迴圈工具,它允許我們根據數字,建立多個相同類型的資源。
舉個例子:如果我要建立三個 GCS bucket,只需要這樣寫:

resource "google_storage_bucket" "example" {
  count    = 3
  name     = "my-bucket-${count.index}"
  location = "US"
}

Terraform 會自動生成:

  • my-bucket-0
  • my-bucket-1
  • my-bucket-2

這種方式很適合單純「一組重複資源」的場景。
但缺點是:count.index 只能用數字來定位,對於需要依據 key 來管理的資源會比較不直覺。

for_each:用 map / set 來控制

當我們需要依據一組清單或對應表來建立資源時,for_each 更靈活。
舉個例子:有三個不同環境的 bucket,要給不同名稱:

resource "google_storage_bucket" "example" {
  for_each = toset(["dev", "test", "prod"])

  name     = "my-bucket-${each.key}"
  location = "US"
}

結果會建立:

  • my-bucket-dev
  • my-bucket-test
  • my-bucket-prod

這樣的好處是:能直接用 each.keyeach.value 來管理資源,資源名稱也更清晰。
如果使用 map,甚至能為不同資源指定額外參數:

variable "buckets" {
  default = {
    dev  = "US"
    test = "ASIA"
    prod = "EU"
  }
}

resource "google_storage_bucket" "example" {
  for_each = var.buckets

  name     = "my-bucket-${each.key}"
  location = each.value
}

這樣就能依照環境,分別部署在不同地區,非常直覺!

條件表達式:靈活控制建立與參數

除了迴圈,有時我們也需要條件判斷來決定要不要建立資源,或是選擇不同的參數。
Terraform 提供了類似三元運算子的語法:

condition ? true_value : false_value

舉個例子:如果只想在 production 建立備援 bucket:

resource "google_storage_bucket" "backup" {
  count    = var.env == "prod" ? 1 : 0
  name     = "backup-bucket"
  location = "US"

如果 var.envprod,就會建立一個 bucket;否則就不會建立。
當然也可以用條件表達式來切換參數,例如 VM 機器類型:

resource "google_compute_instance" "app" {
  name         = "app-server"
  machine_type = var.env == "prod" ? "e2-standard-4" : "e2-micro"
  zone         = var.zone
}

這樣 dev/test 可以用便宜的規格,prod 才使用高規格機器,可以省錢又很彈性~

混合應用:更靈活的基礎設施

把上面的方式靈活搭配,就能讓基礎設施的配置更簡潔,甚至應對不同情境也能自動調整。

count + 條件判斷:

resource "google_storage_bucket" "optional" {
  count = var.enable_bucket ? 1 : 0
  name  = "conditional-bucket"
}

for_each + 條件表達式:

resource "google_storage_bucket" "region_buckets" {
  for_each = var.env == "prod" ? var.prod_buckets : {}

  name     = each.key
  location = each.value
}

透過這些組合,我們就可以大幅減少重複的程式碼,讓基礎設施更模組化且自動化

💡 小提醒

  • count 適合純數量控制(多份相同資源)。
  • for_each 適合有 key/value 關係(更清晰的資源命名與管理)。
  • 條件表達式可靈活控制資源是否建立,或參數如何選擇。
  • 在複雜專案裡,盡量搭配 module,一起運用迴圈與條件,會更乾淨好維護。

總結一下

今天我們探討了 Terraform 中三個實用的工具:

  • count:用來快速建立多個相同的資源
  • for_each:透過 map 或 set 來產生資源,命名更清楚、管理更直覺
  • 條件表達式:決定資源是否要建立,或在不同情境下切換參數

這些技巧雖然語法簡單,但卻是 Terraform 專案中不可或缺的基礎能力。
因為在真實世界裡,基礎設施很少會一模一樣,我們常常需要同時建立一批資源,還要依據環境或需求去做調整。掌握這些迴圈與條件邏輯,也能讓程式碼更乾淨,部署起來更自動化,也更貼近真實場景的需求~


上一篇
Day 19 - Resource Lifecycle 管理:create_before_destroy、prevent_destroy、Ignore changes
系列文
30 天 Terraform 學習筆記:從零開始的 IaC 實戰20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言