Infrastructure as Code (IaC) là phương pháp quản lý và provisioning infrastructure thông qua code thay vì các quy trình thủ công. Thay vì SSH vào server và chạy từng lệnh, bạn định nghĩa hạ tầng trong file configuration, sau đó tool sẽ tự động tạo, thay đổi hoặc xóa tài nguyên cloud một cách nhất quán.

Trong bài viết này, chúng ta sẽ tìm hiểu về Terraform – công cụ IaC phổ biến nhất hiện nay – cách hoạt động, và cách áp dụng vào dự án thực tế.

Infrastructure as Code là gì?

IaC (Infrastructure as Code) là phương pháp quản lý hạ tầng IT thông qua các file configuration có thể đọc được bằng code, thay vì qua các quy trình thủ công hoặc giao diện đồ họa. Điều này có nghĩa là bạn có thể:

    Version control infrastructure – Lưu trữ cấu hình trong Git, theo dõi thay đổi và rollback khi cầnTự động hóa hoàn toàn – Provision infrastructure chỉ với một câu lệnhĐảm bảo tính nhất quán – Môi trường staging và production giống hệt nhauDocument tự động – Code chính là documentation, không bao giờ lỗi thời

Terraform là gì?

Terraform là công cụ IaC mã nguồn mở của HashiCorp, cho phép bạn định nghĩa và provision infrastructure thông qua code. Terraform hỗ trợ hơn 100 providers bao gồm AWS, Azure, GCP, Kubernetes, VMware, và nhiều hơn nữa.

Terraform sử dụng ngôn ngữ cấu hình HCL (HashiCorp Configuration Language) – cú pháp dễ đọc, dễ viết, có cấu trúc rõ ràng. Một file Terraform có thể mô tả toàn bộ hạ tầng, từ network, compute, storage cho đến các service bậc cao.

Tại sao nên dùng Terraform?

Terraform có nhiều ưu điểm vượt trội so với các phương pháp quản lý hạ tầng truyền thống:

Đặc điểm IaC với Terraform Thủ công (Manual)
Tốc độ triển khai Minutes – triển khai hàng trăm tài nguyên trong vài phút Hours/Days – tốn thời gian cho từng bước
Tính nhất quán Tuyệt đối – cùng code cho mọi môi trường Có thể sai sót do human error
Rollback Dễ dàng – git revert hoặc git checkout Khó khăn và tốn thời gian
Audit trail Tự động – commit history cho mọi thay đổi Không có hoặc thủ công
Cost Tiết kiệm – giảm sai sót, tăng hiệu suất Tốn kém – cần nhiều nhân lực

Cài đặt Terraform

Terraform có thể cài đặt trên Linux, macOS, Windows và thậm chí chạy trong Docker container. Dưới đây là hướng dẫn cài đặt trên Ubuntu/Debian:

# Cài đặt Terraform trên Ubuntu 22.04
# Tải phiên bản mới nhất (kiểm tra tại https://terraform.io/downloads)
TERRAFORM_VERSION="1.9.0"
wget "https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip"

# Giải nén và di chuyển vào PATH
unzip terraform_${TERRAFORM_VERSION}_linux_amd64.zip
sudo mv terraform /usr/local/bin/

# Xóa file zip tạm
rm terraform_${TERRAFORM_VERSION}_linux_amd64.zip

# Verify cài đặt
terraform --version

Nếu bạn dùng macOS, có thể cài đặt qua Homebrew: brew install terraform. Với Windows, dùng Chocolatey: choco install terraform.

Cấu trúc Terraform Project

Một Terraform project thường bao gồm các file sau:

    main.tf – File chính, chứa các resource definitionsvariables.tf – Khai báo các biến sử dụng trong projectoutputs.tf – Định nghĩa các giá trị output sau khi applyterraform.tfvars – Giá trị cụ thể cho các biến.terraform.lock.hcl – File lock cho providers và modules

Ví dụ: Tạo AWS EC2 Instance

# main.tf

# Define provider
provider "aws" {
  region = "ap-southeast-1"  # Singapore region
}

# Create a VPC
resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name = "terraform-vpc"
    Environment = "production"
  }
}

# Create Subnet
resource "aws_subnet" "main" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "ap-southeast-1a"
  map_public_ip_on_launch = true

  tags = {
    Name = "terraform-subnet"
  }
}

# Create Security Group
resource "aws_security_group" "web" {
  name        = "web-sg"
  description = "Security group for web servers"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "web-security-group"
  }
}

# Create EC2 Instance
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"  # Ubuntu 22.04 LTS
  instance_type = "t3.micro"
  subnet_id     = aws_subnet.main.id
  security_groups = [aws_security_group.web.id]

  tags = {
    Name = "web-server"
    Environment = "production"
  }
}

Terraform Workflow

Quy trình làm việc với Terraform gồm 4 bước chính:

1. Initialize (terraform init)

Lệnh này khởi tạo working directory, tải các providers và modules cần thiết. Luôn chạy terraform init trước khi bắt đầu một project mới hoặc sau khi thêm module mới.

2. Validate & Format (terraform fmt && terraform validate)

Trước khi lên kế hoạch, hãy đảm bảo code không có lỗi cú pháp. terraform fmt tự động format code theo chuẩn, terraform validate kiểm tra logic và tham chiếu.

3. Plan (terraform plan)

Lệnh này hiển thị tất cả thay đổi sẽ được thực hiện mà KHÔNG làm thay đổi thực tế. Review kỹ output trước khi apply – đây là cơ hội cuối để phát hiện sai sót.

4. Apply (terraform apply)

Khi đã chắc chắn về kế hoạch, chạy terraform apply để tạo, cập nhật hoặc xóa tài nguyên. Terraform sẽ hiển thị danh sách thay đổi và yêu cầu xác nhận trước khi thực thi.

# Complete workflow
terraform init
terraform fmt
terraform validate
terraform plan -out=tfplan
terraform apply tfplan

# Hoặc apply trực tiếp (sẽ show plan trước)
terraform apply

# Destroy toàn bộ resources
terraform destroy

Terraform State và Remote Backend

Terraform lưu trữ trạng thái hiện tại của infrastructure trong file terraform.tfstate. File này chứa metadata và references đến các resource đã tạo. Rất quan trọng: không bao giờ xóa file này nếu bạn muốn quản lý infrastructure hiện tại.

Với team, nên sử dụng remote backend như Terraform Cloud, S3 (AWS), GCS (GCP), hoặc Azure Blob Storage để:

    State locking – Ngăn chặn concurrent apply gây conflictTeam collaboration – Nhiều người có thể làm việc cùng lúcAudit trail – Lịch sử tất cả các thay đổiSecurity – State file không lưu trên máy local
# backend.tf - ví dụ S3 backend
terraform {
  backend "s3" {
    bucket         = "my-terraform-state"
    key            = "prod/terraform.tfstate"
    region         = "ap-southeast-1"
    encrypt        = true
    dynamodb_table = "terraform-locks"
  }
}

Modules – Tái sử dụng Terraform Code

Modules cho phép bạn đóng gói và tái sử dụng code Terraform. Thay vì viết lại cấu hình cho mỗi EC2 instance, bạn có thể tạo một module và gọi nó nhiều lần với các tham số khác nhau.

# Sử dụng module từ Terraform Registry
module "ec2_cluster" {
  source  = "terraform-aws-modules/ec2-instance/aws"
  version = "~> 5.0"

  name            = "web-cluster"
  instance_count  = 3
  ami             = "ami-0c55b159cbfafe1f0"
  instance_type   = "t3.micro"
  subnet_ids      = ["subnet-abc123", "subnet-def456"]

  tags = {
    Environment = "production"
    Team       = "DevOps"
  }
}

Best Practices khi dùng Terraform

    Sử dụng GitOps workflow – Tất cả thay đổi phải qua code review, không push trực tiếp vào mainTách biệt environments – Dùng workspace hoặc separate directories cho dev/staging/prodPin provider versions – Tránh breaking changes từ provider updatesUse variable files – Không hard-code giá trị, dùng variables cho flexibilityEnable backup/Snapshot – Trước khi apply, đảm bảo có backup của state

So sánh Terraform với các công cụ khác

Công cụ Ngôn ngữ Hỗ trợ Cloud Điểm mạnh
Terraform HCL 100+ providers Đa nền tảng, cộng đồng lớn, declarative
Ansible YAML Multi-cloud + On-prem Agentless, idempotent, dễ học
Pulumi Python/JS/Go Multi-cloud Dùng ngôn ngữ lập trình thật
CloudFormation JSON/YAML AWS only Tích hợp sâu với AWS

Câu hỏi thường gặp (FAQ)

Terraform có miễn phí không?

Terraform core là mã nguồn mở và miễn phí. Tuy nhiên, HashiCorp có sản phẩm thương mại là Terraform Cloud với các tính năng như remote execution, policy enforcement, và team management. Với dự án nhỏ, dùng Terraform open source là đủ.

Terraform và Ansible khác nhau thế nào?

Terraform là declarative – bạn định nghĩa trạng thái cuối cùng, Terraform tự tìm cách đạt được nó. Ansible là imperative – bạn viết các bước cụ thể để thực hiện. Terraform tốt cho provisioning infrastructure, Ansible tốt cho configuration management và deployment.

Làm sao để tránh lỗi state conflict khi làm team?

Sử dụng remote backend với state locking. Terraform Cloud miễn phí cho team nhỏ, hoặc bạn có thể dùng S3 + DynamoDB. Khi một người đang apply, state sẽ bị lock cho đến khi hoàn tất, các người khác phải chờ.

Có thể import infrastructure hiện có vào Terraform không?

Có, dùng terraform import. Bạn cần viết resource definition phù hợp, sau đó chạy import để Terraform quản lý resource đó. Tuy nhiên, bạn vẫn cần viết code tương ứng cho resource đó trong config file.

Terraform có thể quản lý Kubernetes không?

Có, Terraform có provider kubernetes cho phép quản lý Kubernetes resources. Bạn có thể tạo deployments, services, configmaps, và ngay cả entire clusters. Ngoài ra còn có provider helm để deploy Helm charts.

Tôi nên lưu state ở đâu?

Luôn dùng remote backend – không lưu state trên máy local. Các lựa chọn phổ biến: Terraform Cloud (miễn phí cho team nhỏ), AWS S3 + DynamoDB, GCS, hoặc Azure Blob Storage. Đảm bảo state được mã hóa và có backup.

Kết luận

Terraform là công cụ mạnh mẽ giúp bạn quản lý infrastructure một cách nhất quán, có version control, và tự động hóa hoàn toàn. Việc đầu tư thời gian học Terraform sẽ trả lại rất nhiều – từ việc giảm sai sót thủ công, tăng tốc độ triển khai, đến việc dễ dàng scale và maintain hạ tầng.

Nếu bạn cần tìm hiểu thêm về container và cách deploy ứng dụng, hãy tham khảo hướng dẫn Docker toàn tập hoặc so sánh LXC và Docker trên vnhte.com.

Chào các bạn mình là Quốc Hùng , mình sinh ra thuộc cung song tử ,song tử luôn khẳng định chính mình ,luôn luôn phấn đấu vượt lên phía trước ,mình sinh ra và lớn lên tại vùng đất võ cổ truyền ,đam mê của mình là coder ,ngày đi học tối về viết blog ...