Terraform

The main purpose of the Terraform language is declaring resources, which represent infrastructure objects. All other language features exist only to make the definition of resources more flexible and convenient.

WritePlanApply Terraform giữ state của hệ thống

Danh mụcGhi nhớ chính
Loại cấu trúcprovider, resource, module
Dữ liệu hỗ trợvariable, output, locals, data
Quy trìnhinitplanapply
Nguyên lý chínhDeclarative, stateful, idempotent
Best practicesDRY, modules, separate env, remote state
envs/dev/
├── main.tf          # Module calls
├── variables.tf     # Variable definitions  
├── terraform.tfvars # Actual values - Git ignore
└── outputs.tf       # Outputs - used on other modules
  1. Add/configure resources trong main.tf
  2. Move the variables to variables
  3. Add the outputs to outputs Terraform sẽ lưu lại cái này. Mình có thể dùng sau (vd sử dụng scripts)
  • Dùng tfvars, tránh hardcode

  • terraform fmt, terraform validate

  • Tách nhỏ file .tf

  • Luôn dùng biến, không hardcode

  • Dùng module để tái sử dụng

  • Format code (terraform fmt)

  • Validate trước khi apply

  • Dùng remote backend cho state

  • Theo dõi resource drift

  • Không sửa tfstate bằng tay

  • VPC

    • CIDR
    • Subnet
    • Internet Gateway/ NAT gateway
    • Route tables
    • Tách AZ
  • Security Group

    • Rule for HTTP, HTTPS, SSH, DB, app port
    • Tách theo laỷe: web, app, db
  • Compute

    • EC2
    • EBS
    • IAM roles for EC2 Gửi log, S3 access
  • RDS

    • DB instance
    • subnet group
    • encrypted, backup, Multi-AZ optional
  • S3 Bucket

    • log, assets, file upload từ Rails
    • Versining, encryption, access login
  • ALB

    • Route traffic to EC2, ECS
    • Target Group, Listener, Health Check
    • Public subnet, link tới app instances
  • Monitoring

    • CloudWatch Log
    • Metric: CPU, Memory, Disk
    • Alarm
  • CI/CD & Deploy Rails

✅ PHASE 1: Setup tài khoản AWS công ty

  1. Tạo tài khoản root AWS

    • Dùng email công ty để đăng ký.

    • Kích hoạt xác thực 2 bước (MFA).

    • Không sử dụng root để thao tác hàng ngày.

  2. Tạo IAM user/group

    • Tạo user devops-admin có quyền AdministratorAccess.

    • Tạo group DevOps, gán user vào group.

    • Bật MFA và tạo access key cho CLI + Terraform.

  3. Tạo IAM policy và phân quyền

    • Tạo policy riêng cho từng team (e.g. DeveloperPolicy, FinancePolicy).

    • Gán IAM role/user cho từng nhóm.

  4. Thiết lập Billing & Budget

    • Bật Cost Explorer.

    • Tạo Budget theo tháng, bật alert qua email.

    • Bật detailed billing reports (CSV).

  5. Thiết lập tổ chức (AWS Organizations) (tuỳ chọn khi scale team)

    • Tách account: prod, dev, shared, security.

    • Dùng Service Control Policies (SCPs) để kiểm soát tài khoản con.


✅ PHASE 2: Setup công cụ DevOps & IaC cơ bản

  1. Cài đặt công cụ trên local

    • Terraform (>= v1.6)

    • AWS CLI

    • tflint, terrascan, checkov (linting + security)

    • git + GitHub/GitLab repo

  2. Thiết lập backend remote cho Terraform

    • Dùng S3 để lưu terraform.tfstate

    • Dùng DynamoDB để bật state locking

    • Mã hoá S3 bucket (SSE-S3 hoặc KMS)

  3. Tạo cấu trúc repo Terraform chuẩn

    terraform/
      ├── modules/
      │    ├── vpc/
      │    ├── ec2/
      │    └── rds/
      ├── environments/
      │    ├── dev/
      │    └── prod/
      └── main.tf / variables.tf / outputs.tf
    
  4. Tạo workspace cho từng môi trường

    • terraform workspace new dev

    • terraform workspace new prod


✅ PHASE 3: Build hạ tầng Web App cơ bản

  1. Tạo VPC module
  • CIDR block

  • Public + private subnets

  • NAT Gateway, Internet Gateway, route tables

  1. Tạo các resource khác:
  • Security Groups

  • EC2 (dùng để deploy app ban đầu)

  • RDS (PostgreSQL cho Rails app)

  • ALB (Application Load Balancer)

  • S3 (dự phòng cho asset, logs)

  1. Thiết lập IAM cho EC2
  • Role với quyền truy cập S3, CloudWatch, RDS
  1. Tạo module app Rails
  • User data script cài ruby, bundler, yarn, PostgreSQL client, nginx

  • Deploy từ GitHub repo (CI/CD tự động sau)


✅ PHASE 4: CI/CD & Monitoring

  1. Tạo pipeline CI/CD
  • Dùng GitHub Actions hoặc GitLab CI

  • Job: Terraform plan/apply

  • Job: Build + deploy Rails (Capistrano / Docker)

  1. Giám sát và alert
  • Bật CloudWatch Logs

  • Cảnh báo CPU, memory, disk, RDS connections

  • Sử dụng SNS để gửi alert qua email hoặc Slack


✅ PHASE 5: Bảo mật & Tối ưu

  1. Lưu secrets an toàn
  • Dùng AWS Secrets Manager hoặc SSM Parameter Store

  • Không hardcode key trong Terraform

  1. Quản lý version Terraform
  • Lock provider version

  • Dùng semantic versioning cho module

  1. Tối ưu hiệu năng
  • Dùng terraform plan -target khi cần

  • Cache provider để giảm thời gian apply

  1. Viết test cho Terraform
  • Dùng terratest hoặc kitchen-terraform

✅ Tổng kết

Bạn đã có một checklist từ đầu đến cuối gồm:

  • Tạo và cấu hình tài khoản AWS

  • Xây dựng hạ tầng với Terraform

  • Deploy ứng dụng Rails

  • Thiết lập CI/CD và alert

  • Bảo mật và tối ưu hóa


Bạn muốn bắt đầu với PHASE 1 luôn không? Mình sẽ tạo nội dung + lệnh Terraform chi tiết cho từng bước.

a. Bắt đầu PHASE 1 – Tạo IAM user, group, phân quyền bằng Terraform
b. Tạo cấu trúc repo Terraform chuẩn để bắt đầu PHASE 2