blog.dopana

Back

Trước đây, quản lý hạ tầng là mở web console → click → nhập → nhớ. Mỗi server là một “snowflake” — cấu hình riêng, không ai dám chạm. Terraform thay đổi tất cả: hạ tầng là code, phiên bản hoá được, review được, tái tạo được.

Terraform Là Gì?#

Terraform là Infrastructure as Code (IaC) tool của HashiCorp. Bạn định nghĩa tài nguyên (VM, database, DNS, CDN) trong file HCL, Terraform biến chúng thành hiện thực.

main.tf
  |
  v
Terraform plan → Terraform apply
  |
  v
AWS / Cloudflare / GCP / Azure
plaintext

Thay vì click 20 lần trong console để setup một server + database + DNS — bạn viết 30 dòng code và chạy terraform apply.

Tại Sao IaC?#

Trước đâyVới Terraform
Click UI, không lưu lịch sửCode trong Git, full audit trail
Cấu hình “snowflake” khác nhauMôi trường giống hệt nhau
Rollback = click ngượcgit revert + terraform apply
Setup mất vài giờterraform apply vài phút
Sợ xoá instanceDestroy và recreate dễ dàng

HCL Cơ Bản#

Terraform dùng HCL (HashiCorp Configuration Language) — declarative, đọc được bằng tiếng Anh:

Chạy:

terraform init # Tải provider
terraform plan # Xem những gì sẽ thay đổi
terraform apply # Thực thi
bash

State Management#

Terraform lưu trạng thái hạ tầng hiện tại trong state file. State là trái tim của Terraform — nó biết resource nào đã tồn tại, resource nào cần tạo.

{
  "version": 4,
  "resources": [{
    "type": "aws_instance",
    "name": "web",
    "instances": [{
      "attributes": {
        "id": "i-123456",
        "public_ip": "54.123.45.67"
      }
    }]
  }]
}
json

Không bao giờ lưu state local. Dùng remote backend:

terraform {
  backend "s3" {
    bucket = "my-terraform-state"
    key    = "prod/terraform.tfstate"
    region = "ap-southeast-1"
  }
}
hcl

Hoặc dùng Terraform Cloud / Cloudflare R2 / GCS.

Module — Tái Sử Dụng#

Module là package Terraform. Thay vì copy-paste, bạn gọi module:

module "vpc" {
  source = "terraform-aws-modules/vpc/aws"
  version = "5.0"
  
  name = "my-vpc"
  cidr = "10.0.0.0/16"
}

module "web_app" {
  source = "./modules/web-app"
  
  vpc_id     = module.vpc.vpc_id
  subnet_ids = module.vpc.public_subnets
}
hcl

Module có thể từ registry, GitHub, hoặc local path.

Workspace — Nhiều Môi Trường#

Dùng workspace để quản lý dev / staging / prod:

terraform workspace new dev
terraform workspace new staging
terraform workspace new prod
terraform workspace select dev
terraform apply
bash
resource "aws_instance" "web" {
  instance_type = terraform.workspace == "prod" ? "t3.large" : "t3.micro"
}
hcl

Ví Dụ: Cloudflare + AWS#

Chạy terraform apply — Terraform tạo VM trên AWS và thêm DNS record trên Cloudflare trong một lần.

Variables Và Outputs#

terraform apply -var="instance_type=t3.large" -var="environment=prod"
bash

Best Practices#

  1. Remote state + locking

State backend + dynamodb lock để tránh conflict:

backend "s3" {
  bucket         = "tf-state"
  key            = "prod/terraform.tfstate"
  region         = "ap-southeast-1"
  dynamodb_table = "tf-lock"
}
hcl
  1. Module hoá

Chia thành: modules/vpc, modules/database, modules/app.

  1. Git workflow
main # Môi trường prod
├── staging # Môi trường staging
├── dev # Môi trường dev
bash

Apply trong CI/CD, không apply local.

  1. Lifecycle rules
resource "aws_db_instance" "main" {
  lifecycle {
    prevent_destroy = true  # Không cho terraform destroy
  }
}
hcl
  1. Import existing resources

Có resource đã tạo tay? Import vào state:

terraform import aws_instance.web i-123456
bash

So Sánh Với Các IaC Khác#

TerraformPulumiCloudFormation
LanguageHCLPython/TS/GoJSON/YAML
StateRemote backendManagedAWS quản lý
Multi-cloudAWS, GCP, Azure, CFAWS, GCP, AzureAWS only
Learning curveTrung bìnhThấp (nếu biết ngôn ngữ)Cao
CommunityLớn nhấtĐang phát triểnAWS ecosystem

Kết Luận#

Terraform là kỹ năng bắt buộc nếu bạn làm backend hoặc DevOps năm 2026. Git cho code, Terraform cho hạ tầng — hai thứ không thể thiếu.

Bắt đầu: một EC2 instance + Cloudflare DNS. Module hoá khi cần tái sử dụng. Remote state + locking cho team. CI/CD cho apply tự động.

Tài liệu tham khảo#