Lỗi Xảy Ra
│ Error: Invalid value for input variable
│
│ on terraform.tfvars line 3:
│ 3: instance_count = "2"
│
│ The given value is not suitable for var.instance_count: a number is required.
Lỗi này xuất hiện khi chạy terraform plan hoặc terraform apply. Terraform đọc file .tfvars, tìm thấy biến, rồi từ chối giá trị vì kiểu dữ liệu không khớp với khai báo biến. Quá trình plan không bao giờ bắt đầu.
Nguyên Nhân
Hệ thống kiểu của Terraform không tự động chuyển đổi kiểu dữ liệu. Khai báo biến với type = number nhưng truyền vào chuỗi có dấu ngoặc kép như "2"? Bị từ chối ngay. Không có chuyển đổi tự động nào xảy ra — Terraform yêu cầu đúng kiểu dữ liệu. Điều này áp dụng cho cả các kiểu bool, list, map, và object.
Sự không khớp thường đến từ một trong các tình huống sau:
- Giá trị number hoặc bool bị bọc trong dấu ngoặc kép trong file
.tfvars - Biến kiểu
listđược truyền dưới dạng chuỗi phân cách bằng dấu phẩy - Biến kiểu
objectthiếu một hoặc nhiều thuộc tính bắt buộc - Kiểu biến đã thay đổi trong
variables.tfnhưng file.tfvarschưa được cập nhật cho phù hợp
Cách Sửa 1: Bỏ Dấu Ngoặc Kép Khỏi Giá Trị Number và Bool
Chín mươi phần trăm trường hợp, đây chính là thủ phạm. HCL có quy tắc đơn giản: chuỗi dùng dấu ngoặc kép, mọi thứ khác thì không.
Sai:
# terraform.tfvars
instance_count = "2" # chuỗi, không phải number
enable_logging = "true" # chuỗi, không phải bool
Đúng:
# terraform.tfvars
instance_count = 2 # number — không có dấu ngoặc kép
enable_logging = true # bool — không có dấu ngoặc kép
Number, boolean, list và map đều không dùng dấu ngoặc kép. Chỉ giá trị kiểu chuỗi mới cần dấu ngoặc kép đôi.
Cách Sửa 2: Sửa Biến Kiểu List và Set
Truyền biến list(string) dưới dạng chuỗi phân cách bằng dấu phẩy là bẫy phổ biến khác. Terraform sẽ không tự tách chuỗi cho bạn.
Khai báo biến:
# variables.tf
variable "availability_zones" {
type = list(string)
}
Sai:
# terraform.tfvars
availability_zones = "us-east-1a,us-east-1b"
Đúng:
# terraform.tfvars
availability_zones = ["us-east-1a", "us-east-1b"]
Cách Sửa 3: Sửa Biến Kiểu Map và Object
Map trong HCL dùng cú pháp { key = value } — không phải dấu hai chấm kiểu JSON. Nếu bạn copy-paste từ config JSON, dấu hai chấm sẽ gây lỗi.
Khai báo biến:
# variables.tf
variable "tags" {
type = map(string)
}
variable "db_config" {
type = object({
engine = string
version = string
port = number
})
}
Cú pháp tfvars đúng:
# terraform.tfvars
tags = {
Environment = "production"
Team = "platform"
}
db_config = {
engine = "postgres"
version = "14.5"
port = 5432
}
Chú ý port — được khai báo kiểu number, nên 5432 không có dấu ngoặc kép. Viết "5432" sẽ kích hoạt đúng lỗi bạn đang cố sửa.
Cách Sửa 4: Truyền Biến Qua Cờ CLI
Đang dùng -var trên dòng lệnh? Xử lý kiểu dữ liệu hoạt động khác ở đây. Terraform nhận giá trị dưới dạng chuỗi và chuyển đổi dựa trên kiểu đã khai báo — hoạt động ổn với các giá trị đơn giản, nhưng gặp vấn đề với list, map và object.
Với bất cứ thứ gì phức tạp hơn number hoặc bool cơ bản, hãy dùng file .tfvars:
# Dễ gặp lỗi với kiểu phức tạp:
terraform plan -var='instance_count=2'
# Đáng tin cậy hơn:
terraform plan -var-file="production.tfvars"
Biến kiểu number và bool đơn giản thường hoạt động tốt với -var. Rắc rối bắt đầu khi dùng list, map và object.
Cách Sửa 5: Kiểm Tra Sự Lệch Kiểu Giữa Các Module
Vừa cập nhật module và thay đổi kiểu của biến? File .tfvars của root module có thể vẫn đang dùng định dạng cũ. Trường hợp này khá tinh vi — thông báo lỗi trỏ đến file tfvars, không phải module nơi kiểu thực sự thay đổi.
# Kiểm tra kiểu mà Terraform thực sự mong đợi:
terraform console
> var.instance_count
Hoặc xem thẳng từ nguồn:
grep -A5 'variable "instance_count"' variables.tf
Chẩn Đoán Nhanh: Validate Mà Không Apply
Chạy terraform validate trước khi động vào plan:
terraform validate
Lệnh này không tải tfvars của bạn, nên bỏ sót các lỗi không khớp ở cấp giá trị. Nhưng nó phát hiện lỗi khai báo nhanh chóng. Để validate đầy đủ — bao gồm cả tfvars — hãy chạy plan và pipe output:
terraform plan -var-file="your.tfvars" 2>&1 | head -30
Xác Nhận Đã Sửa Xong
Sau khi đã sửa kiểu dữ liệu trong file tfvars, chạy lại plan:
terraform plan
Không còn dòng Invalid value for input variable nghĩa là lỗi không khớp đã được giải quyết. Một plan sạch trông như thế này:
Terraform will perform the following actions:
# aws_instance.web will be created
+ resource "aws_instance" "web" {
...
}
Plan: 1 to add, 0 to change, 0 to destroy.
Từ đây bạn chỉ còn phải xử lý logic hạ tầng, không phải lỗi kiểu dữ liệu nữa.
Phòng Ngừa
Ba thói quen giúp lớp lỗi này hiếm khi xảy ra:
- Khai báo kiểu tường minh trong
variables.tf. Không có ràng buộc kiểu, Terraform chấp nhận mọi thứ — và vấn đề chỉ lộ ra lúc runtime thay vì lúc plan, khi mà chúng khó truy vết hơn. - Thêm khối
validationđể kiểm tra chặt hơn. Chúng tạo ra thông báo rõ ràng, dễ đọc thay vì lỗi kiểu thô như bạn đang thấy. - Giữ file
terraform.tfvars.exampletrong git với kiểu dữ liệu đúng được hiển thị. Bất kỳ ai cập nhật biến đều có tài liệu tham chiếu về định dạng cần dùng. - Chạy
terraform plantrong CI với các file tfvars thực tế. Sự lệch kiểu sẽ bị phát hiện trước khi lên production.
# variables.tf — kiểu tường minh + validation
variable "instance_count" {
type = number
description = "Number of EC2 instances to create"
default = 1
validation {
condition = var.instance_count >= 1 && var.instance_count <= 20
error_message = "instance_count must be between 1 and 20."
}
}
Với khối validation đó, một giá trị sai sẽ cho bạn thông báo "instance_count must be between 1 and 20" — không phải lỗi kiểu khó hiểu mà bạn phải tốn 10 phút Google lúc 2 giờ sáng.

