DEV Community

Bartłomiej Danek
Bartłomiej Danek

Posted on • Originally published at bard.sh

Terragrunt remote_state and generate blocks

remote_state

Defines the backend once in root.hcl - Terragrunt auto-generates the backend config for every unit that includes it.

# root.hcl
remote_state {
  backend = "s3"
  config = {
    bucket         = "my-tf-state"
    key            = "${path_relative_to_include()}/terraform.tfstate"
    region         = "eu-west-1"
    encrypt        = true
    dynamodb_table = "terraform-locks"
  }
  generate = {
    path      = "backend.tf"
    if_exists = "overwrite_terragrunt"
  }
}
Enter fullscreen mode Exit fullscreen mode

path_relative_to_include() resolves to the path of the calling terragrunt.hcl relative to root.hcl - e.g. environments/prod/vpc - giving each unit a unique state key automatically.

generate block

Writes any file before running Terraform - typically used for provider.tf and backend.tf so they don't need to be duplicated in every module.

generate "provider" {
  path      = "provider.tf"
  if_exists = "overwrite_terragrunt"
  contents  = <<EOF
provider "aws" {
  region = "eu-west-1"

  default_tags {
    tags = {
      ManagedBy   = "terraform"
      Environment = "prod"
    }
  }
}
EOF
}
Enter fullscreen mode Exit fullscreen mode

if_exists options

  • overwrite_terragrunt - overwrite only if Terragrunt generated the file (safe default)
  • overwrite - always overwrite
  • skip - skip if file exists
  • error - error if file exists

generating multiple files

generate "versions" {
  path      = "versions.tf"
  if_exists = "overwrite_terragrunt"
  contents  = <<EOF
terraform {
  required_version = ">= 1.5"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}
EOF
}
Enter fullscreen mode Exit fullscreen mode

Originally published at https://bard.sh/posts/terragrunt_remote_state/

Top comments (0)