Bird
Raised Fist0
Terraformcloud~10 mins

Dynamic blocks vs for_each decision in Terraform - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to iterate over a collection of subnet CIDRs using for_each.

Terraform
resource "aws_subnet" "example" {
  for_each = [1]
  vpc_id     = var.vpc_id
  cidr_block = each.value
}
Drag options to blanks, or click blank then click option'
Aeach.value
Bvar.vpc_id
Caws_vpc.main
Dvar.subnet_cidrs
Attempts:
3 left
💡 Hint
Common Mistakes
Using a single value instead of a collection for for_each.
Confusing for_each with count.
2fill in blank
medium

Complete the dynamic block to add multiple ingress rules inside a security group.

Terraform
resource "aws_security_group" "example" {
  name        = "example-sg"
  description = "Example security group"

  dynamic "ingress" {
    for_each = [1]
    content {
      from_port   = ingress.value.from_port
      to_port     = ingress.value.to_port
      protocol    = ingress.value.protocol
      cidr_blocks = ingress.value.cidr_blocks
    }
  }
}
Drag options to blanks, or click blank then click option'
Avar.vpc_id
Bvar.ingress_rules
Caws_subnet.example
Dvar.subnet_cidrs
Attempts:
3 left
💡 Hint
Common Mistakes
Assigning a non-collection value to for_each in dynamic block.
Using resource references instead of variables for rules.
3fill in blank
hard

Fix the error in this dynamic block that tries to create multiple tags but uses incorrect syntax.

Terraform
resource "aws_instance" "example" {
  ami           = var.ami
  instance_type = var.instance_type

  dynamic "tag" {
    for_each = var.tags
    content {
      [1] = tag.key
      value       = tag.value
    }
  }
}
Drag options to blanks, or click blank then click option'
Akey
Btag_key
Ctags
Dtag
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'tags' instead of 'key' inside the content block.
Not providing both key and value attributes.
4fill in blank
hard

Fill both blanks to correctly use for_each and dynamic block to create multiple EBS volumes attached to an instance.

Terraform
resource "aws_instance" "example" {
  ami           = var.ami
  instance_type = var.instance_type

  dynamic "ebs_block_device" {
    for_each = [1]
    content {
      device_name = ebs_block_device.value.device_name
      volume_size = [2]
    }
  }
}
Drag options to blanks, or click blank then click option'
Avar.ebs_volumes
Bvar.volume_sizes
Cebs_block_device.value.size
Debs_block_device.value.volume_size
Attempts:
3 left
💡 Hint
Common Mistakes
Using a variable that is not a collection for for_each.
Incorrect attribute name for volume size.
5fill in blank
hard

Fill all three blanks to create multiple IAM policy statements using dynamic blocks with for_each.

Terraform
resource "aws_iam_role" "example" {
  name = "example-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Action = "sts:AssumeRole"
      Effect = "Allow"
      Principal = {
        Service = "ec2.amazonaws.com"
      }
    }]
  })
}

data "aws_iam_policy_document" "example" {
  dynamic "statement" {
    for_each = [1]
    content {
      effect    = "Allow"
      actions   = statement.value.[2]
      resources = statement.value.[3]
    }
  }
}

resource "aws_iam_role_policy" "example" {
  name   = "example-policy"
  role   = aws_iam_role.example.id
  policy = data.aws_iam_policy_document.example.json
}
Drag options to blanks, or click blank then click option'
Avar.policies
Bactions
Cresources
Dpolicy_name
Attempts:
3 left
💡 Hint
Common Mistakes
Using incorrect keys for actions or resources.
Not using a map for for_each.

Practice

(1/5)
1. Which Terraform feature should you use to repeat a nested block inside a single resource?
easy
A. Dynamic blocks
B. for_each on the resource
C. count on the resource
D. locals block

Solution

  1. Step 1: Understand nested block repetition

    Dynamic blocks are designed to repeat nested blocks inside a single resource.
  2. Step 2: Compare with for_each usage

    for_each repeats entire resources or top-level blocks, not nested blocks.
  3. Final Answer:

    Dynamic blocks -> Option A
  4. Quick Check:

    Nested block repetition = Dynamic blocks [OK]
Hint: Use dynamic blocks for nested repeated settings [OK]
Common Mistakes:
  • Using for_each to repeat nested blocks inside one resource
  • Confusing count with dynamic blocks
  • Trying to use locals for repeating blocks
2. Which syntax correctly uses a dynamic block inside a resource to repeat a nested block named setting?
easy
A. locals { setting = var.settings } resource { setting = local.setting }
B. for_each = var.settings { setting { key = each.value } }
C. count = length(var.settings) setting { key = var.settings[count.index] }
D. dynamic "setting" { for_each = var.settings; content { key = each.value } }

Solution

  1. Step 1: Identify correct dynamic block syntax

    Dynamic blocks use the syntax: dynamic "block_name" { for_each = ... content { ... } }.
  2. Step 2: Check other options for syntax errors

    Options A, B, and C misuse for_each, count, or locals incorrectly for nested blocks.
  3. Final Answer:

    dynamic "setting" { for_each = var.settings; content { key = each.value } } -> Option D
  4. Quick Check:

    Correct dynamic block syntax = dynamic "setting" { for_each = var.settings; content { key = each.value } } [OK]
Hint: Dynamic blocks use dynamic "name" with for_each and content [OK]
Common Mistakes:
  • Placing for_each directly inside resource without dynamic
  • Using count for nested blocks
  • Trying to assign locals directly as blocks
3. Given this Terraform snippet, what will be the number of aws_security_group_rule resources created?
resource "aws_security_group_rule" "example" {
  for_each = { for idx, port in var.ports : idx => port }
  type        = "ingress"
  from_port   = each.value
  to_port     = each.value
  protocol    = "tcp"
  security_group_id = var.sg_id
}
Assuming var.ports = [80, 443].
medium
A. 1 resource
B. 2 resources
C. No resources, syntax error
D. One resource with two ports

Solution

  1. Step 1: Understand for_each on resource

    for_each creates one resource instance per map or set element. Here, var.ports has 2 elements.
  2. Step 2: Count resource instances

    Since var.ports has 2 ports, Terraform creates 2 aws_security_group_rule resources, one for each port.
  3. Final Answer:

    2 resources -> Option B
  4. Quick Check:

    for_each with 2 items = 2 resources [OK]
Hint: for_each creates one resource per item in collection [OK]
Common Mistakes:
  • Thinking for_each creates one resource regardless of items
  • Confusing dynamic blocks with resource repetition
  • Assuming ports combine into one resource
4. This Terraform code throws an error. What is the main issue?
resource "aws_instance" "example" {
  for_each = var.instances
  ami           = "ami-123456"
  instance_type = "t2.micro"

  dynamic "ebs_block_device" {
    for_each = each.value.ebs_volumes
    content {
      device_name = ebs_block_device.value.device_name
      volume_size = ebs_block_device.value.size
    }
  }
}
Assuming var.instances is a map with nested ebs_volumes lists.
medium
A. Dynamic blocks cannot be nested inside resources
B. for_each cannot be used on resources
C. Incorrect reference to dynamic block variable inside content
D. Missing count argument on resource

Solution

  1. Step 1: Identify the error in dynamic block reference

    Inside the content block of a dynamic block, the iterator must be referenced as each.value, not ebs_block_device.value. The iterator variable is always each regardless of the dynamic block name.
  2. Step 2: Confirm the fix

    Change to device_name = each.value.device_name and volume_size = each.value.size. Other options are incorrect: dynamic blocks work inside resources, for_each works on resources, count is not required.
  3. Final Answer:

    Incorrect reference to dynamic block variable inside content -> Option C
  4. Quick Check:

    Dynamic block content uses each.value [OK]
Hint: Inside dynamic content, always use each.value, not block_name.value [OK]
Common Mistakes:
  • Using block_name.value inside dynamic block content instead of each.value
  • Trying to use for_each on resource incorrectly
  • Forgetting to define for_each on dynamic block
5. You want to create multiple AWS IAM users, each with multiple inline policies. Which Terraform approach is best to manage this efficiently? A snippet of your variables:
variable "users" {
  type = map(object({
    policies = list(object({
      name   = string
      policy = string
    }))
  }))
}
hard
A. Use for_each on aws_iam_user for users, and for_each on aws_iam_user_policy for policies
B. Use count on aws_iam_user for users, and for_each on aws_iam_user_policy for policies
C. Use for_each on aws_iam_user resource for users, and dynamic blocks inside aws_iam_user_policy for policies
D. Use dynamic blocks on aws_iam_user resource for users, and count on aws_iam_user_policy for policies

Solution

  1. Step 1: Manage multiple users

    Use for_each on aws_iam_user resource to create one user per map entry.
  2. Step 2: Manage multiple policies per user

    Since policies are separate resources (aws_iam_user_policy), use for_each on that resource to create one policy per user-policy pair.
  3. Step 3: Why not dynamic blocks here?

    Dynamic blocks repeat nested blocks inside a resource, but aws_iam_user_policy is a separate resource, so for_each is appropriate.
  4. Final Answer:

    Use for_each on aws_iam_user for users, and for_each on aws_iam_user_policy for policies -> Option A
  5. Quick Check:

    Multiple resources = for_each on both [OK]
Hint: Use for_each for multiple resources, dynamic blocks for nested blocks [OK]
Common Mistakes:
  • Using dynamic blocks to create multiple resources
  • Using count instead of for_each for maps
  • Trying to nest policies inside user resource with dynamic blocks
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