mistwire / terraform-module-template

Template repo for Terraform modules

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Template repo for Terraform modules

This repository contains my template for creating Terraform modules, yes even my root modules. This template is based on the best practices I have learned and the HashiCorp style guide.

Tools that I use

I use a wide array of tools to make things easier for me.

  • 1Password: Password and Secret storage
    • brew install 1password
  • 1Password - CLI: Allows for access to 1Password via environment variables and shell scripts.
    • brew install 1password-cli
  • Direnv: Manages dynamic environment variables based on the directory.
    • brew install direnv
  • Task: Replacement for GNU make. Uses YAML files.
    • brew install go-task
  • Terraform: Kind of the whole point here 😄
    • brew install hashicorp/tap/terraform
  • git: Another obvious one 😃
    • brew install git
  • pre-commit: Provides a method for running scripts and other tools during the git commit process.
    • brew install pre-commit
  • trufflehog: Scans your git repo for committed secrets 😱.
    • brew install trufflesecurity/trufflehog/trufflehog
  • autotag: Automatically creates git tags based on the commit message. Used to create semantic version tags in GitHub Actions pipeline. (Not installed locally, but you could)
    • brew install pantheon-systems/autotag/autotag

Tools needed for the Pre-commit hooks that I use

All of these tools can be used standalone, but I use them as part of the git commit process.

  • terraform-docs: Dynamically updates your README.md with information on the inputs, outputs, and requirements of your module.
    • brew install terraform-docs
  • infracost: Gives you a cost estimate for the cloud resources your module would deploy.
    • brew install infracost
  • jq: A lightweight and flexible command-line JSON processor. required for terraform_validate with --retry-once-with-cleanup flag, and for infracost_breakdown hook.
    • brew install jq
  • TFLint: A Terraform linter that checks for best practices and errors in your Terraform code.
    • brew install tflint
  • One or more of these terraform security scanning tools

Miscellaneous tools

  • tfvars: This tool helps you manage Terraform variables. It allows you to store Terraform variables in a central location, and it also provides a way to encrypt Terraform variables.
  • inframap: Inframap is a tool that can be used to visualize your Terraform infrastructure. It reads your tfstate or HCL to generate a graph specific for each provider, showing only the resources that are most important/relevant.
  • driftctl: driftctl detects infrastructure drift by comparing actual resources with Terraform configuration, identifying changes or drift in attributes.
  • Terraspace: Terraspace is a framework that simplifies the development and deployment of Terraform infrastructure, offering automated module generation and integrated testing.
  • Terraform Compliance: Terraform Compliance is a security and compliance scanner for Terraform code, allowing you to define and verify policies as code.

Terraform Maintenance tools

Here are a couple of tools I use to help with managing Terraform versions.

  • TFSwitch: Used to switch the version of terraform installed based on the directory you are in or the version constraint in your terraform code.
    • brew install warrensbox/tap/tfswitch
  • tfupdate: Used to update the version constraints in your terraform code for core, providers and modules.
    • brew install tfupdate

Code Editor

I use Visual Studio Code as my code editor. I have included my settings and extensions in the .vscode directory, so they should be automatically installed when you open the project. They are also listed below.

Extensions

I use the following extensions for VS Code.

Settings

I use the following settings for VS Code.

{
  "[sentinel]": {
    "editor.defaultFormatter": "hashicorp.terraform"
  },
  "[terraform]": {
    "editor.defaultFormatter": "hashicorp.terraform"
  },
  "[tfvars]": {
    "editor.defaultFormatter": "hashicorp.terraform"
  },
  "editor.bracketPairColorization.enabled": true,
  "editor.formatOnSave": true,
  "editor.rulers": [
    {
      "color": "#A5FF90",
      "column": 80
    },
    {
      "color": "#FF628C",
      "column": 100
    }
  ],
  "editor.tabCompletion": "on",
  "editor.tabSize": 2,
  "files.associations": {
    "*.hcl": "terraform",
    "*.nomad": "terraform",
    "*.policy": "sentinel"
  },
  "terraform.indexing": {
    "delay": 500,
    "enabled": false,
    "exclude": [".terraform/**/*", "**/.terraform/**/*"],
    "liveIndexing": false
  },
  "terraform.languageServer.enable": true
}

Example config files

I've included example config files for some of the tools.

direnv: Rename .envrc.example to .envrc and update.

pre-commit: Review .pre-commit-config.yaml to enable/disable hooks.

terraform-docs: Review .terraform-docs.yml to adjust document formatting options.

TFLint: Review .tflint.hcl

Task: Review Taskfile.yaml and or remove tasks.

Terraform: Rename terraform.tfvars.example to terraform.tfvars and update.

Terraform Docs Dynamic section

Everything above this should be removed and replaced with your module description.

The following two lines specify where the terraform-docs dynamic content will be placed.

Requirements

Name Version
terraform ~> 1.0
google ~>4.55
hcp ~>0.54

Providers

No providers.

Modules

No modules.

Resources

No resources.

Inputs

No inputs.

Outputs

No outputs.

About

Template repo for Terraform modules

License:GNU General Public License v3.0


Languages

Language:HCL 100.0%