• Any folder is considered to be a module. When you run terraform within that directory its considered to be the root module
  • Terraform commands will only directly use the configuration files in the current directory
  • When terrraform encounters a module block, it can load and process files from a different directory
  • Modules can be located locally, or accessed in a VCS, HTTPs URLs, Terraform Cloud, Terraform Enterprise private module registries
  • When a module is called from a root module it is referred to as the child module

Using modules

module "name" block

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "2.21.0"

  name = var.vpc_name
  cidr = var.vpc_cidr

  azs             = var.vpc_azs
  private_subnets = var.vpc_private_subnets
  public_subnets  = var.vpc_public_subnets

  enable_nat_gateway = var.vpc_enable_nat_gateway

  tags = var.vpc_tags
  • The "name" of the module is a local name that the calling module can use to refer to the instance of the module
  • The module block allows for specifying a list of meta-arguments as defined below
  • Any other variables defined within the {} are input variables


  • source argument is mandatory. If provided like the example, will search inregistry. Can also be a local file path or a URL
  • version is recommended. Works with modules in the terraform registry
  • depends_on
  • count - Refer to meta-arguments section
  • for_each - Reger to meta-arguments section