Skip to main content

Multiple Inheritance

Atmos Design Pattern

The Multiple Inheritance pattern allows a component to inherit from multiple abstract base components, combining their configurations. This lets you compose components from reusable building blocks.

Use-cases​

Use Multiple Inheritance when:

  • You have reusable configuration "traits" that apply to multiple components

  • You want to compose configuration from independent concerns (e.g., logging + monitoring + security)

  • Different teams own different aspects of component configuration

How It Works​

A component lists multiple base components in metadata.inherits. Configuration is merged in orderβ€”later entries override earlier ones:

metadata:
inherits:
- base/defaults # Applied first
- base/logging # Applied second, overrides conflicts
- base/production # Applied last, highest precedence

Example: Composing from Traits​

Define abstract base components that represent different configuration concerns:

stacks/catalog/base/defaults.yaml

components:
terraform:
base/defaults:
metadata:
type: abstract
vars:
enabled: true
tags:
managed_by: atmos

stacks/catalog/base/logging.yaml

components:
terraform:
base/logging:
metadata:
type: abstract
vars:
logging_enabled: true
log_retention_days: 30

stacks/catalog/base/production.yaml

components:
terraform:
base/production:
metadata:
type: abstract
vars:
multi_az: true
deletion_protection: true
tags:
environment: production

Now compose a concrete component by inheriting from multiple bases:

stacks/deploy/prod.yaml

import:
- catalog/base/defaults
- catalog/base/logging
- catalog/base/production

components:
terraform:
rds:
metadata:
component: rds
inherits:
- base/defaults
- base/logging
- base/production
vars:
name: my-database
instance_class: db.r6g.large

The resulting rds component has:

# From base/defaults
enabled: true
tags:
managed_by: atmos
environment: production # Merged from base/production

# From base/logging
logging_enabled: true
log_retention_days: 30

# From base/production
multi_az: true
deletion_protection: true

# From inline vars
name: my-database
instance_class: db.r6g.large

Example: Environment + Size Traits​

Combine environment settings with sizing presets:

stacks/catalog/size/small.yaml

components:
terraform:
size/small:
metadata:
type: abstract
vars:
instance_class: db.t3.small
storage_size: 20
max_connections: 100

stacks/catalog/size/large.yaml

components:
terraform:
size/large:
metadata:
type: abstract
vars:
instance_class: db.r6g.xlarge
storage_size: 500
max_connections: 1000

stacks/catalog/env/dev.yaml

components:
terraform:
env/dev:
metadata:
type: abstract
vars:
deletion_protection: false
multi_az: false

stacks/catalog/env/prod.yaml

components:
terraform:
env/prod:
metadata:
type: abstract
vars:
deletion_protection: true
multi_az: true
backup_retention_period: 30

Compose different combinations:

stacks/deploy/dev.yaml

import:
- catalog/size/small
- catalog/env/dev

components:
terraform:
rds:
metadata:
component: rds
inherits:
- size/small
- env/dev
vars:
name: dev-database

stacks/deploy/prod.yaml

import:
- catalog/size/large
- catalog/env/prod

components:
terraform:
rds:
metadata:
component: rds
inherits:
- size/large
- env/prod
vars:
name: prod-database

Merge Behavior​

When the same key exists in multiple base components:

Data TypeBehavior
Scalars (strings, numbers, bools)Later value wins
Maps/ObjectsDeep merged, later values override
Lists/ArraysLater list replaces entirely

Example with maps:

# base/defaults
tags:
managed_by: atmos
team: platform

# base/production
tags:
environment: production

# Result (deep merged)
tags:
managed_by: atmos # from defaults
team: platform # from defaults
environment: production # from production

References​