search

06-Terraform Variables – Biến, tfvars và Output

calendar_today Đăng ngày: 01/05/2026

Nếu bạn đã đi qua terraform là gìterraform init, plan, apply thì đây là lúc mình bắt đầu viết cấu hình đúng nghĩa hơn. Bài này mình sẽ giải thích cách dùng variables trong Terraform – tại sao cần tách biến, cách khai báo, cách truyền giá trị, và output variables để lấy thông tin sau khi deploy.

Xem thêm:

07-Terraform Data Types – Các kiểu dữ liệu trong Terraform

10-Terraform Locals – Khai báo biến cục bộ

15-Terraform Modules – Tái sử dụng code hạ tầng

1. Tại sao cần dùng biến?

Giả sử bạn viết file main.tf với tên resource group, region, tên app service… tất cả đều hardcode. Deploy lên môi trường dev xong, đến production bạn phải vào sửa từng dòng. Vừa mất thời gian, vừa dễ nhầm.

Biến (variables) giúp tách phần giá trị cụ thể ra khỏi phần logic cấu hình. File main.tf giữ nguyên, chỉ cần đổi file .tfvars là có thể deploy cho từng môi trường khác nhau.

2. Khai báo biến trong Terraform

Có hai cách khai báo.

Cách đơn giản:

variable "environment" {
  default = "dev"
}

Cách đầy đủ (mình hay dùng hơn):

variable "location" {
  type        = string
  default     = "ap-southeast-1"
  description = "AWS region để deploy tài nguyên"
}

Ba thuộc tính chính bạn cần biết:

Thuộc tính Ý nghĩa
type Kiểu dữ liệu: string, number, bool, list, map
default Giá trị mặc định nếu không truyền vào
description Mô tả biến – có ích khi team có nhiều người

Thực tế mình luôn điền đủ cả ba. Khi review code hoặc debug sau này, phần description tiết kiệm khá nhiều thời gian.

3. Cấu trúc thư mục thực tế

Quy ước phổ biến nhất là tách biến ra file variables.tf:

terraform-project/
├── main.tf
├── variables.tf
└── outputs.tf

variables.tf:

variable "resource_group_name" {
  type        = string
  default     = "example-resources"
  description = "Tên của Resource Group"
}

variable "resource_group_location" {
  type        = string
  default     = "West Europe"
  description = "Vị trí của Resource Group"
}

variable "app_service_plan_name" {
  type        = string
  default     = "example-app-service-plan"
  description = "Tên của App Service Plan"
}

variable "app_service_name" {
  type        = string
  default     = "example-app-service"
  description = "Tên của App Service"
}

main.tf – dùng biến bằng cú pháp var.<tên_biến>:

resource "azurerm_resource_group" "example" {
  name     = var.resource_group_name
  location = var.resource_group_location
}

resource "azurerm_app_service_plan" "example" {
  name                = var.app_service_plan_name
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  kind                = "App"

  sku {
    tier = "Standard"
    size = "S1"
  }
}

resource "azurerm_app_service" "example" {
  name                = var.app_service_name
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  app_service_plan_id = azurerm_app_service_plan.example.id
}

File main.tf lúc này không còn giá trị nào hardcode. Muốn đổi tên hay region, bạn chỉ cần sửa ở variables.tf hoặc file .tfvars.

4. Validation – Kiểm tra giá trị biến

Từ Terraform 0.13 trở đi, bạn có thể thêm validation để Terraform báo lỗi ngay nếu người dùng truyền giá trị sai:

variable "location" {
  type        = string
  description = "Vùng AWS để deploy"

  validation {
    condition     = contains(["ap-southeast-1", "us-east-1"], lower(var.location))
    error_message = "Region không hợp lệ. Hãy chọn ap-southeast-1 hoặc us-east-1."
  }
}

Thay vì để Terraform chạy vài giây rồi fail ở bước API, validation bắt lỗi ngay từ đầu. Mình dùng cái này khá nhiều khi viết module dùng chung.

5. Các kiểu dữ liệu của biến

Primitive Types

variable "env_name"    { type = string }   # "dev", "prod"
variable "instance_count" { type = number } # 2, 5
variable "enable_https"   { type = bool }   # true, false

Complex Types

list – danh sách cùng kiểu:

variable "environments" {
  type    = list(string)
  default = ["dev", "staging", "prod"]
}

map – key-value:

variable "tags" {
  type = map(string)
  default = {
    env    = "prod"
    owner  = "ttnguyen"
  }
}

object – khi cần nhóm nhiều trường khác kiểu với nhau:

variable "user" {
  type = object({
    name = string
    age  = number
  })
}

6. Cách truyền giá trị cho biến

Có ba cách phổ biến:

1. File .tfvars

Tạo file prod.tfvars:

resource_group_name     = "prod-resources"
resource_group_location = "East US"
app_service_name        = "my-prod-app"

Rồi chạy:

terraform apply -var-file="prod.tfvars"

Cách này phù hợp nhất khi làm việc với nhiều môi trường. Mỗi môi trường có một file .tfvars riêng.

2. Truyền thẳng trên dòng lệnh

terraform apply -var="resource_group_location=East US"

Tiện cho thử nhanh, nhưng không nên dùng trong CI/CD vì khó track lại.

3. Biến môi trường

export TF_VAR_resource_group_name="prod-resources"
terraform apply

Terraform tự nhận các biến môi trường có tiền tố TF_VAR_. Cách này phù hợp khi tích hợp với pipeline (GitHub Actions, GitLab CI…) vì bạn có thể đặt secret ở cấp pipeline thay vì lưu vào file.

7. Output Variables

Output dùng để in ra thông tin của resource sau khi Terraform chạy xong. Ví dụ: ID của resource group vừa tạo, URL của web app, địa chỉ IP của VM…

Ngoài hiển thị, output còn có tác dụng quan trọng khi dùng Terraform modules – module con có thể expose output để module cha đọc lại.

outputs.tf:

output "resource_group_name" {
  description = "Tên Resource Group đã tạo"
  value       = azurerm_resource_group.example.name
}

output "resource_group_location" {
  description = "Vị trí của Resource Group"
  value       = azurerm_resource_group.example.location
}

Sau khi terraform apply thành công, bạn sẽ thấy:

Outputs:

resource_group_location = "East US"
resource_group_name = "demo-resource-group"

Muốn xem lại output mà không cần chạy lại apply:

terraform output
terraform output resource_group_name

Tóm lại

Bài này mình đã đi qua:

  • Biến giúp file cấu hình linh hoạt, dùng được nhiều môi trường
  • variables.tf là nơi khai báo biến tập trung
  • validation để bắt lỗi sớm trước khi Terraform gọi API
  • Truyền giá trị qua .tfvars, -var, hoặc TF_VAR_
  • outputs.tf để lấy thông tin resource sau deploy và dùng giữa các module

Bài viết thuộc series HashiCorp Certified: Terraform Associate trên ttnguyen.net. Cảm ơn bạn đã đọc