Auto Deploy Infrastructure với Terraform
Bạn đã bao giờ gặp những tình huống này chưa?
- Deploy xong production rồi không nhớ mình đã config gì — không ai dám đụng vào nữa.
- Dev chạy ngon lành, lên staging lại lỗi vì cấu hình hai môi trường không nhất quán.
- Cả team phải ngồi dựng lại hạ tầng từ đầu sau một sự cố vì không có gì được document.
- Muốn tạo môi trường mới phải mất cả ngày click trên AWS Console.
Nếu câu trả lời là “Có” — bạn đang gặp đúng vấn đề mà Infrastructure as Code sinh ra để giải quyết.
Trong bài viết này, chúng ta sẽ đi từ Terraform đến Terragrunt: từ những khái niệm cơ bản nhất cho đến cách các team thực tế quản lý hàng chục modules và environments mà không phát điên với code lặp lại.
Đối tượng: DevOps Engineers, Backend Developers, và những ai muốn tìm hiểu về Infrastructure as Code (IaC).
Mục lục
- Tại sao cần Infrastructure as Code?
- Terraform là gì?
- Cài đặt & Thực hành Terraform cơ bản
- Terraform nâng cao — Variables, Outputs, Modules
- Terraform State — Hiểu và quản lý đúng cách
- Kết luận & Phần tiếp theo
1. Tại sao cần Infrastructure as Code?

Vấn đề của quản lý hạ tầng thủ công
Trong nhiều tổ chức, việc triển khai infrastructure vẫn đang được thực hiện thủ công — hay còn gọi là ClickOps: đăng nhập vào AWS Console, click qua từng bước để tạo VPC, EC2, RDS, Security Group…
Cách làm này tạo ra hàng loạt vấn đề:
- Không nhất quán (Inconsistency): Mỗi lần deploy, mỗi người thực hiện một cách khác nhau. Môi trường dev, staging, production “trông giống nhau” nhưng thực tế khác biệt ở hàng chục cấu hình nhỏ.
- Không thể tái tạo (Not Reproducible): Khi cần dựng lại toàn bộ hạ tầng từ đầu (disaster recovery, tạo môi trường mới), không ai nhớ chính xác đã click những gì.
- Không có version control: Không thể track ai đã thay đổi gì, khi nào, và tại sao. Không rollback được.
- Tốn thời gian & dễ sai sót: Một lần setup thủ công mất hàng giờ, và chỉ cần sai một Security Group rule là có thể gây sự cố bảo mật.
Giải pháp: Infrastructure as Code (IaC)
Infrastructure as Code đơn giản là: thay vì click trên Console, bạn viết code. Toàn bộ hạ tầng — từ VPC, subnet, server, database đến DNS — được mô tả bằng file cấu hình, lưu trong Git, và deploy tự động. Hạ tầng lúc này cũng được review, version, và rollback như code bình thường.
So sánh các công cụ IaC phổ biến
| Đặc điểm | Terraform | CloudFormation | Pulumi | Ansible |
|---|---|---|---|---|
| Nhà phát triển | HashiCorp | AWS | Pulumi Inc. | Red Hat |
| Multi-cloud | ✅ Có | ❌ Chỉ AWS | ✅ Có | ✅ Có |
| Ngôn ngữ | HCL (declarative) | JSON/YAML | Python, TS, Go… | YAML |
| State management | Terraform State | CloudFormation Stack | Pulumi State | Không có |
| Cộng đồng | Rất lớn | Lớn (AWS) | Đang phát triển | Rất lớn |
| Loại công cụ | Provisioning | Provisioning | Provisioning | Configuration Mgmt |
| Learning curve | Trung bình | Thấp (nếu đã biết AWS) | Thấp (nếu biết code) | Thấp |
Tại sao chọn Terraform? Terraform nổi bật nhờ khả năng multi-cloud, cộng đồng khổng lồ với hàng nghìn providers, và cú pháp HCL trực quan dễ đọc. Đây là công cụ IaC được sử dụng rộng rãi nhất trong industry.
2. Terraform là gì?
Tổng quan
Terraform là công cụ IaC phổ biến nhất hiện nay — gần như đã trở thành standard trong DevOps khi làm việc với cloud. Do HashiCorp phát triển, Terraform dùng ngôn ngữ khai báo (declarative): bạn mô tả trạng thái mong muốn, Terraform tự lo phần còn lại.
Các khái niệm cốt lõi
| Khái niệm | Giải thích |
|---|---|
| Provider | Plugin kết nối Terraform với cloud platform (AWS, GCP, Azure…) |
| Resource | Một thành phần hạ tầng cụ thể (VPC, EC2 instance, S3 bucket…) |
| Data Source | Truy vấn thông tin từ hạ tầng đã tồn tại (đọc, không tạo mới) |
| Module | Nhóm các resources liên quan, đóng gói để tái sử dụng |
| State | File JSON lưu trữ trạng thái hiện tại của hạ tầng |
| Variable | Tham số đầu vào để cấu hình linh hoạt |
| Output | Giá trị xuất ra sau khi apply (IP, ARN, endpoint…) |
Terraform Workflow

Giải thích workflow:
- Write: Viết cấu hình hạ tầng trong file .tf bằng ngôn ngữ HCL.
- Init: Tải các providers và modules cần thiết.
- Plan: Terraform so sánh trạng thái mong muốn (code) với trạng thái thực tế (state), rồi đưa ra “execution plan” — danh sách các thay đổi sẽ được thực hiện.
- Apply: Thực thi plan, tạo/sửa/xóa resources trên cloud.
- Manage: Tiếp tục sửa code và lặp lại chu trình Plan → Apply.
Code example — Cấu hình cơ bản
Dưới đây là ví dụ tạo một EC2 instance trên AWS:
# main.tf — Tạo một EC2 instance trên AWS
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
required_version = ">= 1.5.0"
}
provider "aws" {
region = "ap-southeast-1"
}
# Lấy AMI Amazon Linux 2023 mới nhất — tự động đúng region, không bao giờ lỗi
data "aws_ami" "amazon_linux" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["al2023-ami-*-x86_64"]
}
}
resource "aws_instance" "web_server" {
ami = data.aws_ami.amazon_linux.id
instance_type = "t3.micro"
tags = {
Name = "web-server"
Environment = "dev"
}
}Chú thích:
- terraform block: Khai báo version constraints cho Terraform và providers.
- provider block: Cấu hình kết nối đến AWS region Singapore (ap-southeast-1).
- data block: Truy vấn AMI Amazon Linux 2023 mới nhất theo region hiện tại — không bao giờ bị lỗi do AMI ID khác region.
- resource block: Định nghĩa EC2 instance, dùng data.aws_ami.amazon_linux.id thay vì hard-code AMI.
3. Cài đặt & Thực hành Terraform cơ bản
Cài đặt Terraform
# macOS brew tap hashicorp/tap && brew install hashicorp/tap/terraform # Windows winget install HashiCorp.Terraform # Ubuntu/Debian — xem hướng dẫn đầy đủ tại: # https://developer.hashicorp.com/terraform/install # Kiểm tra terraform --version
Cấu hình AWS Credentials
Terraform cần quyền truy cập AWS để quản lý resources. Có nhiều cách cấu hình:
# Khuyến khích: AWS CLI profile aws configure # Hoặc environment variables export AWS_ACCESS_KEY_ID="..." export AWS_SECRET_ACCESS_KEY="..." # Best practice: AWS SSO aws sso login --profile my-profile
⚠️ Bảo mật: Không bao giờ hard-code AWS credentials trong file Terraform. Luôn sử dụng environment variables, AWS CLI profiles, hoặc IAM roles.
Các lệnh Terraform cơ bản
# 1. Init — tải providers, khởi tạo backend (chạy 1 lần đầu) terraform init # 2. Plan — xem trước thay đổi (QUAN TRỌNG NHẤT, luôn chạy trước apply) terraform plan # 3. Apply — thực thi plan terraform apply # 4. Destroy — hủy toàn bộ infrastructure terraform destroy
Đọc output của plan:
- + (xanh): Tạo mới.
- ~ (vàng): Cập nhật tại chỗ.
- -/+ (đỏ/xanh): Xóa và tạo lại.
- – (đỏ): Xóa.
Lưu ý terraform.lock.hcl: Sau init, Terraform tạo file .terraform.lock.hcl để lock version providers — phải commit file này vào Git để cả team dùng cùng version. Ngược lại, thêm .terraform/ vào .gitignore (thư mục cache có thể nặng vài trăm MB).
4. Terraform nâng cao — Variables, Outputs, Modules
Variables — Tham số hóa cấu hình
Thay vì hard-code giá trị, sử dụng variables để cấu hình linh hoạt giữa các môi trường:
# variables.tf
variable "environment" {
description = "Deployment environment"
type = string
default = "dev"
}
...Các cách truyền giá trị cho variables:
# 1. File terraform.tfvars (auto-load) echo 'environment = "prod"' > terraform.tfvars # 2. CLI flag terraform apply -var="environment=staging" # 3. Environment variable export TF_VAR_environment="staging" && terraform apply
Outputs — Xuất thông tin
# outputs.tf
output "instance_public_ip" {
value = aws_instance.web_server.public_ip
}
output "vpc_id" {
value = aws_vpc.main.id
}Sau khi terraform apply, outputs sẽ hiển thị:
Outputs: instance_public_ip = "54.169.123.45" vpc_id = "vpc-0abc123def456789"
Modules — Tái sử dụng code
Modules là cách tổ chức và tái sử dụng Terraform code. Một module là một thư mục chứa các file .tf liên quan.
Cấu trúc thư mục:
project/ ├── modules/ # Reusable modules │ ├── vpc/ │ │ ├── main.tf │ │ ├── variables.tf │ │ └── outputs.tf │ ├── ec2/ │ │ ├── ... ├── environments/ # Per-environment config │ ├── dev/ │ │ ├── main.tf │ │ └── terraform.tfvars └── │ stg/*** │ └── prod/*** └── README.md
5. Terraform State — Hiểu và quản lý đúng cách
State là gì?
Terraform State (terraform.tfstate) là file JSON lưu “bản đồ” giữa code và resources thực tế trên cloud. Terraform cần state để so sánh code vs thực tế, tính toán thay đổi, theo dõi metadata (ID, ARN, IP…), và xác định thứ tự apply.
Local State vs Remote State

Local state (mặc định) lưu file ngay trong thư mục project — là vấn đề lớn khi làm việc nhóm:
- Nhiều người apply đồng thời → xung đột state.
- File chứa secrets (passwords, tokens) → rủi ro bảo mật.
- Mất file = mất toàn bộ tracking → thảm họa.
Cấu hình Remote Backend (S3 + DynamoDB)
# backend.tf
terraform {
backend "s3" {
bucket = "my-company-terraform-state"
key = "dev/networking/terraform.tfstate"
region = "ap-southeast-1"
dynamodb_table = "terraform-locks" # State locking
encrypt = true # Mã hóa at rest
}
}Các lệnh quản lý state
terraform state list # Liệt kê resources trong state terraform state show aws_instance.web_server # Xem chi tiết terraform import aws_instance.web i-0abc123def456 # Import resource có sẵn terraform state mv aws_instance.web aws_instance.app # Refactor (rename) terraform state rm aws_instance.web # Xóa khỏi state (không xóa trên cloud)
6. Kết luận & Phần tiếp theo
Đến đây bạn đã nắm được nền tảng cốt lõi của Terraform:
- Tại sao cần IaC: Thay ClickOps bằng code version được, review được, reproduce được.
- Workflow: Write → Init → Plan → Apply.
- Variables, Outputs, Modules: Code linh hoạt, tái sử dụng được.
- State management: Tại sao cần remote state và locking.
Với những kiến thức này, bạn hoàn toàn có thể tự triển khai hạ tầng cho project nhỏ và vừa. Cài Terraform, thử deploy 1 EC2 instance trên AWS Free Tier — đó là cách học nhanh nhất.
Nhưng… khi project lớn lên?
Khi bạn có 3 environments × 10 modules → 30 lần copy-paste backend.tf và provider.tf. Quản lý dependencies giữa modules thành ác mộng. State file trùng key → thảm họa.
Đây là lúc Terragrunt xuất hiện — thin wrapper quanh Terraform giải quyết đúng những pain points này.
👉 Mời các bạn đón đọc: Phần 2 — Scale Terraform với Terragrunt
Tài liệu tham khảo:
- Terraform Documentation.
- HashiCorp Learn — Tutorials.
- Terraform Registry — Providers & modules.
- Terraform: Up & Running — Sách kinh điển của Yevgeniy Brikman.
![]() | Nguyễn Xuân Việt Anh Developer |














