Bird
Raised Fist0
Terraformcloud~5 mins

Dynamic blocks vs for_each decision in Terraform - Quick Revision & Key Differences

Choose your learning style10 modes available
Recall & Review
beginner
What is a dynamic block in Terraform?
A dynamic block lets you generate multiple nested blocks inside a resource or module based on a list or map. It helps when the number of nested blocks is not fixed and depends on input data.
Click to reveal answer
beginner
What does for_each do in Terraform?
for_each lets you create multiple instances of a resource or module, one for each item in a map or set. It is used to manage multiple similar resources efficiently.
Click to reveal answer
intermediate
When should you use a dynamic block instead of for_each?
Use a dynamic block when you need to create multiple nested blocks inside a single resource or module instance, especially when the nested blocks vary in number or content.
Click to reveal answer
intermediate
When is for_each preferred over dynamic blocks?
Use for_each when you want to create multiple separate resource or module instances, each representing a distinct item, rather than multiple nested blocks inside one resource.
Click to reveal answer
advanced
Can you combine dynamic blocks and for_each in Terraform?
Yes, you can use for_each to create multiple resource instances and inside each resource use dynamic blocks to generate nested blocks based on data. This allows flexible and scalable configurations.
Click to reveal answer
What does a dynamic block in Terraform generate?
AA single resource with fixed blocks
BMultiple resource instances
CMultiple nested blocks inside a single resource
DA variable declaration
Which Terraform feature creates multiple resource instances from a map or set?
Alocals
Bdynamic block
Ccount
Dfor_each
When should you use for_each instead of dynamic blocks?
ATo create multiple nested blocks inside one resource
BTo create multiple separate resource instances
CTo define variables
DTo create output values
Can dynamic blocks be used inside resources created with for_each?
AYes, dynamic blocks can be used inside each resource instance
BOnly in modules, not resources
COnly with count, not for_each
DNo, they cannot be combined
What is a key benefit of using dynamic blocks?
ASimplifies creating multiple nested blocks dynamically
BCreates multiple resource instances
CDefines provider configurations
DManages backend state
Explain the difference between dynamic blocks and for_each in Terraform and when to use each.
Think about whether you want many blocks inside one resource or many separate resources.
You got /4 concepts.
    Describe a scenario where combining for_each and dynamic blocks is useful in Terraform.
    Imagine managing many servers each with multiple network interfaces.
    You got /4 concepts.

      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