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
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:
localsdù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.