DEV Community

Cover image for How to use Modules in Terraform
Dennis Groß (he/him)
Dennis Groß (he/him)

Posted on • Edited on

How to use Modules in Terraform

A module makes a set of resources reusable by wrapping it into a package that we can use in the context of different Terraform projects.

In essence, a module is a folder with one or multiple *.tf files that describe resources. There must be at least one *.tf file in the module, the so-called root module.

Module Distribution

There are multiple ways to re-use Terraform from another system

  • You have the module code checked out nearby, and reference the module directly
  • The module is available in the Terraform Registry
  • The module is available in a private registry
    • Github
    • Bitbucket
    • HTTP URLs
    • S3 Bucket
    • GCS buckets

Referencing Modules from the File System

Here is an example of how we reference the vpc module in a Terraform project relative to the current directory.

module "vpc" {
  source = "../vpc"
}
Enter fullscreen mode Exit fullscreen mode

Using Registry Modules

Using a module from a Terraform registry is quite the same than referencing a module on the local file system.

module "vpc" {
    source = "terraform-aws-module"
    version = "3.14.0"
  # variable values can be passed here
}
Enter fullscreen mode Exit fullscreen mode

This example refers to a module called terraform-aws-module . the biggest difference between local and registry modules is that registry modules are versioned, so you need to provide a version string.

Hosting Modules in Github

You can reference a module from a GitHub repository by URL. This is convenient since most Terraform modules need to be stored in a version control system anyways.

You can checkout GitHub modules in two ways

  • Through HTTPS
  • Through SSH
module "vpc" {
    source = "github.com/gdenn/my-vpc"
    # variables values go here
}
Enter fullscreen mode Exit fullscreen mode

Example SSH

module "vpc" {
    source = "git@github.com:gdenn/my-vpc.git"
    # variables values go here
}
Enter fullscreen mode Exit fullscreen mode

You can reference your GitHub credentials in multiple ways

  • ~/.ssh/config set a Host entry and point to your IdentiyFile (SSH key)
Host USERNAME.github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa
Enter fullscreen mode Exit fullscreen mode
  • Pass the credentials to the source parameter
module "vpc" {
  source = "git::https://${git_username}:${git_password}@github.com/folder/terraform-azure-core-resource-group.git"
  ...
}
Enter fullscreen mode Exit fullscreen mode

Passing Variables

Every module can have a variables file that stores configurable config parameters that the resource scripts might use.

Values for the variables can be passed in the module block.

module "vpc" {
  source = "../vpc"
  profile = var.profile
    region = "eu-central-1"
    ...
}
Enter fullscreen mode Exit fullscreen mode

You can still pass variables through the environment or use the default values.

Provider Configuration

A module can inherit the provider config from the caller module (parent module). Although it is advisable to define a provider with a range of compliant versions.

terraform {
  required_version = ">= 0.13.1"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 4.0"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Terraform will try to use a pre-installed provider version (e.g. used by another module or the parent) if it fits the version constrained by this child module.

In many cases, this might prevent the installation of an unnecessary additional provider and ensures that the module uses a provider this is compatible.

Top comments (0)