Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Why complex types matter
📖 Scenario: You are setting up a cloud infrastructure using Terraform. You need to organize your resources using complex data types to keep your configuration clean and manageable.
🎯 Goal: Build a Terraform configuration that uses complex types like maps and lists to define multiple server instances with their properties.
📋 What You'll Learn
Create a map variable with server names as keys and their IP addresses as values
Add a list variable to hold server roles
Use a for expression to create a list of server descriptions combining name, IP, and roles
Output the final list of server descriptions
💡 Why This Matters
🌍 Real World
Cloud engineers use complex types in Terraform to manage multiple resources and their properties cleanly, avoiding repetitive code.
💼 Career
Understanding complex types and for expressions is essential for writing scalable and maintainable infrastructure as code in professional cloud roles.
Progress0 / 4 steps
1
Create a map variable for servers
Create a Terraform variable called servers of type map with these exact entries: "web1" = "10.0.0.1", "db1" = "10.0.0.2", and "cache1" = "10.0.0.3".
Terraform
Hint
Use variable block with type = map(string) and set default to the given map.
2
Add a list variable for server roles
Add a Terraform variable called roles of type list with these exact values: "frontend", "backend", and "cache".
Terraform
Hint
Define a variable block with type = list(string) and set default to the given list.
3
Create a list of server descriptions
Create a local variable called server_descriptions that uses a for expression to combine each server name and IP from var.servers with the corresponding role from var.roles by matching the index. Format each description as "Name: , IP: , Role: ".
Terraform
Hint
Use a for expression with idx, name over sort(keys(var.servers)) to build the list.
4
Output the server descriptions
Add an output block called server_descriptions that outputs the local variable local.server_descriptions.
Terraform
Hint
Use an output block with value = local.server_descriptions.
Practice
(1/5)
1. Why are complex types like object or map useful in Terraform?
easy
A. They automatically fix syntax errors in your code.
B. They group related data together for better organization and clarity.
C. They make Terraform run faster by using less memory.
D. They replace the need for variables entirely.
Solution
Step 1: Understand the purpose of complex types
Complex types like objects and maps group related pieces of data into one unit, making code clearer.
Step 2: Compare with other options
They do not speed up Terraform or fix syntax errors automatically, nor do they replace variables.
Final Answer:
They group related data together for better organization and clarity. -> Option B
Quick Check:
Complex types = group related data [OK]
Hint: Think: complex types bundle related info neatly [OK]
Common Mistakes:
Confusing complex types with performance improvements
Believing complex types fix syntax errors
Thinking complex types remove the need for variables
2. Which of the following is the correct syntax to define an object variable with attributes name (string) and age (number) in Terraform?
easy
A. variable "person" { type = object[name string, age number] }
B. variable "person" { type = map(string, number) }
C. variable "person" { type = list(object(name, age)) }
D. variable "person" { type = object({ name = string, age = number }) }
Solution
Step 1: Recall object type syntax
Terraform defines object types with curly braces and attribute names with their types inside parentheses.
Step 2: Check each option
variable "person" { type = object({ name = string, age = number }) } matches correct syntax: object({ name = string, age = number }). Others have wrong syntax or wrong type structures.
Final Answer:
variable "person" { type = object({ name = string, age = number }) } -> Option D
Quick Check:
Object type syntax = variable "person" { type = object({ name = string, age = number }) } [OK]
variable "server" {
type = object({
ip = string
ports = list(number)
})
default = {
ip = "10.0.0.1"
ports = [80, 443]
}
}
What is the value of var.server.ports[1]?
medium
A. "443"
B. 80
C. 443
D. Error: index out of range
Solution
Step 1: Understand the variable structure
The variable "server" is an object with an IP string and a list of numbers called ports: [80, 443].
Step 2: Access the second port value
Index 1 in the list is the second element, which is 443 (a number, not a string).
Final Answer:
443 -> Option C
Quick Check:
var.server.ports[1] = 443 [OK]
Hint: List index starts at 0, so 1 is second item [OK]
Common Mistakes:
Confusing index 1 with index 0
Thinking numbers are strings
Assuming index out of range error
4. This Terraform code snippet causes an error:
variable "config" {
type = object({
region = string
tags = map(string)
})
}
output "region" {
value = var.config.region
}
output "tag_value" {
value = var.config.tags["env"]
}
What is the most likely cause of the error?
medium
A. The variable config is missing a default value or input.
B. The tags attribute should be a list, not a map.
C. Output blocks cannot access variable attributes directly.
D. The syntax for accessing map values is incorrect.
Solution
Step 1: Check variable declaration and usage
The variable "config" is declared with no default, so it must be provided during apply.
Step 2: Identify error cause
If no input is given, accessing var.config.region or var.config.tags["env"] causes an error because the variable is undefined.
Final Answer:
The variable config is missing a default value or input. -> Option A
Quick Check:
Missing input for variable = error [OK]
Hint: Variables without defaults need input to avoid errors [OK]
Common Mistakes:
Assuming map access syntax is wrong
Thinking outputs can't access variables
Confusing map and list types
5. You want to pass a list of objects representing servers to a module. Each server has name (string), ip (string), and ports (list of numbers). Which variable type declaration correctly enforces this structure?
hard
A. variable "servers" { type = list(object({ name = string, ip = string, ports = list(number) })) }
B. variable "servers" { type = map(object({ name = string, ip = string, ports = list(string) })) }
C. variable "servers" { type = object({ name = list(string), ip = list(string), ports = list(number) }) }
D. variable "servers" { type = list(map(string)) }
Solution
Step 1: Understand the required structure
The variable is a list of objects, each with name (string), ip (string), and ports (list of numbers).
Step 2: Match the correct type declaration
variable "servers" { type = list(object({ name = string, ip = string, ports = list(number) })) } correctly declares a list of objects with the specified attributes and types.
Step 3: Eliminate incorrect options
variable "servers" { type = map(object({ name = string, ip = string, ports = list(string) })) } uses map instead of list and ports as list of strings (wrong type). variable "servers" { type = object({ name = list(string), ip = list(string), ports = list(number) }) } is a single object with lists, not a list of objects. variable "servers" { type = list(map(string)) } is a list of maps with string values only, missing nested list of numbers.
Final Answer:
variable "servers" { type = list(object({ name = string, ip = string, ports = list(number) })) } -> Option A
Quick Check:
List of objects with correct attributes = variable "servers" { type = list(object({ name = string, ip = string, ports = list(number) })) } [OK]
Hint: List of objects means list(object({...})) [OK]
Common Mistakes:
Confusing map and list types
Using wrong attribute types inside objects
Declaring a single object instead of list of objects