Module outputs in Terraform - Time & Space Complexity
When using Terraform modules, outputs let us share information from one module to another.
We want to understand how the time to get these outputs changes as we add more outputs.
Analyze the time complexity of retrieving outputs from a module.
module "example" {
source = "./modules/example"
count = var.instance_count
}
output "instance_ids" {
value = [for m in module.example : m.instance_id]
}
This code calls a module multiple times and collects all instance IDs as output.
Identify the API calls, resource provisioning, data transfers that repeat.
- Primary operation: Retrieving each module instance's output value.
- How many times: Once per module instance (equal to
var.instance_count).
As the number of module instances grows, the number of output retrievals grows the same way.
| Input Size (n) | Approx. API Calls/Operations |
|---|---|
| 10 | 10 output retrievals |
| 100 | 100 output retrievals |
| 1000 | 1000 output retrievals |
Pattern observation: The work grows directly with the number of module instances.
Time Complexity: O(n)
This means the time to get all outputs grows in a straight line as you add more module instances.
[X] Wrong: "Getting outputs from multiple modules happens all at once, so time stays the same no matter how many modules there are."
[OK] Correct: Each module output must be retrieved separately, so more modules mean more work and more time.
Understanding how output retrieval scales helps you design efficient Terraform modules and predict deployment times.
"What if we combined all outputs into a single map inside the module instead of separate outputs? How would the time complexity change?"
Practice
output blocks in a Terraform module?Solution
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.Step 2: Differentiate outputs from variables and resources
Variables are inputs to modules, resources create infrastructure, outputs share info outwards.Final Answer:
To share information from inside the module to the outside -> Option AQuick Check:
Outputs = share info outside module [OK]
- Confusing outputs with variables
- Thinking outputs create resources
- Assuming outputs delete resources
instance_ip in a Terraform module?Solution
Step 1: Recall Terraform output block syntax
Outputs use the keywordoutputfollowed by the name in quotes, then a block withvalue = ....Step 2: Match syntax to options
output "instance_ip" { value = aws_instance.example.public_ip } matches the correct syntax: output "name" { value = ... }.Final Answer:
output "instance_ip" { value = aws_instance.example.public_ip } -> Option CQuick Check:
Output block = output "name" { value = ... } [OK]
- Missing quotes around output name
- Using equals sign outside block
- Incorrect colon or braces placement
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?Solution
Step 1: Understand module output propagation
The module outputs the bucket's ID asbucket_name. The root module accesses it viamodule.storage.bucket_name.Step 2: Confirm root output value
The root outputnamesimply passes through the module's output value, so it will be the bucket ID.Final Answer:
The ID of the S3 bucket created by the module -> Option DQuick Check:
Root output = module output value [OK]
- Thinking outputs cannot be nested or chained
- Confusing bucket ID with resource type name
- Assuming output is null if not explicitly set in root
output "subnet_id" {
value = aws_subnet.example
}Why is this incorrect for outputting the subnet ID?
Solution
Step 1: Check output value correctness
To output the subnet ID, the value must reference a specific attribute likeaws_subnet.example.id, not the whole resource object.Step 2: Identify correct attribute to output
For subnet ID, useaws_subnet.example.idinstead of the resource itself.Final Answer:
The output value should reference a specific attribute, like aws_subnet.example.id -> Option AQuick Check:
Output value = resource attribute, not resource object [OK]
- Outputting entire resource instead of attribute
- Wrong output block name
- Ignoring module source configuration
Solution
Step 1: Understand how to output multiple values
When multiple instances exist, use a for-expression to collect their public IPs into a list.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 extractpublic_ipfrom each instance correctly.Final Answer:
output "public_ips" { value = [for inst in aws_instance.example : inst.public_ip] } -> Option BQuick Check:
Use for-expression to output lists from multiple resources [OK]
- Outputting single attribute from multiple instances without list
- Using wrong attribute like id instead of public_ip
- Outputting entire resource object
Ready to prove it?
Pass the test and this pattern moves unknown
