What is Terraform Module (Part-6)

What are Terraform Modules?

Terraform modules are a way to organize and reuse Terraform configurations. They allow you to group multiple resources together and can be used to encapsulate complex infrastructure patterns. Modules can be shared and reused across different projects and teams.

Benefits of Using Modules

  1. Reusability: Write the configuration once and reuse it across different projects.
  2. Organization: Keep your configurations clean and organized.
  3. Abstraction: Simplify complex configurations by encapsulating details inside modules.

Directory Structure

The image shows a sample directory structure for Terraform modules:

Dir (Root Module)
├── main.tf
├── ec2
│   └── main.tf
├── s3
│   └── main.tf
└── vpc (community)
    └── main.tf

  • Root Module: The root module is the directory that contains your main configuration files (e.g., main.tf). This is where you call other modules.
  • Submodules: Subdirectories within the root module directory, such as ec2, s3, and vpc, each containing their own main.tf file.

Example of Using Modules

Let’s create a simple example where we have a root module that uses submodules for creating EC2 instances and S3 buckets.

Root Module (main.tf)

The root module will call the ec2 and s3 modules.

# main.tf in the root module
module "ec2_instance" {
  source = "./ec2"
}

module "s3_bucket" {
  source = "./s3"
}

EC2 Module (ec2/main.tf)

The ec2 module will create EC2 instances.

resource "aws_instance" "web" {
  ami           = "ami-04b70fa74e45c3917"
  instance_type = "t3.micro"

  tags = {
    Name = "HelloWorld"
  }
}

S3 Module (s3/main.tf)

The s3 module will create an S3 bucket.

resource "aws_s3_bucket" "example" {
  bucket = "my-af-test-bucket09887df"

  tags = {
    Name        = "My bucket"
    Environment = "Dev"
  }
}

Using the Modules

Initialize Terraform:

terraform init

Plan the Infrastructure:

terraform plan

Apply the Configuration:

terraform apply

Summary

  • Modules in Terraform: Modules allow you to group and reuse configurations.
  • Root Module: The main configuration that calls submodules.
  • Submodules: Encapsulated configurations within subdirectories.
  • Example: The root module (main.tf) calls the ec2 and s3 modules to create EC2 instances and S3 buckets, respectively.

Example 2 : update your directory structure to include variable files:

root-module/
├── main.tf
├── variables.tf
├── terraform.tfvars
└── instances/
    ├── main.tf
    ├── variables.tf
    └── terraform.tfvars
Root Module1. main.tf
# root-module/main.tf
provider "aws" {
  region = "us-west-2"
}

module "instances" {
  source = "./instances"

  instance_count       = var.instance_count
  instance_name        = var.instance_name
  security_groups      = var.security_groups
  instance_tags        = var.instance_tags
  create_vm            = var.create_vm
}

2. variables.tf

# root-module/variables.tf
variable "instance_count" {
  description = "Number of instances to launch"
  type        = number
  default     = 1
}

variable "instance_name" {
  description = "The name of the instance"
  type        = string
  default     = "Rajesh"
}

variable "security_groups" {
  description = "List of security group IDs"
  type        = list(string)
  default     = ["sg-0541801a7a059ba17"]
}

variable "instance_tags" {
  description = "Map of tags for the instance"
  type        = map(string)
  default     = {
    Name = "my-instance4mMap-Rajesh"
  }
}

variable "create_vm" {
  description = "If set to true, it will create VM"
  type        = bool
  default     = true
}

3. terraform.tfvars

# root-module/terraform.tfvars
instance_count  = 1
instance_name   = "Rajesh"
security_groups = ["sg-0541801a7a059ba17"]
instance_tags = {
  Name = "my-instance4mMap-Rajesh"
}
create_vm = true

Instances Module

1. instances/main.tf

# instances/main.tf
resource "aws_instance" "example-number" {
  count = var.instance_count
  ami = "ami-04b70fa74e45c3917"
  instance_type = "t2.micro"
  
  tags = {
    Name = var.instance_name
  }
}

resource "aws_instance" "example-list" {
  ami = "ami-04b70fa74e45c3917"
  instance_type = "t2.micro"
  vpc_security_group_ids = var.security_groups
}

resource "aws_instance" "example-map" {
  ami = "ami-04b70fa74e45c3917"
  instance_type = "t2.micro"
  tags = var.instance_tags
}

resource "aws_instance" "example-bool" {
  count = var.create_vm ? 1 : 0
  ami = "ami-04b70fa74e45c3917"
  instance_type = "t2.micro"
  tags = var.instance_tags
}

2. instances/variables.tf

# instances/variables.tf
variable "instance_count" {
  description = "Number of instances to create"
  type        = number
}

variable "instance_name" {
  description = "Name of the instance"
  type        = string
}

variable "security_groups" {
  description = "List of security group IDs"
  type        = list(string)
}

variable "instance_tags" {
  description = "Map of tags for the instance"
  type        = map(string)
}

variable "create_vm" {
  description = "If set to true, it will create VM"
  type        = bool
}

3. instances/terraform.tfvars

You usually won’t need a terraform.tfvars file in submodules, as the variables should be passed from the root module. However, you can have a default values file if needed.

Using the Module

To use the module, navigate to the root-module directory and run the following commands:

terraform init

terraform plan

terraform apply

Related Posts

Terraform Cheat Sheet: The Ultimate Reference for Infrastructure as Code (2025)

🧾 Terraform Cheat Sheet: The Ultimate Reference for Infrastructure as Code (2025) Learn and master Terraform with this complete cheat sheet — from basics to advanced automation….

Read More

Terraform Explained Through a Simple Story – From Manual Chaos to Automated Peace

🌍 Terraform Explained Through a Simple Story – From Manual Chaos to Automated Peace 🚪 Welcome to DevTown – The City of Applications Imagine a bustling city…

Read More

Terraform from Essentials to Advanced: The Complete Guide (2025)

🌍 Terraform from Essentials to Advanced: The Complete Guide (2025) Build, manage, and scale infrastructure like code – cloud-native, multi-cloud, and secure. 🚀 What is Terraform? Terraform…

Read More

Terraform interview questions that are commonly asked in interviews

Basic Questions Intermediate Questions Advanced Questions Scenario-Based Questions Advanced and Scenario-Based Questions Mohammad Gufran Jahangir

Read More

Ultimate guide for terraform from basic to advance

What is the need of terraform IAAC? The need for Terraform Infrastructure as Code (IaAC) is driven by several key benefits: Summary: List of IaaC tools Here…

Read More

Terraform Pipeline (Part-18)

Terraform Pipeline A Terraform pipeline automates the process of planning, applying, and managing infrastructure as code (IaC) with Terraform. By integrating Terraform with a CI/CD pipeline, you…

Read More
guest
0 Comments
Oldest
Newest Most Voted
0
Would love your thoughts, please comment.x
()
x