Terraform Variable Block is one of the foundational features of Terraform that every user—from beginner to expert—must understand. Variables make your code modular, reusable, and much easier to manage across environments.
Whether you are deploying to local infrastructure or the cloud, Terraform variables help separate configuration from logic. This post walks you through the ins and outs of variable blocks in Terraform, covering types, best practices, and practical examples.
Table of Contents
What Is the Terraform Variable Block?
The variable
block in Terraform allows users to declare inputs for their configuration. Instead of hardcoding values inside your .tf
files, variables enable dynamic configuration with centralized management.
Each variable block can include:
default
: Specifies the fallback value.description
: Describes what the variable is used for.type
: Enforces a specific data type.
Let’s break down each of these and see how they work.
Simple Variable Types: String, Number, Boolean
String
A string variable holds alphanumeric data. It’s the most commonly used type.
variable "region" {
type = string
description = "AWS region"
default = "us-east-1"
}
Number
Used for numeric values—both integers and floats.
variable "instance_count" {
type = number
default = 3
}
Boolean
Holds true
or false
.
variable "enable_monitoring" {
type = bool
default = true
}
If the type
is omitted, it defaults to any
, which is flexible but discouraged for production code.
Collection Types: List, Map, and Set
List
A list is an ordered sequence of values.
variable "prefixes" {
type = list(string)
default = ["Mr", "Mrs", "Dr"]
}
You can access list elements using indexes, starting from 0.
prefix = var.prefixes[1] # returns "Mrs"
Map
Maps use key-value pairs. Ideal for storing structured data.
variable "file_content" {
type = map(string)
default = {
statement1 = "We love automation."
statement2 = "Terraform makes it easy."
}
}
Access a specific key with:
content = var.file_content["statement2"]
Set
Sets are similar to lists but do not allow duplicate values.
variable "unique_tags" {
type = set(string)
default = ["web", "db", "cache"]
}
Providing duplicates like ["web", "web"]
will result in an error.
Complex Types: Object and Tuple
Object
Objects are used for structured data with multiple fields.
variable "cat_profile" {
type = object({
name = string
color = string
age = number
food = list(string)
favorite_pet = bool
})
default = {
name = "Tom"
color = "Brown"
age = 7
food = ["fish", "chicken", "turkey"]
favorite_pet = true
}
}
Objects offer strong typing and are perfect for complex resource definitions.
Tuple
Tuples are ordered collections of values with mixed types.
variable "pet_details" {
type = tuple([string, number, bool])
default = ["cat", 7, true]
}
Each element must match the declared type and position. Adding more elements or mismatching types will trigger validation errors.
Combining Type Constraints
You can combine types for enhanced validation. Examples:
list(number)
ensures all elements are numbers.map(string)
validates key-value pairs as strings.set(bool)
restricts values to true/false without duplication.
Incorrect types will lead to errors during terraform plan
or terraform apply
, enforcing strong validation early.
Real-World Use Cases
Let’s say you want to deploy EC2 instances with different instance types for different environments. Rather than hardcoding the values, you can create a variables.tf
like this:
variable "instance_type" {
type = string
default = "t2.micro"
}
Then in your main.tf
, reference it:
resource "aws_instance" "web" {
ami = "ami-123456"
instance_type = var.instance_type
}
To override the default, supply a .tfvars
file or CLI flag. This makes the module reusable for dev, staging, or production with a single codebase.
Conclusion
Understanding the Terraform variable block is critical to writing scalable and maintainable infrastructure code. By utilizing different data types—strings, numbers, lists, maps, sets, objects, and tuples—you can model almost any input requirement in your Terraform workflow.
With strong validation and dynamic configuration, variable blocks are more than just a convenience—they’re a best practice in modern DevOps automation.
Frequently Asked Questions (FAQs)
1. What is a variable block in Terraform?
A variable block is used to declare input values that can be reused throughout your configuration.
2. What types of variables does Terraform support?
Terraform supports string, number, bool, list, map, set, object, and tuple variable types.
3. Can I define variables without specifying a type?
Yes, if no type is specified, Terraform defaults to type any
, but this is not recommended for production.
4. What’s the difference between list and set?
Both store collections, but sets do not allow duplicates and are unordered.
5. When should I use objects or tuples?
Use objects for structured key-value data and tuples for ordered collections of mixed types.