Bird
Raised Fist0
Terraformcloud~30 mins

For_each for map-based instances in Terraform - Mini Project: Build & Apply

Choose your learning style10 modes available
For_each for map-based instances
📖 Scenario: You are setting up multiple virtual machines (instances) in the cloud. Each instance has a unique name and a specific size. You want to create these instances efficiently using Terraform.
🎯 Goal: Create a Terraform configuration that uses for_each to deploy multiple instances from a map of instance names and sizes.
📋 What You'll Learn
Define a map variable with instance names as keys and sizes as values
Use for_each in the resource block to create instances from the map
Assign the instance name and size from the map values
Output the instance IDs after creation
💡 Why This Matters
🌍 Real World
Cloud engineers often need to deploy multiple similar resources with different configurations. Using for_each with maps helps manage these resources efficiently.
💼 Career
Understanding for_each with maps in Terraform is essential for infrastructure as code roles, enabling scalable and maintainable cloud deployments.
Progress0 / 4 steps
1
Define the instances map variable
Create a Terraform variable called instances of type map(string) with these exact entries: "web1" = "small", "web2" = "medium", "db1" = "large".
Terraform
Hint

Use variable block with type = map(string) and set default to the given map.

2
Add a local variable for instance configuration
Create a local variable called instance_config that references the var.instances variable.
Terraform
Hint

Use a locals block to assign instance_config to var.instances.

3
Create instances using for_each
Create a resource block resource "aws_instance" "example" that uses for_each = local.instance_config. Set the instance_type to each.value and the tags with a Name key set to each.key.
Terraform
Hint

Use for_each with local.instance_config. Set instance_type to each.value and tag the instance with Name = each.key.

4
Output the instance IDs
Create an output called instance_ids that outputs a map of instance names to their IDs using aws_instance.example and for_each.
Terraform
Hint

Use an output block with a for expression to map instance names to their IDs.

Practice

(1/5)
1. What does for_each do when used with a map in Terraform?
easy
A. Creates resources only for the first key in the map
B. Deletes all resources in the map
C. Combines all map entries into a single resource
D. Creates one resource for each key-value pair in the map

Solution

  1. Step 1: Understand the role of for_each with maps

    for_each iterates over each key-value pair in a map to create multiple resources.
  2. Step 2: Recognize resource creation behavior

    Each key-value pair results in one resource instance, using each.key and each.value inside the resource block.
  3. Final Answer:

    Creates one resource for each key-value pair in the map -> Option D
  4. Quick Check:

    for_each with map = one resource per pair [OK]
Hint: Remember: for_each maps keys to separate resources [OK]
Common Mistakes:
  • Thinking for_each merges all map entries into one resource
  • Assuming for_each deletes resources
  • Believing for_each only uses the first map key
2. Which of the following is the correct syntax to use for_each with a map in a Terraform resource?
easy
A. resource "aws_instance" "example" { for_each = { key1 = "val1", key2 = "val2" } }
B. resource "aws_instance" "example" { for_each = ("key1", "key2") }
C. resource "aws_instance" "example" { for_each = "key1" }
D. resource "aws_instance" "example" { for_each = ["one", "two"] }

Solution

  1. Step 1: Identify valid for_each types

    for_each accepts a map or set of strings, but here we focus on map usage.
  2. Step 2: Check syntax correctness

    resource "aws_instance" "example" { for_each = { key1 = "val1", key2 = "val2" } } uses a map with key-value pairs correctly inside curly braces, which is valid Terraform syntax.
  3. Final Answer:

    resource "aws_instance" "example" { for_each = { key1 = "val1", key2 = "val2" } } -> Option A
  4. Quick Check:

    Map syntax with curly braces = correct for_each [OK]
Hint: Use curly braces for maps in for_each [OK]
Common Mistakes:
  • Using square brackets for maps instead of curly braces
  • Passing a single string instead of a map
  • Using parentheses which are invalid here
3. Given the Terraform snippet:
variable "servers" {
  default = {
    web = "10.0.0.1"
    db  = "10.0.0.2"
  }
}

resource "aws_instance" "example" {
  for_each = var.servers
  ami           = "ami-123456"
  instance_type = "t2.micro"
  tags = {
    Name = each.key
    IP   = each.value
  }
}

What will be the value of the tag Name for the instance with IP 10.0.0.2?
medium
A. web
B. 10.0.0.2
C. db
D. example

Solution

  1. Step 1: Map keys to IP addresses

    The map has keys 'web' and 'db' with values '10.0.0.1' and '10.0.0.2' respectively.
  2. Step 2: Match IP to key

    The IP '10.0.0.2' corresponds to the key 'db', so the tag Name will be 'db'.
  3. Final Answer:

    db -> Option C
  4. Quick Check:

    each.key for IP 10.0.0.2 = db [OK]
Hint: Match IP value to map key for Name tag [OK]
Common Mistakes:
  • Confusing key and value in the map
  • Using IP as the Name tag instead of the key
  • Assuming static tag values
4. What is wrong with this Terraform resource using for_each on a map?
resource "aws_instance" "example" {
  for_each = { "one" = "10.0.0.1", "two" = "10.0.0.2" }
  ami           = "ami-123456"
  instance_type = "t2.micro"
  tags = {
    Name = each.value
  }
  count = 2
}
medium
A. Using both for_each and count together causes an error
B. The map syntax is invalid
C. Missing each.key in tags
D. AMI ID is incorrect

Solution

  1. Step 1: Check resource meta-arguments

    Terraform does not allow using both for_each and count in the same resource block.
  2. Step 2: Identify the error cause

    The presence of count = 2 alongside for_each causes a configuration error.
  3. Final Answer:

    Using both for_each and count together causes an error -> Option A
  4. Quick Check:

    for_each and count cannot coexist [OK]
Hint: Never mix for_each and count in one resource [OK]
Common Mistakes:
  • Thinking map syntax is wrong
  • Believing missing each.key causes error
  • Assuming AMI ID is the problem
5. You have a map of server roles and IPs:
servers = {
  app1 = "10.0.1.1"
  app2 = ""
  app3 = "10.0.1.3"
  app4 = null
}

You want to create AWS instances only for servers with valid IPs using for_each. Which expression correctly filters the map to exclude empty or null IPs?
hard
A. for_each = var.servers
B. for_each = { for k, v in var.servers : k => v if v != "" && v != null }
C. for_each = { for k, v in var.servers : k => v if v == "" || v == null }
D. for_each = [ for v in var.servers : v if v != "" ]

Solution

  1. Step 1: Understand filtering with for expressions

    Use a for expression with an if condition to filter out empty strings and null values from the map.
  2. Step 2: Check each option

    for_each = { for k, v in var.servers : k => v if v != "" && v != null } correctly filters keys where value is neither empty string nor null, producing a valid filtered map for for_each.
  3. Final Answer:

    for_each = { for k, v in var.servers : k => v if v != "" && v != null } -> Option B
  4. Quick Check:

    Filter map with if condition to exclude empty/null [OK]
Hint: Filter map with for and if to exclude empty/null [OK]
Common Mistakes:
  • Not filtering out empty or null values
  • Using list comprehension instead of map
  • Filtering for empty/null instead of excluding them
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard