DEV Community

S3CloudHub
S3CloudHub

Posted on

Terraform Best Practices

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

Top comments (1)

Collapse
 
goncalorodrigues profile image
Gonçalo Rodrigues

Thanks for sharing!

At what point do you think it's worth refactoring your code into a module?