Automatic Terraform documentation with terraform-docs
Terraform code reuse leads to modules. Modules lead to variables and outputs. Variables and outputs lead to massive amount of boilerplate documentation. terraform-docs lets you shortcut some of these steps and jump straight to consistent, easy to use, automatically generated documentation instead.
Terraform-docs
, a self-contained binary implemented in Go, and
released by Segment, provides an efficient way to add documentation to
your terraform code without requiring large changes to your workflow
or massive amounts of additional boilerplate. In its simplest invocation
it reads the descriptions
provided in your variables and outputs and
displays them on the command line:
/**
*
* A sample terraform file with a variable and output
*
*/
variable "greeting" {
type = "string"
description = "The string used as a greeting"
default = "hello"
}
output "introduction" {
description = "The full, polite, introduction"
value = "${var.greeting} from terraform"
}
Running terraform-docs
against this code produces:
A sample terraform file with a variable and output
var.greeting (hello)
The string used as a greeting
output.introduction
The full, polite, introduction
This basic usage makes it simpler to use existing code by presenting the
official interface without over-burdening you with implementation
details. Once you’ve added descriptions to your variables and outputs,
something you should really already be doing, you can start to expose the
documentation in other ways. By adding the markdown
option -
terraform-docs markdown .
you can generate the docs in a GitHub friendly way that provides an easy, web based, introduction to what your code accepts and returns. We used this quite heavily in the GOV.UK AWS repo and it’s been invaluable. The ability to browse an overview of the terraform code makes it simpler to determine if a specific module does what you actually need without requiring you to read all of the implementation.
When we first adopted terraform-docs
we hit issues with the code being updated
without the documentation changing to match it. We soon settled on using git
precommit hooks, such as this terraform-docs githook script
by Laura Martin or the heavy handed
GOV.UK update-docs script. Once we had these in place the little discrepancies stopped slipping through and the reference documentation became a lot more trusted.
As an aside if you plan on using terraform-docs
as part of your automated continuous
integration pipeline you’ll probably want to create a
terraform-docs package.
I personally use FPM Cookery for this and it’d been an easy win so far.
I’ve become a big fan of terraform-docs
and it’s great to see such
self-contained tools making such a positive impact on the terraform ecosystem.
If you’re writing tf
code for consumption by more than just yourself (and even
then) it’s well worth a second look.