Terraform Advanced — terragrunt.hcl Structure

less than 1 minute read

Anatomy of the terragrunt.hcl file — root config, child config, and the include block.


Root terragrunt.hcl

# environments/terragrunt.hcl (root)
remote_state {
  backend = "s3"
  generate = {
    path      = "backend.tf"
    if_exists = "overwrite_terragrunt"
  }
  config = {
    bucket         = "mycompany-terraform-state"
    key            = "${path_relative_to_include()}/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}

generate "provider" {
  path      = "provider.tf"
  if_exists = "overwrite_terragrunt"
  contents  = <<EOF
provider "aws" {
  region = "us-east-1"
  default_tags {
    tags = {
      ManagedBy = "terragrunt"
    }
  }
}
EOF
}

Child terragrunt.hcl

# environments/prod/vpc/terragrunt.hcl
include "root" {
  path = find_in_parent_folders()
}

terraform {
  source = "../../../modules/vpc"
}

locals {
  env = read_terragrunt_config(find_in_parent_folders("env.hcl"))
}

inputs = {
  environment = local.env.locals.environment
  cidr        = "10.2.0.0/16"
  name        = "prod-vpc"
}

env.hcl

# environments/prod/env.hcl
locals {
  environment = "prod"
  account_id  = "123456789012"
}

How It Works

terragrunt apply (in prod/vpc/)
  1. Reads prod/vpc/terragrunt.hcl
  2. Finds root terragrunt.hcl via include
  3. Generates backend.tf with key "prod/vpc/terraform.tfstate"
  4. Generates provider.tf
  5. Runs terraform init + apply with inputs as -var flags

What’s Next?

Automatic remote state configuration.

← What Is Terragrunt Remote State Config →

Updated: