📖 Scenario: You are managing infrastructure with Terraform. You want to organize your code by creating a reusable child module that provisions an AWS S3 bucket. This helps keep your main configuration clean and modular.
🎯 Goal: Build a Terraform child module that creates an AWS S3 bucket with a specified name, then use this child module in the root configuration to create a bucket named my-terraform-bucket.
📋 What You'll Learn
Create a child module directory with a Terraform configuration to create an AWS S3 bucket.
Define an input variable bucket_name in the child module.
Use the child module in the root Terraform configuration with the module block.
Pass the bucket name my-terraform-bucket to the child module.
💡 Why This Matters
🌍 Real World
Organizing Terraform code into child modules helps teams reuse and maintain infrastructure code efficiently.
💼 Career
Understanding Terraform modules is essential for cloud engineers and DevOps professionals managing infrastructure as code.
Progress0 / 4 steps
1
Create the child module main configuration
In the modules/s3_bucket directory, create a file called main.tf. Write a resource block to create an AWS S3 bucket using the resource type aws_s3_bucket with the name example_bucket. Use the bucket name var.bucket_name for the bucket's bucket attribute.
Terraform
Hint
Use resource "aws_s3_bucket" "example_bucket" {} and set bucket = var.bucket_name.
2
Add an input variable for the bucket name
In the modules/s3_bucket directory, create a file called variables.tf. Define an input variable named bucket_name of type string with no default value.
Terraform
Hint
Use variable "bucket_name" { type = string } to declare the input.
3
Use the child module in the root configuration
In the root directory, create a file called main.tf. Add a module block named s3_bucket that uses the source ./modules/s3_bucket. Pass the value "my-terraform-bucket" to the module's bucket_name input variable.
But Terraform shows an error: An argument named "db_name" is not expected here. Did you mean to define a variable named "db_name"? What is the likely cause?
medium
A. Terraform does not support passing variables to modules
B. The source path is incorrect
C. The child module does not declare a variable named db_name
D. The root module must use resource block instead of module
Solution
Step 1: Analyze error message
The error indicates that the argument "db_name" is not expected, which happens when the child module does not declare a variable named "db_name".
Step 2: Check child module variables
If child module does not declare variable "db_name", Terraform cannot accept the passed value.
Final Answer:
The child module does not declare a variable named db_name -> Option C
Hint: Declare variables in child module to accept passed values [OK]
Common Mistakes:
Ignoring variable declaration in child module
Assuming source path error without checking variables
Thinking modules can't receive variables
5. You want to create a child module that provisions an AWS S3 bucket with a customizable name and versioning enabled by default. Which of the following variables.tf and main.tf snippets inside the child module is the best practice?
hard
A. variables.tf:
variable "bucket_name" { type = string }
variable "versioning" { type = bool, default = true }