Bird
Raised Fist0
Terraformcloud~30 mins

Count vs for_each decision in Terraform - Hands-On Comparison

Choose your learning style10 modes available
Count vs for_each decision
📖 Scenario: You are setting up cloud resources using Terraform. You want to create multiple virtual machines (VMs) in a cloud environment. Some VMs are identical, and some have unique names and settings.
🎯 Goal: Learn when to use count and when to use for_each in Terraform to create multiple resources efficiently.
📋 What You'll Learn
Create a variable with a list of VM names
Create a variable with the number of identical VMs
Use count to create identical VMs
Use for_each to create uniquely named VMs
💡 Why This Matters
🌍 Real World
Cloud engineers often need to create multiple resources that are either identical or unique. Knowing when to use <code>count</code> or <code>for_each</code> helps manage infrastructure efficiently.
💼 Career
Understanding <code>count</code> and <code>for_each</code> is essential for Terraform users to write scalable and maintainable infrastructure code.
Progress0 / 4 steps
1
Create a list variable with VM names
Create a Terraform variable called vm_names with the list ["web1", "web2", "db1"].
Terraform
Hint

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

2
Create a variable for identical VM count
Create a Terraform variable called vm_count with the default value 3.
Terraform
Hint

Use a variable block with type = number and default = 3.

3
Use count to create identical VMs
Create a resource block resource "azurerm_virtual_machine" "identical_vm" that uses count = var.vm_count and sets name = "vm-${count.index + 1}".
Terraform
Hint

Use count = var.vm_count and name = "vm-${count.index + 1}" inside the resource block.

4
Use for_each to create uniquely named VMs
Create a resource block resource "azurerm_virtual_machine" "unique_vm" that uses for_each = toset(var.vm_names) and sets name = each.key.
Terraform
Hint

Use for_each = toset(var.vm_names) and name = each.key inside the resource block.

Practice

(1/5)
1. Which Terraform argument should you use when you want to create 3 identical resources without unique identifiers?
easy
A. count = 3
B. for_each = {}
C. for_each = toset(["a", "b", "c"])
D. count = 0

Solution

  1. Step 1: Understand the purpose of count

    count creates multiple copies of a resource by number, perfect for identical resources.
  2. Step 2: Compare with for_each

    for_each is used when you want unique keys or values to identify each resource, not just copies.
  3. Final Answer:

    count = 3 -> Option A
  4. Quick Check:

    Simple copies = count [OK]
Hint: Use count for number copies, for_each for unique keys [OK]
Common Mistakes:
  • Using for_each when only number copies are needed
  • Setting count to zero expecting resources
  • Confusing sets with counts
2. Which of the following is the correct syntax to create resources using for_each with a map in Terraform?
easy
A. resource "aws_instance" "example" { for_each = ["a", "b"] }
B. resource "aws_instance" "example" { for_each = "string" }
C. resource "aws_instance" "example" { count = 2 }
D. resource "aws_instance" "example" { for_each = { key1 = "val1", key2 = "val2" } }

Solution

  1. Step 1: Identify valid for_each types

    for_each accepts maps or sets, not lists or strings directly.
  2. Step 2: Check each option

    resource "aws_instance" "example" { for_each = { key1 = "val1", key2 = "val2" } } uses a map with keys and values, which is valid syntax for for_each.
  3. Final Answer:

    resource with for_each map -> Option D
  4. Quick Check:

    for_each needs map or set [OK]
Hint: for_each needs map or set, not list or string [OK]
Common Mistakes:
  • Using list instead of map/set for for_each
  • Confusing count with for_each syntax
  • Passing string directly to for_each
3. Given this Terraform snippet:
resource "aws_s3_bucket" "buckets" {
  for_each = { bucket1 = "private", bucket2 = "public-read" }
  bucket = each.key
  acl = each.value
}

What will be the names of the created buckets?
medium
A. ["each.key", "each.value"]
B. ["private", "public-read"]
C. ["bucket1", "bucket2"]
D. No buckets created due to syntax error

Solution

  1. Step 1: Understand for_each map keys and values

    The keys are bucket1 and bucket2, values are ACL values.
  2. Step 2: Check bucket assignment

    The bucket name is set to each.key, so buckets named "bucket1" and "bucket2" are created.
  3. Final Answer:

    ["bucket1", "bucket2"] -> Option C
  4. Quick Check:

    Bucket names = map keys [OK]
Hint: for_each keys become resource identifiers [OK]
Common Mistakes:
  • Using values as bucket names instead of keys
  • Assuming syntax error without checking
  • Confusing each.key with each.value
4. You wrote this Terraform resource:
resource "aws_instance" "example" {
  count = length(var.instances)
  name  = var.instances[count.index]
}

But Terraform throws an error about count.index. What is the likely cause?
medium
A. count is used but for_each should be used for maps
B. var.instances is a map, but count expects a list
C. You cannot use count.index inside resource blocks
D. count must be a fixed number, not a variable

Solution

  1. Step 1: Identify variable type mismatch

    var.instances is likely a map, but count works with numbers and lists indexed by numbers.
  2. Step 2: Choose correct iterator

    For maps, for_each is the correct choice to iterate over keys and values.
  3. Final Answer:

    Use for_each for maps, not count -> Option A
  4. Quick Check:

    Maps need for_each, not count [OK]
Hint: Use for_each for maps, count for lists [OK]
Common Mistakes:
  • Using count.index with maps
  • Assuming count must be fixed number
  • Ignoring variable data type
5. You want to create multiple AWS IAM users with unique usernames and policies from this map:
users = {
  alice = "admin",
  bob = "read-only",
  carol = "power-user"
}

Which Terraform resource block correctly uses count or for_each to create these users with unique names?
hard
A.
resource "aws_iam_user" "user" {
  count = length(keys(var.users))
  name  = keys(var.users)[count.index]
  policy = var.users[name]
}
B.
resource "aws_iam_user" "user" {
  for_each = var.users
  name     = each.key
  policy   = each.value
}
C.
resource "aws_iam_user" "user" {
  count = 3
  name  = var.users[count.index]
  policy = var.users[count.index]
}
D.
resource "aws_iam_user" "user" {
  for_each = toset(var.users)
  name     = each.value
  policy   = each.key
}

Solution

  1. Step 1: Analyze data structure

    The users variable is a map with usernames as keys and policies as values.
  2. Step 2: Match iteration method

    for_each works well with maps to create uniquely identified resources using keys and values.
  3. Step 3: Check each option

    resource "aws_iam_user" "user" {
      for_each = var.users
      name     = each.key
      policy   = each.value
    }
    correctly uses for_each = var.users and assigns name = each.key and policy = each.value.
  4. Final Answer:

    Use for_each with map for unique users -> Option B
  5. Quick Check:

    Unique keys need for_each [OK]
Hint: Use for_each with maps for unique resource keys [OK]
Common Mistakes:
  • Using count with maps incorrectly
  • Mixing keys and values in wrong order
  • Using toset on maps causing errors
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