Terraform supports reusable resource definition code as modules

Fogg encourages using modules to reduce code duplication. The top-level fogg.yml parameter, modules will generate a module directory with some boilerplate code to kickstart module management.

This fogg.yml snippet:

<snip>
modules:
  webserver: {}
  database: {}

Will produce the following directory structure:

└── terraform
    <snip>
    └── modules
        ├── database
        │   ├── Makefile
        │   ├── README.md
        │   ├── fogg.tf
        │   ├── main.tf
        │   ├── outputs.tf
        │   └── variables.tf
        └── webserver
            ├── Makefile
            ├── README.md
            ├── fogg.tf
            ├── main.tf
            ├── outputs.tf
            └── variables.tf

To reference these modules in a fogg-managed workspace, invoke the module with a module resource and a source parameter that refers to the appropriate module directory:

module webserver {
  source   = "../../../modules/webserver"
}

Fogg can also keep these module invocations up to date if a module_source is specified as part of a workspace configuration in fogg.yml:

<snip>
envs:
  development:
    components:
      vpc:
        module_source: "github.com/scholzj/terraform-aws-vpc"

Fogg will write a complete invocation of that module to the workspace’s main.tf file:

# Auto-generated by fogg. Do not edit
# Make improvements in fogg, so that everyone can benefit.

module terraform-aws-vpc {
  source          = "github.com/scholzj/terraform-aws-vpc"
  aws_region      = local.aws_region
  aws_zones       = local.aws_zones
  private_subnets = local.private_subnets
  tags            = local.tags
  vpc_cidr        = local.vpc_cidr
  vpc_name        = local.vpc_name
}

Tip

Terraform can also invoke remote module sources

# Module in a public GitHub repo
module public_module_call {
   source = github.com/publicproject/publicrepo//path/to/module?ref=v0.31.1}
}

# Module in a private GitHub repo
module private_module_call {
   source = git@github.com:privateproject/privaterepo//path/to/module?ref=v0.31.1}
}