5 Essential Terraform Tools To Use Everyday

Syntax errors are typically not straightforward to know when operating your code. Linters present essential info to hurry up debugging and save time in your improvement. You may also combine them into your CI/CD pipeline to implement steady enchancment.

  • Warn about depreciated syntax and unused declarations.
  • Implement greatest practices and naming conventions.

Set up on Mac

$ brew set up tflint

Set up on Linux

$ curl -s https://uncooked.githubusercontent.com/terraform-linters/tflint/grasp/install_linux.sh | bash

Set up on Home windows

$ choco set up tflint


TFLint inspects recordsdata beneath the present listing by default. You’ll be able to change the conduct with the next arguments:

$ tflint --help
tflint [OPTIONS] [FILE or DIR...]
Utility Choices:
-v, --version Print TFLint model
--init Set up plugins
--langserver Begin language server
-f, --format=[default|json|checkstyle|junit|compact] Output format
(default: default)
-c, --config=FILE Config file identify
(default: .tflint.hcl)
--ignore-module=SOURCE Ignore module sources
--enable-rule=RULE_NAME Allow guidelines from the
command line
--disable-rule=RULE_NAME Disable guidelines from
the command line
--only=RULE_NAME Allow solely this
rule, disabling all
different defaults. Can
be specified a number of
--enable-plugin=PLUGIN_NAME Allow plugins from
the command line
--var-file=FILE Terraform variable
file identify
--var='foo=bar' Set a Terraform
--module Examine modules
--force Return zero exit
standing even when points
--no-color Disable colorized
--loglevel=[trace|debug|info|warn|error] Change the loglevel
Assist Choices:
-h, --help Present this assist message
  • Residence listing (~/.tflint.hcl)
  • Declare plugins to make use of
  • Allow/Disable particular TFLint guidelines
plugin_dir = "~/.tflint.d/plugins"

module = true
drive = false
disabled_by_default = false

ignore_module =
"terraform-aws-modules/vpc/aws" = true
"terraform-aws-modules/security-group/aws" = true

varfile = ["example1.tfvars", "example2.tfvars"]
variables = ["foo=bar", "bar=["baz"]"]

plugin "aws"
enabled = true
model = "0.12.0"
supply = "github.com/terraform-linters/tflint-ruleset-aws"
rule "aws_instance_invalid_type"
enabled = false
$ tflint
$ TFLINT_LOG=debug tflint

Use plugins for cloud suppliers

If you end up utilizing AWS, Azure, or GCP suppliers, you need to use the corresponding plugin:

plugin "aws" 
enabled = true
model = "0.12.0"
supply = "github.com/terraform-linters/tflint-ruleset-aws"
$ tflint --init
useful resource "aws_instance" "foo" 
ami = "ami-0ff8a91507f77f867"
instance_type = "t1.2xlarge" # invalid sort!

Documenting your code is a crucial level for teamwork and reusability. Terraform-docs is a fast utility to generate docs from Terraform modules in numerous output codecs.

Set up on Mac

$ brew set up terraform-docs 

Set up on Home windows

$ choco set up terraform-docs

Set up on Linux

$ curl -Lo ./terraform-docs.tar.gz https://github.com/terraform-docs/terraform-docs/releases/obtain/v0.16.0/terraform-docs-v0.16.0-$(uname)-amd64.tar.gz
$ tar -xzf terraform-docs.tar.gz
$ chmod +x terraform-docs
$ mv terraform-docs /usr/native/terraform-docs


Creating Terraform modules implies utilizing inputs, outputs, assets, and ultimately knowledge sources. The next Terraform snippet creates an AWS EC2 occasion from an AMI (Amazon Machine Picture). Though the whole lot is in a single file, it may be thought of as a module:

required_version = ">= 1.0.0"
aws =
supply = "hashicorp/aws"

variable "aws_region"
description = "The AWS area the place to deploy the EC2 occasion."
sort = string
default = "us-east-1"
variable "tags"
description = "The tags to affiliate to the EC2 occasion."
sort = map(string)
default =
supplier "aws"
area = var.aws_region
knowledge "aws_ami" "ubuntu"
most_recent = true
identify = "identify"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
identify = "virtualization-type"
values = ["hvm"]
house owners = ["099720109477"]
useful resource "aws_instance" "default"
ami = knowledge.aws_ami.ubuntu.id
instance_type = "t2.micro"
tags = merge(
Identify = "my-ec2-instance"
, var.tags)
output "arn"
description = "EC2 occasion ARN."
worth = aws_instance.default.arn
$ terraform-docs markdown desk --output-file README.md .
<!-- BEGIN_TF_DOCS -->
## Necessities
| Identify | Model |
| <a reputation="requirement_terraform"></a> [terraform](#requirement_terraform) | >= 1.0.0 |
## Suppliers| Identify | Model |
| <a reputation="provider_aws"></a> [aws](#provider_aws) | 3.74.0 |
## ModulesNo modules.## Assets| Identify | Sort |
| [aws_instance.default](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance) | useful resource |
| [aws_ami.ubuntu](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami) | knowledge supply |
## Inputs| Identify | Description | Sort | Default | Required |
| <a reputation="input_aws_region"></a> [aws_region](#input_aws_region) | The AWS area the place to deploy the EC2 occasion. | `string` | `"us-east-1"` | no |
| <a reputation="input_tags"></a> (#input_tags) | The tags to affiliate to the EC2 occasion. | `map(string)` | `` | no |
## Outputs| Identify | Description |
| <a reputation="output_arn"></a> [arn](#output_arn) | EC2 occasion ARN. |
<!-- END_TF_DOCS -->

More Posts