Terraform Advanced — terragrunt.hcl Structure
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.