search

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

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

Nếu bạn đang học Terraform và thấy code của mình ngày càng lặp lại nhiều chuỗi giống nhau, hoặc phải khai báo cùng một giá trị ở mọi nơi – đó là lúc cần dùng locals. Bài này mình sẽ giải thích locals trong terraform là gì, khác gì với variable, và cách dùng thực tế để code gọn hơn hẳn.

Xem thêm:

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

12-Data Source trong Terraform là gì? Vì sao cần

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

1. Terraform Locals là gì?

locals (hay local values) là cách bạn đặt tên cho một biểu thức trong Terraform để dùng lại nhiều lần mà không phải viết lại.

Nó giống như bạn khai báo một hằng số hoặc biến tạm trong lập trình thông thường – nhưng chỉ tồn tại trong module mà bạn định nghĩa nó, không truyền vào từ ngoài được.

locals {
  app_name    = "ttnguyen-app"
  environment = "production"
  full_name   = "${local.app_name}-${local.environment}"
}

Sau khi khai báo, bạn dùng nó bằng cú pháp local.<tên> (không có s):

resource "aws_s3_bucket" "main" {
  bucket = local.full_name
}

2. Locals vs Variables – Khác nhau chỗ nào?

Đây là điểm hay bị nhầm khi mới học. Bảng dưới tóm tắt nhanh:

Tiêu chí variable locals
Nhận giá trị từ ngoài Có (qua -var, tfvars) Không
Tính toán động Hạn chế Hỗ trợ đầy đủ
Phạm vi Module hiện tại Module hiện tại
Mục đích chính Nhận input từ người dùng Tái sử dụng nội bộ, giảm lặp
Thay đổi khi apply Có thể Không (cố định trong code)

Nói ngắn gọn: variable để nhận giá trị từ bên ngoài, locals để xử lý và tái sử dụng bên trong.

3. Cú pháp khai báo

Bạn khai báo trong một block locals {}. Có thể có nhiều block locals trong cùng một file hoặc nhiều file, Terraform sẽ gộp lại.

locals {
  region      = "ap-southeast-1"
  project     = "ttnguyen"
  name_prefix = "${local.project}-${local.region}"
}

Một điểm tiện: bạn có thể tham chiếu local khác trong cùng block. Terraform tự xử lý thứ tự phụ thuộc, bạn không cần lo.

4. Dùng Locals cho Tags – Pattern phổ biến nhất

Trên môi trường cloud (AWS, GCP, Azure), bạn thường phải gắn tag vào mọi resource. Nếu không dùng locals, bạn sẽ lặp đi lặp lại cùng một đoạn:

Không dùng locals – code bị lặp:

resource "aws_instance" "web" {
  # ...
  tags = {
    Project     = "ttnguyen"
    Environment = "production"
    Owner       = "ttnguyen-team"
  }
}

resource "aws_s3_bucket" "data" {
  # ...
  tags = {
    Project     = "ttnguyen"
    Environment = "production"
    Owner       = "ttnguyen-team"
  }
}

Dùng locals – sạch hơn nhiều:

locals {
  common_tags = {
    Project     = "ttnguyen"
    Environment = var.environment
    Owner       = "ttnguyen-team"
    ManagedBy   = "terraform"
  }
}

resource "aws_instance" "web" {
  # ...
  tags = local.common_tags
}

resource "aws_s3_bucket" "data" {
  # ...
  tags = local.common_tags
}

Khi cần thêm tag mới, bạn chỉ sửa một chỗ trong locals là xong.

5. Locals với biểu thức phức tạp

locals không chỉ lưu string. Bạn có thể dùng với expressions, functions, điều kiện:

Ghép chuỗi có điều kiện:

locals {
  name_suffix = var.environment == "production" ? "prod" : "dev"
  bucket_name = "ttnguyen-data-${local.name_suffix}"
}

Dùng với functions:

locals {
  # Chuyển list thành map để dùng for_each
  instance_map = { for idx, name in var.instance_names : name => idx }

  # Format ngày tháng
  timestamp = formatdate("YYYY-MM-DD", timestamp())
}

Tính toán từ data source:

data "aws_availability_zones" "available" {}

locals {
  az_count = length(data.aws_availability_zones.available.names)
  first_az  = data.aws_availability_zones.available.names[0]
}

6. Tổ chức Locals trong dự án lớn

Với module nhỏ, bạn để locals trong main.tf là ổn. Với dự án lớn hơn, mình thường tách ra file riêng:

.
├── main.tf
├── variables.tf
├── outputs.tf
└── locals.tf       ← tập trung locals ở đây

Cấu trúc này giúp dễ tìm hơn khi debug, và người khác đọc code cũng hiểu nhanh hơn.

7. Một số lưu ý thực tế

Không dùng locals để thay variable khi cần flexibility. Nếu giá trị cần thay đổi theo môi trường (staging vs prod) mà bạn truyền vào khi chạy, hãy dùng variable. locals phù hợp cho những gì cố định hoặc tính toán từ input đã có.

Tránh locals quá lồng nhau. Nếu bạn có local.a tính từ local.b tính từ local.c, code sẽ khó đọc. Đặt tên rõ và giữ chuỗi phụ thuộc ngắn.

Locals không được khai báo vòng tròn. Terraform sẽ báo lỗi nếu local.a tham chiếu local.b và ngược lại.

Tóm tắt

Trong bài này bạn đã biết:

  • locals dùng để đặt tên cho giá trị/biểu thức và tái sử dụng trong module
  • Khác với variable ở chỗ không nhận input từ bên ngoài
  • Pattern phổ biến nhất: dùng để quản lý tags tập trung
  • Có thể dùng với expressions, functions, và data sources

Bước tiếp theo nếu bạn muốn đào sâu hơn: tìm hiểu Terraform Modules – cách đóng gói locals, variables, và resources thành một đơn vị tái sử dụng.