search

14-Terraform Workspace – Quản lý nhiều môi trường từ một codebase

calendar_today Đăng ngày: 29/04/2026

Khi làm thực tế, bạn thường cần ít nhất 3 môi trường: develop, staging, production. Câu hỏi đặt ra là làm sao quản lý 3 môi trường này mà không phải copy code đi copy lại? Terraform Workspace là một trong những cách giải quyết vấn đề đó.

Workspace là gì?

Workspace trong Terraform giống với khái niệm environment — mỗi workspace đại diện cho một môi trường riêng biệt. Điểm quan trọng cần nhớ:

  • Các workspace dùng chung một codebase
  • Nhưng mỗi workspace có State file riêng hoàn toàn độc lập

Nghĩa là cùng một file .tf, khi bạn apply ở workspace develop thì chỉ ảnh hưởng đến hạ tầng của develop, không đụng gì đến production.

Sau khi chạy terraform init, Terraform tự động tạo một workspace tên default. Workspace này tồn tại vĩnh viễn và không thể xóa.

Các lệnh làm việc với workspace

# Tạo workspace mới
terraform workspace new staging

# Xem danh sách workspace hiện có
terraform workspace list

# Chuyển sang workspace khác
terraform workspace select production

# Xóa workspace (không xóa được default)
terraform workspace delete staging

Khi chạy terraform workspace list, workspace đang active sẽ có dấu * phía trước:

  default
* develop
  staging
  production

Sử dụng workspace trong code

Bạn có thể đọc workspace hiện tại trong code thông qua terraform.workspace và dùng nó để điều chỉnh cấu hình theo từng môi trường:

provider "aws" {
  region = var.region
}

resource "aws_instance" "example" {
  count         = terraform.workspace == "production" ? 5 : 1
  ami           = "ami-12345678"
  instance_type = "t2.micro"

  tags = {
    Name = "example-${terraform.workspace}"
  }
}

Phân tích ví dụ trên:

  • count = terraform.workspace == "production" ? 5 : 1 — nếu đang ở workspace production thì tạo 5 instance, các môi trường còn lại chỉ tạo 1. Đây là cú pháp ternary operator, tương tự như trong các ngôn ngữ lập trình khác.
  • Name = "example-${terraform.workspace}" — tag Name sẽ tự động có tên môi trường đính kèm, ví dụ example-develop, example-production. Giúp dễ phân biệt resource trên AWS Console.

Một lưu ý thực tế

Workspace tiện nhưng không phải silver bullet. HashiCorp khuyến nghị workspace phù hợp với các trường hợp hạ tầng tương tự nhau nhưng khác môi trường. Nếu productiondevelop có cấu trúc hạ tầng quá khác nhau, nên cân nhắc tách thành các thư mục/module riêng thay vì dùng workspace với quá nhiều điều kiện if/else trong code — sẽ rất khó đọc và maintain về sau.