stack-organization.md9.6 KB
View on GitHubStack Organization Patterns -- Detailed Reference
This reference provides complete directory layouts and configuration examples for each stack organization pattern.
Basic Stack Organization
When to Use
- Single AWS account per environment (dev, staging, prod)
- Deploying to one region
- Simplest possible setup to start
Directory Layout
project/atmos.yamlstacks/catalog/vpc/defaults.yamlvpc-flow-logs-bucket/defaults.yamldeploy/dev.yamlstaging.yamlprod.yamlcomponents/terraform/vpc/vpc-flow-logs-bucket/
atmos.yaml Configuration
components:terraform:base_path: "components/terraform"stacks:base_path: "stacks"included_paths:- "deploy/**/*"name_template: "{{.vars.stage}}"
Catalog Defaults
# stacks/catalog/vpc/defaults.yamlcomponents:terraform:vpc:vars:enabled: truenat_gateway_enabled: truemax_subnet_count: 3
Environment Stack Files
# stacks/deploy/dev.yamlimport:- catalog/vpc/defaultsvars:stage: devcomponents:terraform:vpc:vars:nat_gateway_enabled: falsemax_subnet_count: 2
# stacks/deploy/prod.yamlimport:- catalog/vpc/defaultsvars:stage: prodcomponents:terraform:vpc:vars:map_public_ip_on_launch: false
Deploy Commands
atmos terraform apply vpc -s devatmos terraform apply vpc -s stagingatmos terraform apply vpc -s prod
Multi-Region Configuration
When to Use
- Deploying to multiple AWS regions for DR, latency, or compliance
- Region-specific resources with shared common configuration
Directory Layout
project/atmos.yamlstacks/catalog/vpc-flow-logs-bucket/defaults.yamlvpc/defaults.yamldeploy/dev/us-east-2.yamlus-west-2.yamlstaging/us-east-2.yamlus-west-2.yamlprod/us-east-2.yamlus-west-2.yamlcomponents/terraform/vpc/vpc-flow-logs-bucket/
atmos.yaml Configuration
components:terraform:base_path: "components/terraform"stacks:base_path: "stacks"included_paths:- "deploy/**/*"name_template: "{{.vars.environment}}-{{.vars.stage}}"
Region Stack Files
# stacks/deploy/dev/us-east-2.yamlimport:- catalog/vpc-flow-logs-bucket/defaults- catalog/vpc/defaultsvars:region: us-east-2environment: ue2stage: devcomponents:terraform:vpc:vars:ipv4_primary_cidr_block: "10.10.0.0/16"availability_zones:- us-east-2a- us-east-2b- us-east-2c
Reducing Duplication with Region Mixins
Extract region-specific settings into reusable mixins:
# stacks/mixins/region/us-east-2.yamlvars:region: us-east-2environment: ue2components:terraform:vpc:vars:availability_zones:- us-east-2a- us-east-2b- us-east-2c
Then simplify the stack file:
# stacks/deploy/dev/us-east-2.yamlimport:- catalog/vpc-flow-logs-bucket/defaults- catalog/vpc/defaults- mixins/region/us-east-2vars:stage: devcomponents:terraform:vpc:vars:ipv4_primary_cidr_block: "10.10.0.0/16"
Adding a New Region
Create a new stack file importing shared defaults and region-specific settings:
# stacks/deploy/dev/eu-west-1.yamlimport:- catalog/vpc-flow-logs-bucket/defaults- catalog/vpc/defaultsvars:region: eu-west-1environment: ew1stage: devcomponents:terraform:vpc:vars:ipv4_primary_cidr_block: "10.30.0.0/16"availability_zones:- eu-west-1a- eu-west-1b- eu-west-1c
Environment Abbreviations
The environment variable is typically set to an abbreviation of the region:
ue2forus-east-2uw2forus-west-2ew1foreu-west-1
This makes stack names shorter: ue2-dev instead of us-east-2-dev.
Organizational Hierarchy Configuration
When to Use
- Multiple organizations, OUs/departments/tenants
- Each OU has multiple accounts (dev, staging, prod)
- Configuration at different levels (org, tenant, account)
Context Variables
| Variable | Purpose | Example |
|---|---|---|
namespace | Organization | acme |
tenant | OU/department/team | core, plat |
stage | Account/deployment stage | dev, staging, prod |
environment | Region abbreviation | ue2, uw2 |
Directory Layout
project/atmos.yamlstacks/catalog/vpc/defaults.yamlrds/defaults.yamleks/defaults.yamlorgs/acme/_defaults.yaml # namespace: acmecore/_defaults.yaml # tenant: coreaudit/_defaults.yaml # stage: auditnetwork.yamlplat/_defaults.yaml # tenant: platdev/_defaults.yaml # stage: devnetwork.yamldata.yamlstaging/_defaults.yamlnetwork.yamldata.yamlprod/_defaults.yamlnetwork.yamldata.yamlcompute.yamlcomponents/terraform/vpc/rds/eks/
atmos.yaml Configuration
components:terraform:base_path: "components/terraform"stacks:base_path: "stacks"included_paths:- "orgs/**/*"excluded_paths:- "**/_defaults.yaml"name_template: "{{.vars.tenant}}-{{.vars.stage}}"
Hierarchy Defaults Chain
# stacks/orgs/acme/_defaults.yamlvars:namespace: acmeterraform:vars:tags:Organization: acme
# stacks/orgs/acme/plat/_defaults.yamlimport:- orgs/acme/_defaultsvars:tenant: plat
# stacks/orgs/acme/plat/dev/_defaults.yamlimport:- orgs/acme/plat/_defaultsvars:stage: dev
# stacks/orgs/acme/plat/dev/network.yamlimport:- orgs/acme/plat/dev/_defaults- catalog/vpc/defaultsvars:layer: network
Import Chain Visualization
network.yaml-> dev/_defaults.yaml (stage: dev)-> plat/_defaults.yaml (tenant: plat)-> acme/_defaults.yaml (namespace: acme)-> catalog/vpc/defaults.yaml (component defaults)
Deploy Commands
atmos terraform apply vpc -s plat-dev-networkatmos terraform apply rds -s plat-prod-dataatmos terraform apply eks -s plat-prod-compute
Layered Stack Configuration
When to Use
- Many components that group by function (networking, data, compute)
- Different teams own different layers
- Need to import only layers needed for specific environments
Directory Layout
stacks/catalog/vpc/defaults.yamlrds/defaults.yamleks/defaults.yamllayers/network.yamldata.yamlcompute.yamlobservability.yamlsecurity.yamldeploy/dev.yamlprod.yaml
Layer Definitions
# stacks/layers/network.yamlimport:- catalog/vpc/defaults
# stacks/layers/data.yamlimport:- catalog/rds/defaults
Stack Importing Layers
# stacks/deploy/dev.yamlimport:- layers/network- layers/compute# Skip observability in devvars:stage: dev
# stacks/deploy/prod.yamlimport:- layers/network- layers/security- layers/data- layers/compute- layers/observabilityvars:stage: prod
Common Layer Examples
| Layer | Components | Purpose |
|---|---|---|
network | VPC, subnets, NAT, VPN | Foundation networking |
security | WAF, security groups, KMS | Security controls |
data | RDS, ElastiCache, S3 | Data storage |
compute | EKS, ECS, EC2 | Application runtime |
observability | CloudWatch, Datadog | Monitoring and logging |
Mixin Patterns
Global Mixin Types
| Type | Location | Contains |
|---|---|---|
| Region | stacks/mixins/region/ | Region name, AZs, environment abbreviation |
| Stage | stacks/mixins/stage/ | Stage name, stage-specific defaults |
| Tenant | stacks/mixins/tenant/ | Team/OU name, team-specific settings |
Catalog Mixin Types
| Type | Location | Contains |
|---|---|---|
| Feature flags | stacks/catalog/<component>/mixins/ | Enable/disable features |
| Versions | stacks/catalog/<component>/mixins/ | Component-specific version settings |
Mixin Directory Structure
stacks/catalog/vpc/defaults.yamlmixins/multi-az.yamlnat-gateway.yamleks/defaults.yamlmixins/1.27.yaml1.28.yamlmixins/region/us-east-2.yamlus-west-2.yamlstage/dev.yamlstaging.yamlprod.yamldeploy/us-east-2/dev.yamlprod.yaml
Combining Patterns
Enterprise-scale deployments typically combine multiple patterns:
- Organizational Hierarchy for the directory structure
- _defaults.yaml Convention for inheritance at each level
- Configuration Catalog for reusable component defaults
- Mixins for region and stage-specific settings
- Layered Configuration within each stage folder
- Component Inheritance for abstract base components
- Partial Component Configuration for complex components like EKS
The combination produces a DRY, maintainable structure where adding a new account, region, or component requires minimal changes.