Bird
Raised Fist0
Terraformcloud~10 mins

Module outputs in Terraform - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Module outputs
Define output in module
↓
Run terraform apply
↓
Terraform processes module
↓
Module generates output value
↓
Output value available to root module
↓
Use output in root module or display
This flow shows how a Terraform module defines outputs, which are then produced during apply and made available to the root module or user.
Execution Sample
Terraform
module "example" {
  source = "./example_module"
}

output "instance_ip" {
  value = module.example.instance_ip
}
This code calls a module and outputs the instance IP address that the module provides.
Process Table
StepActionEvaluationResult
1Terraform reads root moduleFinds module blockPrepares to call example_module
2Terraform enters example_moduleProcesses resourcesCreates instance with IP 10.0.0.5
3Module output 'instance_ip' evaluatedReads instance IPValue is 10.0.0.5
4Terraform returns output to rootAssigns module.example.instance_ipValue 10.0.0.5 available
5Root module output 'instance_ip' evaluatedReads module outputOutputs 10.0.0.5 to user
6Terraform apply completesOutputs displayedinstance_ip = 10.0.0.5
💡 Terraform apply finishes after outputs are displayed to the user.
Status Tracker
VariableStartAfter Step 2After Step 3After Step 4Final
module.example.instance_ipundefinedundefined10.0.0.510.0.0.510.0.0.5
output.instance_ipundefinedundefinedundefinedundefined10.0.0.5
Key Moments - 2 Insights
Why does the output value only appear after terraform apply?
Because the module resources must be created first to have real values; see execution_table step 2 and 3 where the instance IP is assigned during apply.
Can outputs from a module be used inside the same module?
No, outputs are only available to the root or calling module after apply, not inside the module itself; outputs are for passing data out.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of module.example.instance_ip after step 3?
A10.0.0.5
Bnull
Cundefined
Dmodule output not yet evaluated
💡 Hint
Check the 'Result' column at step 3 in the execution_table.
At which step does the root module output 'instance_ip' become available to the user?
AStep 4
BStep 5
CStep 2
DStep 6
💡 Hint
Look for when the root module output is evaluated in the execution_table.
If the module did not define an output, what would happen to the root module output referencing it?
AIt would show null
BIt would show an empty string
CTerraform would error during apply
DIt would show the resource ID
💡 Hint
Outputs must be defined in the module to be accessible; see key_moments about output availability.
Concept Snapshot
Terraform module outputs:
- Defined inside modules with 'output' blocks
- Provide values from module to root module
- Available only after 'terraform apply'
- Used to share info like IPs, IDs
- Cannot be used inside the same module
- Accessed as module.<name>.<output>
Full Transcript
This visual execution shows how Terraform module outputs work. First, Terraform reads the root module and finds a module block. It then processes the module's resources, creating infrastructure like an instance with an IP address. The module defines an output that reads this IP. After creation, Terraform assigns this output value to the root module's reference. Finally, the root module outputs the value to the user after apply completes. Outputs are only available after resources exist and cannot be used inside the module itself. This flow helps pass information from modules back to the root or other modules.

Practice

(1/5)
1. What is the main purpose of output blocks in a Terraform module?
easy
A. To share information from inside the module to the outside
B. To define variables that the module accepts
C. To create resources inside the module
D. To delete resources after deployment

Solution

  1. Step 1: Understand the role of output blocks

    Output blocks are used to expose values from a module so other parts of the Terraform configuration can use them.
  2. Step 2: Differentiate outputs from variables and resources

    Variables are inputs to modules, resources create infrastructure, outputs share info outwards.
  3. Final Answer:

    To share information from inside the module to the outside -> Option A
  4. Quick Check:

    Outputs = share info outside module [OK]
Hint: Outputs pass info out of modules, variables bring info in [OK]
Common Mistakes:
  • Confusing outputs with variables
  • Thinking outputs create resources
  • Assuming outputs delete resources
2. Which of the following is the correct syntax to define an output named instance_ip in a Terraform module?
easy
A. output "instance_ip" : aws_instance.example.public_ip
B. output instance_ip = aws_instance.example.public_ip
C. output "instance_ip" { value = aws_instance.example.public_ip }
D. output { instance_ip = aws_instance.example.public_ip }

Solution

  1. Step 1: Recall Terraform output block syntax

    Outputs use the keyword output followed by the name in quotes, then a block with value = ....
  2. Step 2: Match syntax to options

    output "instance_ip" { value = aws_instance.example.public_ip } matches the correct syntax: output "name" { value = ... }.
  3. Final Answer:

    output "instance_ip" { value = aws_instance.example.public_ip } -> Option C
  4. Quick Check:

    Output block = output "name" { value = ... } [OK]
Hint: Outputs need quotes and value assignment inside braces [OK]
Common Mistakes:
  • Missing quotes around output name
  • Using equals sign outside block
  • Incorrect colon or braces placement
3. Given this module output block:
output "bucket_name" {
  value = aws_s3_bucket.my_bucket.id
}

And this root module code:
module "storage" {
  source = "./modules/s3"
}

output "name" {
  value = module.storage.bucket_name
}

What will be the value of the root module's name output after applying?
medium
A. The name of the S3 bucket resource type
B. Null because the module output is not defined
C. An error because outputs cannot be nested
D. The ID of the S3 bucket created by the module

Solution

  1. Step 1: Understand module output propagation

    The module outputs the bucket's ID as bucket_name. The root module accesses it via module.storage.bucket_name.
  2. Step 2: Confirm root output value

    The root output name simply passes through the module's output value, so it will be the bucket ID.
  3. Final Answer:

    The ID of the S3 bucket created by the module -> Option D
  4. Quick Check:

    Root output = module output value [OK]
Hint: Root outputs can reference module outputs directly [OK]
Common Mistakes:
  • Thinking outputs cannot be nested or chained
  • Confusing bucket ID with resource type name
  • Assuming output is null if not explicitly set in root
4. You have this output block inside a module:
output "subnet_id" {
  value = aws_subnet.example
}

Why is this incorrect for outputting the subnet ID?
medium
A. The output value should reference a specific attribute, like aws_subnet.example.id
B. Output blocks cannot reference resources directly
C. The output name cannot be "subnet_id"
D. The module source path is missing

Solution

  1. Step 1: Check output value correctness

    To output the subnet ID, the value must reference a specific attribute like aws_subnet.example.id, not the whole resource object.
  2. Step 2: Identify correct attribute to output

    For subnet ID, use aws_subnet.example.id instead of the resource itself.
  3. Final Answer:

    The output value should reference a specific attribute, like aws_subnet.example.id -> Option A
  4. Quick Check:

    Output value = resource attribute, not resource object [OK]
Hint: Always output resource attributes, not whole resources [OK]
Common Mistakes:
  • Outputting entire resource instead of attribute
  • Wrong output block name
  • Ignoring module source configuration
5. You want to create a module that outputs a list of public IPs from multiple instances it creates. Which output block correctly returns this list?
hard
A. output "public_ips" { value = aws_instance.example[0].public_ip }
B. output "public_ips" { value = [for inst in aws_instance.example : inst.public_ip] }
C. output "public_ips" { value = aws_instance.example[*].id }
D. output "public_ips" { value = aws_instance.example }

Solution

  1. Step 1: Understand how to output multiple values

    When multiple instances exist, use a for-expression to collect their public IPs into a list.
  2. Step 2: Match correct syntax for list output

    output "public_ips" { value = [for inst in aws_instance.example : inst.public_ip] } uses a for-expression to extract public_ip from each instance correctly.
  3. Final Answer:

    output "public_ips" { value = [for inst in aws_instance.example : inst.public_ip] } -> Option B
  4. Quick Check:

    Use for-expression to output lists from multiple resources [OK]
Hint: Use for-expressions to gather attributes from multiple resources [OK]
Common Mistakes:
  • Outputting single attribute from multiple instances without list
  • Using wrong attribute like id instead of public_ip
  • Outputting entire resource object
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