昨天我們聊到Resource Lifecycle,了解如何透過 create_before_destroy
、prevent_destroy
等設定來保護資源不被意外刪除,或避免服務在更新時中斷。
今天要進入另一個常遇到的主題:迴圈與條件邏輯。
因為在現實的專案裡,很少只有一兩個資源,更多時候我們會需要建立一組相似的資源,或根據環境、參數來決定要不要建立。這時候如果一個一個手動複製貼上,不僅麻煩,還很容易出錯。Terraform 就提供了 count
、for_each
與條件表達式,幫助我們用更程式化的方式產生資源。
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
更靈活。
舉個例子:有三個不同環境的 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.key
或 each.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.env
是 prod
,就會建立一個 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 關係(更清晰的資源命名與管理)。今天我們探討了 Terraform 中三個實用的工具:
count
:用來快速建立多個相同的資源for_each
:透過 map 或 set 來產生資源,命名更清楚、管理更直覺這些技巧雖然語法簡單,但卻是 Terraform 專案中不可或缺的基礎能力。
因為在真實世界裡,基礎設施很少會一模一樣,我們常常需要同時建立一批資源,還要依據環境或需求去做調整。掌握這些迴圈與條件邏輯,也能讓程式碼更乾淨,部署起來更自動化,也更貼近真實場景的需求~