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 ở workspaceproductionthì 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 production và develop 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.