Bird
Raised Fist0
Terraformcloud~5 mins

Module outputs in Terraform - Commands & Configuration

Choose your learning style10 modes available
Introduction
When you use Terraform modules, you often want to get information from them after they run. Module outputs let you share useful values from a module to the place where you use it. This helps you connect parts of your infrastructure easily.
When you want to get the IP address of a server created inside a module to use it elsewhere.
When you need to pass the ID of a created database from a module to another resource.
When you want to see the URL of a load balancer created inside a module after deployment.
When you want to share a security group ID created in a module with other modules or resources.
When you want to output the name of a storage bucket created inside a module for reference.
Config File - main.tf
main.tf
terraform {
  required_version = ">= 1.0"
}

module "my_app" {
  source = "./modules/app_server"
  server_name = "example-server"
}

output "server_ip" {
  value       = module.my_app.server_ip
  description = "The IP address of the app server"
}

This file uses a module called my_app from a local folder ./modules/app_server. It passes a server name to the module.

The output block named server_ip shows how to get the IP address value from the module and make it visible after Terraform runs.

Commands
This command sets up Terraform in the current folder. It downloads the module code and prepares everything needed to run Terraform.
Terminal
terraform init
Expected OutputExpected
Initializing the backend... Initializing provider plugins... Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure.
This command creates or updates the infrastructure as defined in the Terraform files. The -auto-approve flag skips the confirmation step to speed up the process.
Terminal
terraform apply -auto-approve
Expected OutputExpected
module.my_app.aws_instance.app_server: Creating... module.my_app.aws_instance.app_server: Creation complete after 10s [id=i-0abcd1234efgh5678] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: server_ip = "54.123.45.67"
→
-auto-approve - Skip manual approval to apply changes immediately
This command shows the value of the output named server_ip. It helps you quickly see the IP address without reading the whole Terraform state.
Terminal
terraform output server_ip
Expected OutputExpected
54.123.45.67
Key Concept

If you remember nothing else from this pattern, remember: module outputs let you share important values from inside a module to the outside world for easy use.

Common Mistakes
Trying to access a module output without defining it inside the module.
Terraform will not know what value to show and will give an error or empty output.
Always define an output block inside the module to expose the value you want to share.
Using the wrong syntax to access module outputs, like missing the 'module.' prefix.
Terraform requires the 'module.' prefix to access outputs from modules, otherwise it treats it as a local variable and fails.
Use 'module.module_name.output_name' to correctly reference outputs from modules.
Summary
Use 'output' blocks inside modules to expose values you want to share.
Access module outputs with 'module.module_name.output_name' in your root Terraform files.
Run 'terraform output output_name' to see the value after applying changes.

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