Sửa lỗi Terraform 'Invalid value for input variable' Khi Kiểu Biến Không Khớp trong tfvars

beginner🏗️ Terraform2026-05-20| Terraform 1.x, mọi hệ điều hành (Linux/macOS/Windows), mọi cloud provider (AWS/GCP/Azure)

Error Message

Invalid value for input variable: The given value is not suitable for var.instance_count: a number is required.
#terraform#biến#tfvars#sai-kiểu-dữ-liệu

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 object thiếu một hoặc nhiều thuộc tính bắt buộc
  • Kiểu biến đã thay đổi trong variables.tf nhưng file .tfvars chư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 numberbool đơn giản thường hoạt động tốt với -var. Rắc rối bắt đầu khi dùng list, mapobject.

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.example trong 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 plan trong 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.

Related Error Notes