Skip to main content

16 posts tagged with "Breaking Change"

Breaking changes requiring user action

View All Tags

Template Engine Upgrade Drops the End-of-Life AWS SDK from Atmos

· 9 min read
Erik Osterman
Founder @ Cloud Posse

Most security findings are fixed with a patch or minor release of the affected dependency. Some need a major version upgrade instead: when a dependency's major release line stops being maintained, its CVEs stay open forever, and every project that pulls it in inherits them. That is where Atmos was: the template engine it embeds, Gomplate, had moved on from the release line Atmos used, and that line depended on the AWS SDK for Go v1, which has reached end of support and carries CVEs no v1 release will ever fix. Atmos never executed the affected code, but no patch or minor release could clear the findings. The CVEs forced our hand: the template engine now runs on Gomplate v5, two major versions ahead, and the end-of-life SDK is gone from the Atmos build entirely.

Inherited Components Now Use the Backend Key of Their Module

· 3 min read
Erik Osterman
Founder @ Cloud Posse

A component that inherits metadata.component from a base should behave like one that sets it directly. Until now, parts of Atmos still treated it as a component named after the instance, which caused failed lookups and missed affected components. Fixing that also changes the backend key Atmos generates for these components, so existing projects may need one step when they upgrade.

YAML functions require explicit tags

· 2 min read
Erik Osterman
Founder @ Cloud Posse

Starting with the 2026-10-20 edition, Atmos evaluates YAML functions only when they are written as explicit YAML tags. Quoting an entire function expression keeps it as literal text.

Previously, Atmos stored deferred function calls as plain strings to evaluate them after merging and template rendering, which erased the distinction between a real YAML tag and quoted text. That was a bug.

Step Templates Now Honor Your Configured Delimiters

· 3 min read
Erik Osterman
Founder @ Cloud Posse

The templates.settings.delimiters setting changes the delimiters that Atmos templates use, but it only ever reached stack manifests. Workflow, custom command, and lifecycle hook steps kept parsing {{ }} no matter what you configured. A project that moved to [[ ]] to keep Go-template-looking text such as a docker inspect --format '{{.State.Status}}' argument out of the template engine still had to mark each of those step fields !literal, or fail with a template error.

Container Build Paths Depended on Where You Ran Atmos From

· 3 min read
Erik Osterman
Founder @ Cloud Posse

A container component's build.context and dockerfile looked like ordinary relative paths, but they weren't resolved against anything in particular — they resolved against whatever directory your shell happened to be in the moment you ran atmos container build. Run it from the repo root and it worked. Run it from a subdirectory, a CI job with a different working directory, or a script that changes directories first, and the build silently picked up the wrong Dockerfile or found nothing at all. Setting components.container.base_path didn't help — that option was accepted but quietly ignored.

list and describe Commands Degrade Gracefully by Default

· 4 min read
Erik Osterman
Founder @ Cloud Posse

Reading !terraform.state and !terraform.output can fail to resolve for a dozen different reasons — the backend hasn't been applied yet, your credentials aren't configured, you don't have access to the bucket, or the state you're reading just isn't the latest. Any one of those, on any one component, used to abort the entire list/describe command — every other stack you did want to see disappeared behind one unrelated failure.

The list and describe commands now degrade gracefully by default: an unresolved value is shown as (computed) instead of aborting the command, with a one-line summary telling you how many values were affected.