Skip to main content

DRY Configuration with Locals

Atmos Design Pattern

Locals are file-scoped variables that reduce repetition within a single stack file. Use them to define values once and reference them throughout the file.

Problem

You have repeated values in a stack file that you want to define once and reuse:

components:
terraform:
vpc:
vars:
name: acme-prod-vpc
tags:
Project: acme-prod
cluster:
vars:
name: acme-prod-cluster
tags:
Project: acme-prod

Solution

Use locals to define the value once:

locals:
project: acme-prod

components:
terraform:
vpc:
vars:
name: "{{ .locals.project }}-vpc"
tags:
Project: "{{ .locals.project }}"
cluster:
vars:
name: "{{ .locals.project }}-cluster"
tags:
Project: "{{ .locals.project }}"

Building on Locals

Locals can reference other locals:

locals:
namespace: acme
environment: prod
prefix: "{{ .locals.namespace }}-{{ .locals.environment }}"

components:
terraform:
vpc:
vars:
name: "{{ .locals.prefix }}-vpc"

Accessing Settings and Vars

Locals can also access settings and vars from the same file:

settings:
version: v1

vars:
stage: prod

locals:
label: "{{ .vars.stage }}-{{ .settings.version }}"

Key Points

  • File-scoped: Locals only exist within the file where they're defined.
  • Not inherited: Locals from imported files are not accessible.
  • Use for DRY: Extract repeated values to reduce duplication.

For cross-file values, use vars or settings instead.

References