BÀI 4: Hiểu về hướng viết theo dạng Module trong Terraform – Cấu trúc, tổ chức, tái sử dụng Chuyên mục Devops 2025-05-15 2 Lượt xem 2 Lượt thích 0 Bình luận
Mục tiêu bài học
- 
Hiểu module là gì trong Terraform 
- 
Phân biệt root module và child module 
- 
Biết cách tổ chức folder theo dạng module 
- 
Học cách truyền biến giữa các module 
- 
Giúp code gọn gàng, tái sử dụng, dễ bảo trì 
🤔 1. Terraform Module là gì?
Module là tập hợp các file Terraform (.tf) được đóng gói và sử dụng như 1 khối có thể tái sử dụng.
Bất kỳ thư mục nào chứa .tf cũng có thể là một module.
Có 2 loại:
| Loại | Mô tả | 
|---|---|
| Root Module | Là nơi bạn chạy terraform apply, terraform plan, thường là thư mục gốc của dự án | 
| Child Module | Module được gọi từ root module hoặc module khác | 
📦 2. Tại sao nên dùng module?
| Lợi ích | Giải thích | 
|---|---|
| 🔁 Tái sử dụng | Viết một lần – dùng cho nhiều môi trường (dev, staging, prod) | 
| 🧹 Gọn gàng | Tách code phức tạp ra nhiều phần nhỏ | 
| 🧪 Dễ kiểm thử | Có thể test riêng từng module | 
| 💼 Dễ mở rộng | Dễ quản lý khi dự án lớn lên | 
🧱 3. Cấu trúc thư mục dạng module chuẩn
Ví dụ bạn muốn tạo một module triển khai EC2:
terraform-ec2-module-lab/
├── main.tf
├── variables.tf
├── outputs.tf
├── terraform.tfvars
├── modules/
│   └── ec2/
│       ├── main.tf
│       ├── variables.tf
│       └── outputs.tf- 
main.tf ở root gọi module ec2 từ thư mục modules/ec2 
- 
Module ec2 có thể dùng ở bất kỳ nơi nào khác 
📥 4. Gọi module như thế nào?
Từ main.tf ở root:
module "ec2_instance" {
  source         = "./modules/ec2"
  ami_id         = var.ami_id
  instance_type  = var.instance_type
  key_name       = var.key_name
  subnet_id      = var.subnet_id
}📤 5. Truyền input vào module (biến)
Trong modules/ec2/variables.tf:
variable "ami_id" {}
variable "instance_type" {}
variable "key_name" {}
variable "subnet_id" {}Terraform cho phép bạn truyền biến từ root vào module, giống như gọi hàm và truyền tham số.
📥 6. Trả output từ module
Trong modules/ec2/outputs.tf:
output "instance_id" {
  value = aws_instance.web.id
}Tại root, bạn có thể dùng lại:
output "ec2_id" {
  value = module.ec2_instance.instance_id
}🛠️ 7. Một số lưu ý quan trọng
| Vấn đề | Giải thích | 
|---|---|
| 🔁 Không dùng hardcode | Luôn dùng biến (variable) thay vì giá trị cố định | 
| ✅ Tách nhỏ hợp lý | Mỗi module chỉ nên làm 1 việc: ec2, vpc, s3,... | 
| 🔐 Không commit nhầm | Bỏ terraform.tfstate, .terraform vào .gitignore | 
| 🧪 Dùng default test | Dùng môi trường nhỏ để test module trước khi đưa vào prod | 
💡 Tổng kết
| Bạn đã học được | Ghi nhớ | 
|---|---|
| ✅ Khái niệm và vai trò module | Là đơn vị tái sử dụng hạ tầng | 
| ✅ Cách tổ chức module chuẩn | main.tf, variables.tf, outputs.tf | 
| ✅ Cách truyền biến vào/ra | input, output | 
| ✅ Gọi module từ root module | module "x" { source = "..." } | 
👉 Tiếp theo: [Bài 5: Bài lab cơ bản sử dụng Terraform theo hướng module – ví dụ triển khai EC2]
 
                        
                                         
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                     
                                                    
Bình luận (0)