Terraform Module Best Practices
Terraform General Practices
Create Module with the required default configuration
The module can be separated into two categories
Base Module: Module that doesn’t have any dependencies to other terraform module
Implemented Module: Module that is built from base modules and deploys any implementation example database require DB instance with all configuration like backup, replica, alerts, scaling
Use the standard release practices for module updates, git tag is very important here
Always supply the value in a separate variable file
Coding structure configuration
Making coding structure configuration is important, here we split into different files
Create resource file (main.tf)
Create parameter file (variable.tf)
Create Output define resource name, id, etc resource to set output.
Create version file for setting up terraform and provider version
Naming Convention
Define variable is important to set valid naming convention for variable
Create variable name same as an attribute name (example name=var.name)
Latest version
Each Module should be compatible with the latest terraform release version
Coding Practice
Core Resource file
Filename : main.tf
Create defined resources
Use local variable if required
Use depends on dependent resources
Use count for creating multiple same resources
Use resource create a flag to get permission from the user to create a resource
Use for_each for creating multiple sub-parameters example EBS in EC2
Create dependent resource like IAM Role, Policies, security group
Make a capability where user can add predefined resources when he doesn’t want to create with module
Use tag and description for each supported resource and use label module for reference
Resource parameters
File name : variable.tf
Define all parameters
Use related data types like number, string, list, map, object
Use default value for the required variable
Define variable name same as an attribute name
Return from Module (Resource output)
Filename : output.tf
Try to set all output that should require in other module dependencies
Define valid output variable description
Naming for output variable should be relative with attribute name for example bucket_id
Version Dependencies
Define terraform version dependencies
Define provider version dependencies