Bird
Raised Fist0
Terraformcloud~5 mins

For_each for map-based instances in Terraform - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What does for_each do in Terraform when used with a map?

for_each lets you create multiple resources, one for each item in the map. Each resource gets a unique key from the map.

Click to reveal answer
beginner
How do you access the key and value inside a for_each block for a map?

Use each.key for the map key and each.value for the map value inside the resource block.

Click to reveal answer
intermediate
Why is using a map with for_each better than a list for some cases?
<p>Maps let you name each instance with a key, making it easier to identify and update specific resources.</p>
Click to reveal answer
intermediate
What happens if you change the keys in the map used by for_each?

Terraform will see the old keys as removed and new keys as added, so it will destroy and create resources accordingly.

Click to reveal answer
beginner
Show a simple example of for_each with a map to create multiple AWS EC2 instances.
resource "aws_instance" "example" {
  for_each = {
    web1 = "t2.micro"
    web2 = "t2.small"
  }

  ami           = "ami-123456"
  instance_type = each.value
  tags = {
    Name = each.key
  }
}
Click to reveal answer
What does each.key represent in a for_each loop over a map?
AThe index number of the item
BThe key of the current map item
CThe value of the current map item
DThe total number of items
If you want to create resources with names from a map, which Terraform feature helps you do this easily?
Afor_each
Bcount
Cvariable interpolation
Dlocals
What happens if you use a list instead of a map with for_each?
ATerraform will fail to apply
BTerraform will create only one resource
CTerraform will use list indexes as keys
DTerraform will ignore the list
Why should you avoid changing keys in a map used by for_each after deployment?
AIt automatically updates resources without changes
BIt improves performance
CIt makes Terraform ignore the resources
DIt causes Terraform to recreate resources
In the example for_each = { web1 = "t2.micro", web2 = "t2.small" }, what is each.value for the resource named web2?
A"t2.small"
Bnull
C"t2.micro"
D"web2"
Explain how for_each works with maps in Terraform and why it is useful.
Think about how maps have keys and values and how Terraform uses them.
You got /4 concepts.
    Describe what happens if you rename a key in the map used by for_each after resources are created.
    Consider how Terraform tracks resources by keys.
    You got /4 concepts.

      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