Bird
Raised Fist0
Terraformcloud~3 mins

Count vs for_each decision in Terraform - When to Use Which

Choose your learning style10 modes available
The Big Idea

What if you could create dozens of cloud resources by writing just one block of code?

The Scenario

Imagine you need to create multiple cloud resources, like servers or storage buckets, by writing each one separately in your configuration.

You copy and paste blocks of code, changing only names or IDs manually.

The Problem

This manual way is slow and boring.

It's easy to make mistakes like forgetting to update a name or creating duplicates.

When you want to add or remove resources, you must edit many places, which wastes time and causes errors.

The Solution

Using count or for_each lets you write one block of code that automatically creates many resources.

This saves time, reduces mistakes, and makes your setup easy to change.

Before vs After
✗ Before
resource "aws_instance" "server1" { ... }
resource "aws_instance" "server2" { ... }
✓ After
resource "aws_instance" "servers" {
  count = 2
  ...
}
What It Enables

You can quickly and safely manage many resources with simple, clear code that adapts as your needs grow.

Real Life Example

A company needs 10 identical virtual machines for a project.

Instead of writing 10 blocks, they use count = 10 to create all at once.

Later, they add 5 more by changing one number.

Key Takeaways

Manual resource creation is slow and error-prone.

count and for_each automate resource creation.

This makes infrastructure easy to scale and maintain.

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