store
The store step type writes a value to a configured store backend. You can use this step in a workflow, a custom command, or a hook. For example, a workflow can build and push a Docker image, then write the resulting tag to a store. Later, a different step, a different workflow, or another component can read the tag back with the !store or !store.get YAML function.
workflows:
build-and-deploy:
steps:
- name: build
type: container
action: build
with:
context: .
dockerfile: Dockerfile
tags:
- myapp:{{ .env.GIT_SHA }}
- name: push
type: container
action: push
with:
image: myapp:{{ .env.GIT_SHA }}
tags:
- registry.example.com/myapp:{{ .env.GIT_SHA }}
- name: record-tag
type: store
action: write
with:
store: app-metadata
key: image_tag
value: "{{ .steps.push.metadata.digest }}"
stack: prod
component: ecs-service
A later, unrelated component can read the value back in its own stack configuration. This step needs no CLI command and no workflow step:
components:
terraform:
ecs-service:
vars:
image_tag: !store app-metadata prod ecs-service image_tag
The store step has no dedicated hook kind of its own. Use the generic kind: step hook bridge to run it after a component applies. For example:
You can also bind a type: store step to after.terraform.output instead of (or alongside)
after.terraform.apply. This backfills a store from infrastructure that's already deployed —
running atmos terraform output populates the store without requiring an apply.
hooks:
record-tag:
kind: step
type: store
events: [after.terraform.apply]
with:
store: app-metadata
key: last_applied_at
value: "{{ .atmos_component }} applied in {{ .stack }}"
Atmos also has an older kind: store hook (see Manage lifecycle events with hooks). That hook predates this step type and works only with Terraform output. The two features are unrelated. The kind: field selects the hook engine. The type: field selects a workflow step through the generic kind: step bridge. Atmos keeps both features available.
Fields
All fields are read from with:.
store- Required. The name of the configured store backend to write to. This name is a key under
stores:inatmos.yaml. This field supports Go templates. key- Required. The key to write. This field supports Go templates.
value- Required. The value to write. This field supports Go templates. Use a template to pass a prior step's result into the store, for example
{{ .steps.push.metadata.digest }}. stack- Optional. The stack to scope the key to. If you omit this field, Atmos uses the workflow's
--stackflag or theATMOS_STACKvariable. If neither is set, Atmos stores a global key. This field supports Go templates. component- Optional. The component to scope the key to. If you omit this field, Atmos uses the workflow's
--componentflag or theATMOS_COMPONENTvariable. If neither is set, Atmos stores a global key. This field supports Go templates. action- The action to run. The only supported action is
write, which is also the default. You can omit this field.
Write to a Secret Store
You can write to a store marked secret: true. For example, a step can generate a password and
write it straight to a secret backend. This behavior differs from the read-side
!store and !store.get functions. Those
functions refuse to read a secret: true store; use !secret instead.
Atmos does not restrict a store step's write the same way. But this write is not risk-free.
Atmos returns the written value as {{ .steps.<name>.value }}. Every later step in the
workflow can access this value. A careless later step could echo it, log it, or pass it to a shell
command or another output step. Treat this result as sensitive when the value is a secret. Do not
echo, log, or forward it to an output step. Writing this way also skips
atmos secret's declaration and scope tracking. When a value must be
tracked as a secret, declare it under secrets.vars and use atmos secret set instead.
Result
{{ .steps.<name>.value }}- The value that was written.
{{ .steps.<name>.metadata.store }}- The store name that was written to.
{{ .steps.<name>.metadata.key }}- The key that was written.
{{ .steps.<name>.metadata.stack }}- The resolved stack (empty for a store-global key).
{{ .steps.<name>.metadata.component }}- The resolved component (empty for a store-global key).
See also
- Stores configuration
atmos storeCLI — read, write, delete, and list store values from the command line!storeYAML function!store.getYAML function- Manage lifecycle events with hooks