Thuta Learning
ရှာဖွေရန်
AdvancedDevOpsintermediate

Loops & Conditionals (count, for_each, dynamic)

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Loops & Conditionals (count, for_each, dynamic) ကို ကြောက်စရာမလိုအောင် နားလည်မယ်
  • ကိုယ်တိုင် terraform command/HCL code ကို run ကြည့်တတ်မယ်
  • Real project ထဲမှာ ဒီ concept ကို ချက်ချင်း အသုံးချတတ်မယ်

ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်

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 ဖြစ်နိုင်ပါတယ်.

အတူတူ ကြည့်မယ်

hcl
# 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
  }
}
You should see
$ 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 တစ်ခုစီအတွက် နှစ်ခုထဲက တစ်ခုပဲ ရွေးချယ်ရပါမယ်။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • List ထဲက item အလယ်က တစ်ခု ဖျက်ရင် `count` သုံးထားရင် resource အားလုံး index shift ဖြစ်ပြီး recreate ဖြစ်တတ်ကြောင်း မသိဘဲ production မှာ `count` သုံးမိခြင်း
  • `for_each` ထဲမှာ `toset()` မလုပ်ဘဲ list ကို တိုက်ရိုက် ပေးလိုက်ခြင်း — `for_each` က set/map ပဲ လက်ခံပါတယ်, list ကို toset() ဖြင့် convert ရပါမယ်

အခု ကိုယ်တိုင် စမ်းကြည့်

`for_each` ကို သုံးပြီး `local_file` resource ၃ ခု (ကွဲပြားတဲ့ filename နဲ့) တစ်ပြိုင်နက် create ကြည့်ပါ — list ထဲက item တစ်ခုကို ဖျက်ပြီး `apply` ထပ်run ကြည့်ကာ ကျန် file တွေ မထိခိုက်ကြောင်း confirm လုပ်ကြည့်ပါ။

You'll know it worked when: $ 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.

Loops & Conditionals (count, for_each, dynamic) | Thuta Learning