ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်
Server ၅ လုံးကို resource block ၅ ခု manual copy-paste ရေးမယ့်အစား, `count = 5` ဆိုတာမျိုး resource block ထဲ ထည့်ရင် Terraform က ၅ ခါ ထပ်ခါ create ပေးပါတယ် — `count.index` (0,1,2,3,4) ကို resource name/tag ထဲမှာ သုံးနိုင်ပါတယ်။ `for_each` ကတော့ list/map ကို loop ခြင်းအတွက်ပါ — `count` ထက် ပိုသင့်တော်တာက item တွေကို 'index number' (0,1,2) မဟုတ်ဘဲ 'meaningful key' (ဥပမာ - server name) နဲ့ track လုပ်ချင်တဲ့အခါပါ (list ရဲ့ item တစ်ခု ဖျက်လိုက်ရင် `count` က index shift ဖြစ်ပြီး resource အားလုံး recreate ဖြစ်နိုင်ပေမယ့် `for_each` က ကျန်တဲ့ item တွေကို မထိခိုက်ပါ)။ Dynamic block ကတော့ nested block (ဥပမာ - security group ရဲ့ `ingress` rule အများ) ကို loop ဖြင့် generate လုပ်ဖို့ပါ.
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
`for_each = toset(["web", "api", "worker"])` ရေးထားရင် server ၃ လုံး (web, api, worker အမည်နဲ့) create ဖြစ်ပါတယ် — `each.key`/`each.value` ကို resource ထဲမှာ reference လုပ်နိုင်ပါတယ်။ Server list ထဲက 'api' ကို ဖျက်လိုက်ရင် `for_each` သုံးထားရင် 'api' ကိုသာ destroy ပြီး, 'web'/'worker' ကို ဘာမှ မထိခိုက်ပါဘူး — `count` သုံးထားရင်တော့ index shift ကြောင့် server အားလုံး ပြန် recreate ဖြစ်နိုင်ပါတယ်.
အတူတူ ကြည့်မယ်
# count: index-based
resource "aws_instance" "worker" {
count = 3
ami = "ami-0abcdef1234567890"
instance_type = "t3.micro"
tags = {
Name = "worker-${count.index}"
}
}
# for_each: key-based (safer when removing items)
resource "aws_instance" "app" {
for_each = toset(["web", "api", "worker"])
ami = "ami-0abcdef1234567890"
instance_type = "t3.micro"
tags = {
Name = each.value
}
}$ terraform apply
aws_instance.app["api"]: Creating...
aws_instance.app["web"]: Creating...
aws_instance.app["worker"]: Creating...
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.၅ မိနစ် စမ်းကြည့်
`for_each` ကို သုံးပြီး `local_file` resource ၃ ခု (ကွဲပြားတဲ့ filename နဲ့) တစ်ပြိုင်နက် create ကြည့်ပါ — list ထဲက item တစ်ခုကို ဖျက်ပြီး `apply` ထပ်run ကြည့်ကာ ကျန် file တွေ မထိခိုက်ကြောင်း confirm လုပ်ကြည့်ပါ။
သတိလေးတစ်ချက်
`count`/`for_each` ကို resource တစ်ခုတည်းအတွက် တစ်ပြိုင်နက် သုံးလို့ မရပါ — resource type တစ်ခုစီအတွက် နှစ်ခုထဲက တစ်ခုပဲ ရွေးချယ်ရပါမယ်။