Bird
Raised Fist0
Terraformcloud~5 mins

Module composition patterns in Terraform - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a Terraform module?
A Terraform module is a container for multiple resources that are used together. It helps organize and reuse infrastructure code like building blocks.
Click to reveal answer
beginner
What does 'module composition' mean in Terraform?
Module composition means combining smaller modules inside bigger modules to build complex infrastructure in a simple, reusable way.
Click to reveal answer
intermediate
Name two common patterns for composing Terraform modules.
1. Nested modules: calling one module inside another. 2. Wrapper modules: modules that group other modules to provide a simpler interface.
Click to reveal answer
intermediate
Why use wrapper modules in Terraform?
Wrapper modules simplify complex setups by grouping multiple modules and exposing only needed inputs and outputs, making it easier to use.
Click to reveal answer
beginner
How do you pass variables between composed Terraform modules?
You pass variables by defining inputs in the child module and providing values from the parent module when calling it.
Click to reveal answer
What is the main benefit of using Terraform modules?
AAvoid using variables
BIncrease cloud costs
CMake code harder to read
DReuse and organize infrastructure code
Which pattern involves calling one module inside another in Terraform?
ANested module
BSingleton module
CWrapper module
DFlat module
What is a wrapper module used for?
ATo delete resources automatically
BTo increase deployment time
CTo group multiple modules and simplify usage
DTo avoid using outputs
How do you provide input values to a child module in Terraform?
ABy defining variables in the child and passing values from the parent
BBy hardcoding values inside the child module
CBy using environment variables only
DBy copying code manually
Which of these is NOT a benefit of module composition?
ASimplified infrastructure management
BIncreased code duplication
CImproved code reuse
DEasier collaboration
Explain how nested modules work in Terraform and why they are useful.
Think about how small building blocks combine to make bigger structures.
You got /4 concepts.
    Describe the purpose of wrapper modules and how they improve Terraform code usability.
    Imagine a remote control that controls many devices with fewer buttons.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using module composition patterns in Terraform?
      easy
      A. To combine multiple modules by passing outputs as inputs for better organization
      B. To write all resources in a single large file
      C. To avoid using variables in Terraform configurations
      D. To deploy resources without any dependencies

      Solution

      1. Step 1: Understand module composition

        Module composition means connecting modules by using outputs from one as inputs to another.
      2. Step 2: Recognize benefits

        This approach keeps infrastructure code organized, reusable, and easier to manage.
      3. Final Answer:

        To combine multiple modules by passing outputs as inputs for better organization -> Option A
      4. Quick Check:

        Module composition = combining modules with outputs as inputs [OK]
      Hint: Think of modules as building blocks connected by outputs [OK]
      Common Mistakes:
      • Thinking modules should be combined by copying code
      • Believing variables are avoided in module composition
      • Assuming modules work independently without connections
      2. Which of the following is the correct syntax to pass an output from one module as an input to another in Terraform?
      easy
      A. output.moduleA.output_name
      B. module.moduleA.output_name
      C. var.moduleA.output_name
      D. resource.moduleA.output_name

      Solution

      1. Step 1: Recall Terraform module output reference syntax

        Outputs from a module are accessed using module.<module_name>.<output_name>.
      2. Step 2: Compare options

        Only module.moduleA.output_name matches the correct syntax for accessing module outputs.
      3. Final Answer:

        module.moduleA.output_name -> Option B
      4. Quick Check:

        Module output reference = module.module_name.output_name [OK]
      Hint: Outputs are accessed via module.<name>.<output> [OK]
      Common Mistakes:
      • Using var or resource instead of module to access outputs
      • Confusing output blocks with module references
      • Using incorrect keywords like output.moduleA
      3. Given the following Terraform code snippet, what will be the value of moduleB's input instance_id?
      module "moduleA" {
        source = "./moduleA"
      }
      
      module "moduleB" {
        source      = "./moduleB"
        instance_id = module.moduleA.instance_id
      }
      medium
      A. The value of the output named instance_id from moduleA
      B. A syntax error because instance_id is not defined
      C. The string literal 'module.moduleA.instance_id'
      D. Null because moduleB does not have instance_id output

      Solution

      1. Step 1: Identify module output usage

        The input instance_id for moduleB is assigned from module.moduleA.instance_id, which means it uses the output named instance_id from moduleA.
      2. Step 2: Understand value passing

        This passes the actual value of moduleA's output to moduleB's input, not a string or error.
      3. Final Answer:

        The value of the output named instance_id from moduleA -> Option A
      4. Quick Check:

        moduleB.instance_id = moduleA.instance_id output value [OK]
      Hint: module.<name>.<output> passes actual output value, not string [OK]
      Common Mistakes:
      • Thinking it passes a string literal instead of value
      • Assuming syntax error due to missing variable declaration
      • Confusing inputs and outputs between modules
      4. You have two modules: moduleA outputs vpc_id, and moduleB requires vpc_id as input. The following code causes an error:
      module "moduleA" {
        source = "./moduleA"
      }
      
      module "moduleB" {
        source = "./moduleB"
        vpc_id = var.vpc_id
      }
      What is the most likely cause of the error?
      medium
      A. moduleB source path is incorrect
      B. moduleA does not have an output named vpc_id
      C. moduleB is using var.vpc_id instead of module.moduleA.vpc_id as input
      D. Terraform does not support passing outputs between modules

      Solution

      1. Step 1: Check input assignment in moduleB

        moduleB expects vpc_id input, but it is assigned from var.vpc_id, which is a variable, not the output from moduleA.
      2. Step 2: Identify correct way to pass output

        The correct way is to assign vpc_id = module.moduleA.vpc_id to pass the output from moduleA.
      3. Final Answer:

        moduleB is using var.vpc_id instead of module.moduleA.vpc_id as input -> Option C
      4. Quick Check:

        Pass outputs via module.moduleA.output, not var [OK]
      Hint: Use module.<name>.<output> to pass outputs, not var.<name> [OK]
      Common Mistakes:
      • Assuming var.vpc_id automatically links to moduleA output
      • Ignoring the need to explicitly connect modules
      • Thinking Terraform cannot pass outputs between modules
      5. You want to create a composed Terraform setup where moduleC depends on outputs from both moduleA and moduleB. Which pattern correctly composes these modules to pass outputs as inputs to moduleC?
      // Option A
      module "moduleC" {
        source = "./moduleC"
        inputA = module.moduleA.outputA
        inputB = module.moduleB.outputB
      }
      
      // Option B
      module "moduleC" {
        source = "./moduleC"
        inputA = var.outputA
        inputB = var.outputB
      }
      
      // Option C
      module "moduleC" {
        source = "./moduleC"
        inputA = module.moduleB.outputB
        inputB = module.moduleA.outputA
      }
      
      // Option D
      module "moduleC" {
        source = "./moduleC"
        inputA = module.moduleA.outputB
        inputB = module.moduleB.outputA
      }
      hard
      A. Mix outputs incorrectly between modules
      B. Use variables instead of module outputs for inputs
      C. Swap inputs but still use correct module outputs
      D. Pass outputs correctly matching input names from moduleA and moduleB

      Solution

      1. Step 1: Match inputs to correct module outputs

        Pass outputs correctly matching input names from moduleA and moduleB passes inputA from moduleA.outputA and inputB from moduleB.outputB, matching names correctly.
      2. Step 2: Evaluate other options

        Use variables instead of module outputs for inputs uses variables instead of outputs, which breaks composition. Swap inputs but still use correct module outputs swaps the assignments, mismatching inputA (expects moduleA.outputA) with moduleB.outputB and inputB with moduleA.outputA. Mix outputs incorrectly between modules mixes outputs incorrectly, likely causing errors.
      3. Final Answer:

        Pass outputs correctly matching input names from moduleA and moduleB -> Option D
      4. Quick Check:

        Correct output-to-input mapping = Pass outputs correctly matching input names from moduleA and moduleB [OK]
      Hint: Match input names to correct module outputs carefully [OK]
      Common Mistakes:
      • Swapping outputs between modules without checking input expectations
      • Using variables instead of module outputs
      • Mixing output names incorrectly causing runtime 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