ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်
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 ကို ၂ ကြိမ်ရေးစရာ မလိုတော့ပါ.
အတူတူ ကြည့်မယ်
# 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"
}$ 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 လုပ်ပါ။