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

Modules

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

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

  • Modules ကို ကြောက်စရာမလိုအောင် နားလည်မယ်
  • ကိုယ်တိုင် terraform command/HCL code ကို run ကြည့်တတ်မယ်
  • Real project ထဲမှာ ဒီ concept ကို ချက်ချင်း အသုံးချတတ်မယ်

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

Environment (dev/staging/prod) သုံးခုစလုံးအတွက် server + database + network ကို manual copy-paste ရေးရင်, structure တူတဲ့ code ကို ၃ နေရာ maintain ရမှာမို့ error-prone ပါတယ် — bug တစ်ခု တွေ့ရင် နေရာ ၃ နေရာလုံး ပြင်ရပါလိမ့်မယ်။ Module က ဒီ code ကို 'function' လိုမျိုး တစ်ခါရေးထားပြီး, `module "name" { source = "./path"; input = value }` ဆိုတာမျိုးနဲ့ ခေါ်သုံးနိုင်ပါတယ် — dev/staging/prod ၃ ခုစလုံးက module တစ်ခုတည်းကို instance_size, environment name value ကွဲပြားစွာ ပေးပို့ ခေါ်သုံးလို့ရပါတယ်။ Module ရဲ့ input ကို variable, output ကို output block နဲ့ define လုပ်ပါတယ်.

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

`modules/web-app/` folder ထဲမှာ `main.tf` (resource), `variables.tf` (input), `outputs.tf` (output) ရေးထားပြီး, root config ထဲမှာ `module "dev" { source = "./modules/web-app"; instance_type = "t3.micro" }` နဲ့ `module "prod" { source = "./modules/web-app"; instance_type = "t3.large" }` ဆိုပြီး တစ်ခါတည်း ၂ ကြိမ် ခေါ်သုံးလို့ရပါတယ် — module ထဲက code ကို ၂ ကြိမ်ရေးစရာ မလိုတော့ပါ.

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

hcl
# modules/web-app/main.tf
variable "instance_type" {
  type = string
}

resource "aws_instance" "web" {
  ami           = "ami-0abcdef1234567890"
  instance_type = var.instance_type
}

output "public_ip" {
  value = aws_instance.web.public_ip
}

# root main.tf
module "dev" {
  source        = "./modules/web-app"
  instance_type = "t3.micro"
}

module "prod" {
  source        = "./modules/web-app"
  instance_type = "t3.large"
}
You should see
$ terraform apply
module.dev.aws_instance.web: Creating...
module.prod.aws_instance.web: Creating...

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

၅ မိနစ် စမ်းကြည့်

`modules/web-app/` folder တစ်ခု ဖန်တီးပြီး (variables.tf, main.tf, outputs.tf ခွဲရေးပါ) root config ကနေ instance_type ကွဲပြားစွာ ပေးပို့ကာ ၂ ကြိမ် ခေါ်သုံးကြည့်ပါ။

သတိလေးတစ်ချက်

Module ကို ပြောင်းလဲပြီး apply ရင် module ကို instance ခေါ်သုံးထားတဲ့ environment အားလုံးကို ထိခိုက်နိုင်ပါတယ် — production module ကို ပြောင်းလဲခင် staging မှာ အရင် test လုပ်ပါ။

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

  • Module input variable ကို default value မထားဘဲ, root config ကနေ value မပေးပို့ဘဲ ခေါ်သုံးပြီး error ရခြင်း
  • Module ထဲမှာ hardcode value (region, instance_type) ရေးထားခြင်း — module ရဲ့ point က reusable ဖြစ်ဖို့ပါ, hardcode ရေးရင် reusability ပျောက်သွားပါတယ်

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

`modules/web-app/` folder တစ်ခု ဖန်တီးပြီး (variables.tf, main.tf, outputs.tf ခွဲရေးပါ) root config ကနေ instance_type ကွဲပြားစွာ ပေးပို့ကာ ၂ ကြိမ် ခေါ်သုံးကြည့်ပါ။

You'll know it worked when: $ terraform apply module.dev.aws_instance.web: Creating... module.prod.aws_instance.web: Creating... Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Modules | Thuta Learning