ST
ShowTech VN
🏠 Trang Chủ
📖 Về ShowTech 📬 Liên Hệ

[Bài 01] Tư Duy Declarative IaC & So Sánh Thực Chiến: Terraform vs Ansible vs Pulumi vs CloudFormation

[Bài 01] Tư Duy Declarative IaC & So Sánh Thực Chiến: Terraform vs Ansible vs Pulumi vs CloudFormation

Khi hạ tầng đám mây (Cloud Infrastructure) mở rộng từ vài chục lên hàng ngàn máy chủ, cụm Kubernetes và cơ sở dữ liệu phân tán, việc cấu hình thủ công qua giao diện web (ClickOps) hoặc các script Shell/Python tuần tự trở thành nguyên nhân số 1 gây ra State Drift (lệch cấu hình) và thảm họa sập hệ thống do lỗi con người.

Để giải quyết bài toán này, Infrastructure as Code (IaC) ra đời như một tiêu chuẩn bắt buộc cho mọi kỹ sư Cloud Native và DevOps hiện đại. Tuy nhiên, việc lựa chọn đúng công cụ và nắm vững tư duy cốt lõi Declarative (Khai báo trạng thái mong muốn) thay vì Imperative (Chỉ định từng bước thực thi) là ranh giới giữa một hệ thống tự phục hồi vững chắc và một đống script bảo trì ác mộng.


1. Tư Duy Cốt Lõi: Declarative vs Imperative trong Quản Trị Hạ Tầng

1.1. Bản Chất của Phương Pháp Imperative (Mệnh Lệnh)

Trong mô hình Imperative (điển hình như Shell Script, Python Boto3, Ansible khi không dùng đúng module idempotent), kỹ sư phải mô tả từng bước tuần tự để đạt được kết quả:
- Bước 1: Kiểm tra xem S3 Bucket đã tồn tại chưa.
- Bước 2: Nếu chưa có, gọi lệnh tạo Bucket.
- Bước 3: Nếu đã có, gọi lệnh cập nhật Encryption.
- Bước 4: Nếu cấu hình sai, viết hàm rollback thủ công.

1.2. Tư Duy Declarative của Terraform (Khai Báo Trạng Thái)

Với mô hình Declarative của Terraform, kỹ sư chỉ cần mô tả trạng thái mong muốn cuối cùng (Desired State). Terraform sẽ đảm nhận việc so sánh trạng thái mong muốn trong code HCL với trạng thái thực tế trên Cloud (Current State thông qua State File) để tự động tính toán đồ thị hành vi (Execution Plan: Add, Change, Destroy).


2. Bảng So Sánh Kỹ Thuật Toàn Diện (Engineering Matrix)

Dưới đây là ma trận so sánh chi tiết giữa 4 giải pháp quản trị hạ tầng phổ biến nhất hiện nay dựa trên 8 tiêu chí kiểm định thực tế tại các hệ thống tài chính & viễn thông chịu tải cao:

Tiêu Chí Kỹ Thuật HashiCorp Terraform Ansible (Red Hat) Pulumi AWS CloudFormation
Triết Lý Thiết Kế Declarative IaC Imperative / Config Management Declarative (General Programming) Declarative (AWS Native)
Ngôn Ngữ Định Nghĩa HCL (HashiCorp Config Lang) YAML (Playbooks) TypeScript, Python, Go, C# JSON / YAML Template
Quản Lý Trạng Thái (State) Explicit State File (S3 / GCS / HCP) Không có State File (Stateless) Pulumi Service / S3 Backend CloudFormation Engine nội bộ AWS
Phát Hiện Lệch Cấu Hình (Drift) Cực mạnh (terraform plan -refresh-only) Hạn chế (Dựa trên Check Mode) Mạnh (pulumi refresh) Hỗ trợ qua Drift Detection API
Độ Phụ Thuộc Nền Tảng (Portability) Độc lập (Multi-Cloud Provider) Độc lập (OS & Cloud Modules) Độc lập (Multi-Cloud SDK) Khóa chặt vào hệ sinh thái AWS
Khả Năng Preview Kế Hoạch Rõ ràng, trực quan (plan) Hạn chế (Dry-run không hoàn hảo) Rất tốt (pulumi preview) Change Sets
Hệ Sinh Thái Module & Registry 3.500+ Providers, 15.000+ Modules Galaxy Ansible Roles Pulumi Registry / NPM / PyPI AWS Serverless Repo / Registry
Mục Đích Sử Dụng Lý Tưởng Khởi tạo & Vòng đời Hạ tầng Cloud Cấu hình OS, Cài đặt phần mềm, Patch Hạ tầng phức tạp cần logic code động Dự án 100% thuần AWS Serverless

3. Kiến Trúc Mẫu Triển Khai Chuẩn Production (HCL 1.7+)

Dưới đây là ví dụ cấu hình hạ tầng lưu trữ bảo mật cao tuân thủ quy chuẩn mã hóa KMS, phân quyền IAM least-privilege và chặn truy cập công khai tuyệt đối:

HCL
# versions.tf - Định nghĩa phiên bản Terraform và Provider
terraform {
  required_version = ">= 1.7.0"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.40.0"
    }
  }

  backend "s3" {
    bucket         = "showtech-prod-tfstate-ap-southeast-1"
    key            = "core/storage/s3-secure.tfstate"
    region         = "ap-southeast-1"
    dynamodb_table = "showtech-prod-tflocks"
    encrypt        = true
  }
}

provider "aws" {
  region = var.aws_region

  default_tags {
    tags = {
      Environment = var.environment
      ManagedBy   = "Terraform"
      Project     = "ShowTech-Enterprise"
    }
  }
}
HCL
# main.tf - Tài nguyên S3 Bucket được bảo vệ nghiêm ngặt
resource "aws_kms_key" "s3_kms" {
  description             = "KMS Key ma hoa du lieu cho S3 Bucket Production"
  deletion_window_in_days = 30
  enable_key_rotation     = true

  tags = {
    Name = "showtech-kms-s3-${var.environment}"
  }
}

resource "aws_s3_bucket" "secure_storage" {
  bucket        = "showtech-enterprise-assets-${var.environment}"
  force_destroy = false

  lifecycle {
    prevent_destroy = true
  }
}

resource "aws_s3_bucket_versioning" "versioning" {
  bucket = aws_s3_bucket.secure_storage.id
  versioning_configuration {
    status = "Enabled"
  }
}

resource "aws_s3_bucket_server_side_encryption_configuration" "kms_encryption" {
  bucket = aws_s3_bucket.secure_storage.id

  rule {
    apply_server_side_encryption_by_default {
      kms_master_key_id = aws_kms_key.s3_kms.arn
      sse_algorithm     = "aws:kms"
    }
    bucket_key_enabled = true
  }
}

resource "aws_s3_bucket_public_access_block" "block_all_public" {
  bucket = aws_s3_bucket.secure_storage.id

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

4. Case Study Thực Chiến: Khắc Phục Sự Cố "State Lock Conflict"

ℹ️ Lưu Ý / Tình Huống

Tình huống thực tế: Đội ngũ DevOps gồm 5 kỹ sư cùng chạy pipeline CI/CD. Khi một pipeline đang thực thi terraform apply, một kỹ sư khác vô tình chạy lệnh cục bộ trên máy cá nhân khiến quá trình apply bị crash và State bị khóa vĩnh viễn với thông báo:

TEXT
Error: Error acquiring the state lock: ConditionalCheckFailedException:
The conditional request failed
Lock Info:
  ID:        e8d99c42-73a1-432b-93ff-1834167e411b
  Path:      showtech-prod-tfstate-ap-southeast-1/core/storage/s3-secure.tfstate
  Operation: OperationTypeApply
  Who:       runner@github-ci-worker-04
  Created:   2026-09-05 14:10:02.123456789 +0000 UTC

Quy Trình Xử Lý Sự Cố 3 Bước Chuẩn Enterprise:

  1. Bước 1 — Xác thực an toàn: Truy cập CI/CD runner hoặc liên hệ người có tên trong trường Who để đảm bảo 100% tiến trình cũ đã bị hủy hoặc crash, không còn ghi đè state.
  2. Bước 2 — Mở khóa cưỡng chế: Sử dụng lệnh chính thống của Terraform kèm Lock ID được ghi rõ trong log:
    bash terraform force-unlock e8d99c42-73a1-432b-93ff-1834167e411b
  3. Bước 3 — Đồng bộ trạng thái: Luôn chạy terraform plan -refresh-only trước khi apply lại để cập nhật toàn bộ thay đổi thực tế trên Cloud vào state mà không làm hỏng tài nguyên.

5. Câu Hỏi Phỏng Vấn Kỹ Sư Cao Cấp (Senior Terraform Q&A)

Q1: Tại sao nói Terraform là công cụ "Declarative" nhưng một số tính năng như provisionerlocal-exec lại mang tính "Imperative"? Khi nào nên dùng?

Trả lời:
provisioner (chạy script shell/remote-exec) phá vỡ tính Declarative vì Terraform không thể theo dõi hoặc rollback được những thay đổi do script đó thực hiện bên trong máy ảo. Do đó, HashiCorp phân loại provisioner là giải pháp cuối cùng (Last Resort). Thay vào đó, trong môi trường Cloud Native chuẩn, kỹ sư nên dùng Cloud-init, Packer (Bake AMI), hoặc Ansible tách biệt sau khi Terraform đã dựng xong hạ tầng.

Q2: Điều gì xảy ra nếu ai đó xóa thủ công một EC2 Instance trên AWS Console mà không qua Terraform? Khi chạy terraform plan, Terraform xử lý như thế nào?

Trả lời:
Khi chạy terraform plan, Terraform thực hiện chu kỳ Refresh bằng cách gọi AWS API đọc trạng thái thực tế. Nhận thấy Instance đã biến mất (404 Not Found), Terraform cập nhật bộ nhớ tạm so với Desired State trong code HCL (vẫn khai báo resource đó), và đề xuất kế hoạch:

TEXT
Plan: 1 to add, 0 to change, 0 to destroy.
+ aws_instance.web (re-create)

Đây chính là cơ chế tự phục hồi hạ tầng (Reconciliation Loop) cốt lõi của Declarative IaC.


6. Tổng Kết & Lộ Trình Thực Hành Tiếp Theo

Tư duy Declarative State không chỉ đơn thuần là viết code HCL, mà là cách thiết kế hạ tầng có khả năng mở rộng, dễ dự đoán và tự động hóa 100% trong quy trình CI/CD.

Trong các bài viết tiếp theo của Series, chúng ta sẽ lần lượt giải phẫu chuyên sâu vòng đời thực thi, cú pháp HCL nâng cao, đồ thị DAG, quản trị Variables/Locals/Outputs, cấu trúc State và xây dựng Remote Backend S3/DynamoDB chuẩn Enterprise.


Bài viết thuộc Series đào tạo Terraform Thực Chiến độc quyền trên ShowTech.vn.

ShowTech Author

ShowTech Admin (ShowTech Team)

Cloud Architect & Senior DevOps Engineer

Đam mê xây dựng hệ thống phần mềm hiệu năng cao, phân tán quy mô lớn và chia sẻ tri thức công nghệ thực chiến chuẩn quốc tế cho cộng đồng kỹ sư Việt Nam.

Tìm kiếm Blog này

Bài đăng phổ biến từ blog này

Tối Ưu PostgreSQL Chịu Tải Hàng Triệu Queries: Indexing, Connection Pooling & Partitioning

Kiến Trúc Microservices Chịu Tải 1 Triệu CCU Thực Chiến

Tối Ưu Memory Footprint & Goroutine Pooling Trong High-Throughput Go Services

Đã sao chép liên kết vào clipboard!