Using Custom Component Types
Beyond the native component types, Atmos lets you define custom component types so you can manage any tool—AWS CDK, CloudFormation, Pulumi, Bicep, database migrations, and more—with the same stack-based configuration system used for Terraform, Helmfile, and Packer.
Custom component types are defined through custom commands. Unlike the native types, which ship with built-in orchestration, a custom type is one you wire up yourself: you declare the type on a custom command and supply the execution steps, while Atmos handles stack resolution, inheritance, and configuration merging exactly as it does for native components.
How It Works
Define a component.type on a custom command and tell Atmos which argument provides the component name and which provides the stack name. Atmos then looks up components.<type>.<name> from your stack manifests and exposes the fully resolved configuration via {{ .Component.* }}.
# atmos.yaml
commands:
- name: script
description: "Run script components"
arguments:
- name: component
type: component # Provides the component name
required: true
flags:
- name: stack
shorthand: s
semantic_type: stack # Provides the stack name
required: true
component:
type: script # Your custom component type
steps:
- 'echo "App: {{ .Component.vars.app_name }}"'
- 'echo "Version: {{ .Component.vars.version }}"'
Configure the component in stack manifests just like a native type—with full imports and inheritance:
# stacks/deploy/dev.yaml
components:
script: # Matches component.type
deploy-app:
vars:
app_name: "myapp"
version: "1.0.0"
Run it:
atmos script deploy-app -s dev
# App: myapp
# Version: 1.0.0
Global vars, settings, and env are merged automatically, and a component's env section is exported as real environment variables—making it straightforward to pass secrets securely.
Native vs. Custom
| Aspect | Native types (Terraform/Helmfile/Packer/Ansible) | Custom types |
|---|---|---|
| Orchestration | Built into Atmos | You supply the steps |
| Definition | Always available | Defined via a custom command |
| Stack configuration | components.<type>.<name> | components.<type>.<name> |
| Configuration access | Native flags/varfiles | {{ .Component.* }} templates |
Try It
Explore a complete, working example that defines a custom script component type and configures it through stacks.
Related
- Custom Component Types — Full reference, including template variables and configuration options
- Custom Commands — How to define custom commands
- Introducing Custom Component Types — Background and real-world examples