<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog</id>
    <title>atmos Blog</title>
    <updated>2026-02-26T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog"/>
    <subtitle>atmos Blog</subtitle>
    <icon>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/img/atmos-logo.png</icon>
    <entry>
        <title type="html"><![CDATA[New !aws.organization_id YAML Function]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-organization-id-yaml-function</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-organization-id-yaml-function"/>
        <updated>2026-02-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Access the AWS Organization ID directly in stack configuration with the new !aws.organization_id YAML function.]]></summary>
        <content type="html"><![CDATA[<p>Access the AWS Organization ID directly in stack configuration with the new <code>!aws.organization_id</code> YAML function.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-organization-id-yaml-function#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Atmos now includes a new <code>!aws.organization_id</code> YAML function that retrieves the AWS Organization ID by calling
the AWS Organizations <code>DescribeOrganization</code> API. This complements the existing AWS context functions:
<code>!aws.account_id</code>, <code>!aws.caller_identity_arn</code>, <code>!aws.caller_identity_user_id</code>, and <code>!aws.region</code>.</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">my-component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">organization_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!aws.organization_id</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-organization-id-yaml-function#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>The AWS Organization ID is commonly needed for:</p>
<ul>
<li class=""><strong>Service Control Policies (SCPs)</strong> - Scoping policies to the organization</li>
<li class=""><strong>Cross-account trust policies</strong> - Referencing the organization in IAM conditions</li>
<li class=""><strong>Resource tagging</strong> - Tagging resources with the organization ID for cost allocation</li>
<li class=""><strong>Multi-account governance</strong> - Configuring components that operate at the organization level</li>
</ul>
<p>Previously, users had to hardcode the organization ID or use workarounds. Now it's available dynamically,
just like other AWS context values.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-organization-id-yaml-function#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<p>Use <code>!aws.organization_id</code> anywhere in your stack YAML files:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">governance</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">org_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!aws.organization_id</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">tags</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">OrganizationId</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!aws.organization_id</span><br></span></code></pre></div></div>
<p>The function requires the <code>organizations:DescribeOrganization</code> IAM permission and the account must be
a member of an AWS Organization.</p>
<p>Results are cached for the duration of the CLI invocation, so multiple references only make one API call.</p>
<p>This is equivalent to Terragrunt's <code>get_aws_org_id()</code> function.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/aws-organization-id-yaml-function#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<ul>
<li class="">Read the <a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/functions/yaml/aws.organization-id">documentation</a> for full details</li>
<li class="">Report issues on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a></li>
</ul>]]></content>
        <author>
            <name>Andriy Knysh</name>
            <uri>https://github.com/aknysh</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Identity-Based Authentication for Stores]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/store-identity-support</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/store-identity-support"/>
        <updated>2026-02-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos stores now support identity-based authentication. You can configure stores to authenticate using the same named identities from atmos auth instead of relying on default credential chains.]]></summary>
        <content type="html"><![CDATA[<p>Atmos stores now support identity-based authentication. You can configure stores to authenticate using the same named identities from <code>atmos auth</code> instead of relying on default credential chains.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/store-identity-support#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Stores (<code>!store</code> YAML function) can now reference an Atmos auth identity via a new <code>identity</code> field in the store configuration. When set, the store uses that identity's credentials instead of the default credential chain (environment variables, default AWS profiles, etc.).</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">stores</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">prod/aws-ssm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> aws</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">ssm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">parameter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">store</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">identity</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> prod</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">admin</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">options</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">region</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> us</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">east</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><br></span></code></pre></div></div>
<p>This works with all cloud-backed store types:</p>
<ul>
<li class=""><strong>AWS SSM Parameter Store</strong> - loads AWS config from realm-scoped credential and config files</li>
<li class=""><strong>Azure Key Vault</strong> - authenticates via <code>DefaultAzureCredential</code> with tenant hint from auth context</li>
<li class=""><strong>Google Secret Manager</strong> - uses realm-scoped application default credentials file</li>
</ul>
<p>Redis and Artifactory stores do not support identity-based authentication since they don't map to cloud provider identity types.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="realm-compatibility">Realm Compatibility<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/store-identity-support#realm-compatibility" class="hash-link" aria-label="Direct link to Realm Compatibility" title="Direct link to Realm Compatibility" translate="no">​</a></h2>
<p>Store identities are fully compatible with Atmos auth realms. When a realm is configured, the auth system embeds the realm into credential file paths (e.g., <code>~/.config/atmos/{realm}/aws/{provider}/credentials</code>). These realm-scoped paths flow through the resolver to stores automatically -- store code never needs to know about realms.</p>
<p>This means stores in different realms use isolated credentials, preventing cross-environment credential collisions.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/store-identity-support#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Previously, stores always used the default credential chain, which meant separate credential management for secrets access vs. Terraform execution. Now you can use the same identity system for both, simplifying credential management and enabling more granular access control.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/store-identity-support#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<ol>
<li class="">Configure an identity in your <code>atmos.yaml</code> auth section (as you normally would for <code>atmos auth</code>).</li>
<li class="">Add the <code>identity</code> field to your store configuration referencing that identity name.</li>
<li class="">The store will automatically authenticate using that identity on first access.</li>
</ol>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">stores</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">prod/aws-ssm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> aws</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">ssm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">parameter</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">store</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">identity</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> prod</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">admin</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">options</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">region</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> us</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">east</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">staging/azure-kv</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> azure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">vault</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">identity</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> staging</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">azure</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">options</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vault_url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain">//staging</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">vault.vault.azure.net</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">prod/gsm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> google</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">secret</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">manager</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">identity</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> gcp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">prod</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">options</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">project_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> my</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">gcp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">project</span><br></span></code></pre></div></div>
<p>Stores without the <code>identity</code> field continue to work exactly as before -- this is a fully backward-compatible change.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/store-identity-support#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Have questions or feedback? Open an issue on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content>
        <author>
            <name>Andriy Knysh</name>
            <uri>https://github.com/aknysh</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Test PR Features with --use-version]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/pr-artifact-installation</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/pr-artifact-installation"/>
        <updated>2026-02-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Test features from any Atmos pull request or commit SHA without compiling from source or manually downloading artifacts.]]></summary>
        <content type="html"><![CDATA[<p>Test features from any Atmos pull request or commit SHA without compiling from source or manually downloading artifacts.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="whats-new">What's New<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/pr-artifact-installation#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<p>The <code>--use-version</code> flag now accepts PR numbers and commit SHAs, making it trivial to test features from any open pull request or specific commit:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Test a feature from PR #2040</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos --use-version pr:2040 terraform plan</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Numbers are auto-detected as PRs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos --use-version </span><span class="token number" style="color:rgb(247, 140, 108)">2040</span><span class="token plain"> describe stacks</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Test a specific commit by SHA</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos --use-version sha:ceb7526 version</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># SHAs are auto-detected (7-40 hex chars)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos --use-version ceb7526be terraform plan</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-it-works">How It Works<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/pr-artifact-installation#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<p>When you specify a PR number or SHA, Atmos:</p>
<ol>
<li class=""><strong>Fetches the artifact</strong> - Downloads the correct platform binary (Linux, macOS, Windows) from GitHub Actions</li>
<li class=""><strong>Caches locally</strong> - Stores the binary in <code>~/.local/share/atmos/toolchain/bin/</code> with metadata for fast subsequent runs</li>
<li class=""><strong>Re-executes</strong> - Runs your command using the specified version of Atmos</li>
</ol>
<p>For PR versions, the cache uses a 1-minute TTL before checking for new commits, so repeated runs within that window are instant.</p>
<p>For SHA versions, the cache is permanent since commits are immutable - once installed, a SHA version is always ready to use.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="clear-error-messages">Clear Error Messages<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/pr-artifact-installation#clear-error-messages" class="hash-link" aria-label="Direct link to Clear Error Messages" title="Direct link to Clear Error Messages" translate="no">​</a></h2>
<p>When things go wrong, you get actionable guidance:</p>
<ul>
<li class=""><strong>Invalid version format</strong>: Clear message showing valid formats (PR number, pr<!-- -->:NNNN<!-- -->, sha<!-- -->:XXXXXXX<!-- -->, or semver)</li>
<li class=""><strong>Missing GitHub token</strong>: Instructions for authenticating via <code>gh</code> CLI or environment variable</li>
<li class=""><strong>PR/commit not found</strong>: Direct link to the PR or commit page</li>
<li class=""><strong>CI workflow failing</strong>: Explanation of why artifacts might be missing</li>
<li class=""><strong>Unsupported platform</strong>: Suggests alternatives</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="requirements">Requirements<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/pr-artifact-installation#requirements" class="hash-link" aria-label="Direct link to Requirements" title="Direct link to Requirements" translate="no">​</a></h2>
<p>PR artifact installation requires GitHub authentication. The feature checks for tokens in this order:</p>
<ol>
<li class=""><code>ATMOS_GITHUB_TOKEN</code> environment variable</li>
<li class=""><code>GITHUB_TOKEN</code> environment variable</li>
<li class="">GitHub CLI (<code>gh</code>) authentication</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="getting-started">Getting Started<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/pr-artifact-installation#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Authenticate with GitHub CLI (if not already)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">gh auth login</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Test a PR</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos --use-version pr:2040 version</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Test a specific commit</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos --use-version sha:ceb7526 version</span><br></span></code></pre></div></div>
<p>This feature complements our existing PR feature releases infrastructure, making it even easier to validate changes before they merge.</p>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="DX" term="DX"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Terraform Cloud Backend Support for !terraform.output]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terraform-cloud-output-function</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terraform-cloud-output-function"/>
        <updated>2026-02-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The !terraform.output YAML function now works seamlessly with Terraform Cloud and Terraform Enterprise backends, enabling cross-component dependencies without switching backend types.]]></summary>
        <content type="html"><![CDATA[<p>The <code>!terraform.output</code> YAML function now works seamlessly with Terraform Cloud and Terraform Enterprise backends, enabling cross-component dependencies without switching backend types.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terraform-cloud-output-function#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Atmos now correctly generates <code>backend.tf.json</code> configuration for Terraform Cloud and Terraform Enterprise backends when using the <code>!terraform.output</code> YAML function. This was previously broken because Terraform Cloud requires a different backend structure than other backend types.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terraform-cloud-output-function#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>The <code>!terraform.output</code> YAML function is powerful—it lets you reference outputs from one component in another component's configuration, creating declarative dependencies between infrastructure components. However, this feature was silently failing for teams using Terraform Cloud or Terraform Enterprise backends.</p>
<p>When Atmos needed to fetch outputs from a dependency component, it would generate an incorrect backend configuration that Terraform would reject:</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">Error: Unsupported backend type on backend.tf.json line 4, in terraform.backend: 4:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">"cloud": { There is no explicit backend type named "cloud". To configure HCP</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Terraform, declare a 'cloud' block instead.</span><br></span></code></pre></div></div>
<p>This forced teams to either:</p>
<ul>
<li class="">Avoid using <code>!terraform.output</code> with Terraform Cloud</li>
<li class="">Switch to S3/Azure/GCS backends just to use this feature</li>
<li class="">Manually work around the limitation with <code>terraform_remote_state</code> data sources</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-problem">The Problem<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terraform-cloud-output-function#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>Terraform Cloud has a unique backend configuration structure. Unlike other backends (S3, Azure, GCS) that nest under <code>terraform.backend.&lt;type&gt;</code>, Terraform Cloud's configuration must be placed directly under <code>terraform.cloud</code>:</p>
<p><strong>Incorrect (what Atmos was generating):</strong></p>
<div class="language-json codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-json codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"terraform"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token property" style="color:rgb(128, 203, 196)">"backend"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token property" style="color:rgb(128, 203, 196)">"cloud"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token property" style="color:rgb(128, 203, 196)">"organization"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"my-org"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token property" style="color:rgb(128, 203, 196)">"workspaces"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token property" style="color:rgb(128, 203, 196)">"name"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"my-workspace"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<p><strong>Correct (what Terraform Cloud expects):</strong></p>
<div class="language-json codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-json codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"terraform"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token property" style="color:rgb(128, 203, 196)">"cloud"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token property" style="color:rgb(128, 203, 196)">"organization"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"my-org"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token property" style="color:rgb(128, 203, 196)">"workspaces"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token property" style="color:rgb(128, 203, 196)">"name"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"my-workspace"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<p>This subtle difference caused Terraform to fail during initialization, preventing the <code>!terraform.output</code> function from fetching outputs.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-it-works">How It Works<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terraform-cloud-output-function#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<p>Atmos now detects when a component uses a Terraform Cloud backend and generates the correct JSON structure automatically. The fix is applied in the <code>generateBackendConfig</code> function within the <code>pkg/terraform/output</code> package.</p>
<p>When you use <code>!terraform.output</code> to reference another component's outputs, Atmos:</p>
<ol>
<li class="">Determines the backend type of the dependency component</li>
<li class="">Generates the appropriate <code>backend.tf.json</code> structure</li>
<li class="">For Terraform Cloud/Enterprise backends specifically, places the configuration under <code>terraform.cloud</code> instead of <code>terraform.backend.cloud</code></li>
<li class="">Runs <code>terraform init</code> and <code>terraform output</code> to fetch the values</li>
<li class="">Returns the output values for use in your stack configuration</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="example-usage">Example Usage<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terraform-cloud-output-function#example-usage" class="hash-link" aria-label="Direct link to Example Usage" title="Direct link to Example Usage" translate="no">​</a></h2>
<p>Define your EKS cluster component with a Terraform Cloud backend:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># stacks/eks-cluster.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">cluster</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">backend_type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cloud</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">backend</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cloud</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">organization</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"my-org"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">workspaces</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"eks-cluster-prod"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cluster_version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"1.29"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># ... other cluster configuration</span><br></span></code></pre></div></div>
<p>Now reference the cluster outputs in your application component:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># stacks/my-app.yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">my-app</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">backend_type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cloud</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">backend</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cloud</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">organization</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"my-org"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">workspaces</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">            </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"my-app-prod"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Reference cluster outputs using !terraform.output</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cluster_endpoint</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!terraform.output</span><span class="token plain"> cluster.cluster_endpoint</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cluster_ca_cert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!terraform.output</span><span class="token plain"> cluster.cluster_certificate_authority_data</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cluster_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!terraform.output</span><span class="token plain"> cluster.cluster_name</span><br></span></code></pre></div></div>
<p>When Atmos processes <code>my-app</code>, it will:</p>
<ul>
<li class="">Detect that <code>cluster</code> uses a Terraform Cloud backend</li>
<li class="">Generate the correct backend configuration</li>
<li class="">Fetch the outputs from the <code>eks-cluster-prod</code> workspace</li>
<li class="">Make them available to your <code>my-app</code> component</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="whats-next">What's Next<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terraform-cloud-output-function#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no">​</a></h2>
<p>This fix ensures feature parity across all backend types. Whether you're using S3, Azure Blob Storage, GCS, or Terraform Cloud, the <code>!terraform.output</code> function now works consistently.</p>
<p>For teams already using Terraform Cloud, this unlocks the full power of declarative component dependencies without manual workarounds.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/terraform-cloud-output-function#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Try out the enhanced <code>!terraform.output</code> function with Terraform Cloud and let us know what you think! File issues or feature requests on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content>
        <author>
            <name>Marko Petrovic</name>
            <uri>https://github.com/gitbluf</uri>
        </author>
        <category label="Enhancement" term="Enhancement"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Describe Affected Now Detects Deleted Components and Stacks]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-deleted-detection</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-deleted-detection"/>
        <updated>2026-02-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos now automatically detects components and stacks that have been deleted in your current branch compared to the target branch.]]></summary>
        <content type="html"><![CDATA[<p>Atmos now automatically detects components and stacks that have been deleted in your current branch compared to the target branch.
This enables CI/CD pipelines to trigger <code>terraform destroy</code> workflows for removed infrastructure.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-problem">The Problem<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-deleted-detection#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>Previously, <code>atmos describe affected</code> only detected components that were <strong>modified</strong> between two Git commits.
It worked by iterating over stacks in HEAD (current branch) and comparing them to BASE (target branch).
This meant:</p>
<ul>
<li class="">Components removed from a stack were invisible to the affected detection</li>
<li class="">Entire stacks that were deleted went unnoticed</li>
<li class="">CI/CD pipelines had no automated way to know which resources needed <code>terraform destroy</code></li>
<li class="">Users had to manually identify and destroy removed components, risking resource leaks</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-solution">The Solution<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-deleted-detection#the-solution" class="hash-link" aria-label="Direct link to The Solution" title="Direct link to The Solution" translate="no">​</a></h2>
<p>The <code>describe affected</code> command now performs a second pass that iterates over BASE stacks to detect deletions:</p>
<ol>
<li class=""><strong>Deleted components</strong>: Components that exist in BASE but not in HEAD (within the same stack)</li>
<li class=""><strong>Deleted stacks</strong>: Entire stacks that exist in BASE but not in HEAD</li>
</ol>
<p>Deleted components are marked with new fields in the output:</p>
<div class="language-json codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-json codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"component"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"monitoring"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"component_type"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"terraform"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"stack"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"prod-us-east-1"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"affected"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"deleted"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"deleted"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">"deletion_type"</span><span class="token operator" style="color:rgb(127, 219, 202)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"component"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="new-output-fields">New Output Fields<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-deleted-detection#new-output-fields" class="hash-link" aria-label="Direct link to New Output Fields" title="Direct link to New Output Fields" translate="no">​</a></h2>
<table><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>deleted</code></td><td>boolean</td><td><code>true</code> if the component was deleted</td></tr><tr><td><code>deletion_type</code></td><td>string</td><td><code>component</code> (removed from stack) or <code>stack</code> (entire stack deleted)</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="new-affected-reasons">New Affected Reasons<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-deleted-detection#new-affected-reasons" class="hash-link" aria-label="Direct link to New Affected Reasons" title="Direct link to New Affected Reasons" translate="no">​</a></h2>
<table><thead><tr><th>Reason</th><th>Description</th></tr></thead><tbody><tr><td><code>deleted</code></td><td>Component was removed from a stack</td></tr><tr><td><code>deleted.stack</code></td><td>Entire stack was deleted</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="filtering-deleted-vs-modified-components">Filtering Deleted vs Modified Components<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-deleted-detection#filtering-deleted-vs-modified-components" class="hash-link" aria-label="Direct link to Filtering Deleted vs Modified Components" title="Direct link to Filtering Deleted vs Modified Components" translate="no">​</a></h2>
<p>Use the <code>--query</code> flag or <code>jq</code> to separate deleted components from modified ones:</p>
<div class="language-shell codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-shell codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Get only deleted components (for destruction)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos describe affected </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--query</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">'[.[] | select(.deleted == true)]'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Get only modified components (for apply)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos describe affected </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--query</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">'[.[] | select(.deleted != true)]'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="using-with-list-affected">Using with List Affected<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-deleted-detection#using-with-list-affected" class="hash-link" aria-label="Direct link to Using with List Affected" title="Direct link to Using with List Affected" translate="no">​</a></h2>
<p>The <a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/list/affected"><code>atmos list affected</code></a> command also supports deleted detection, providing a human-readable table view:</p>
<div class="language-shell codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-shell codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># List all affected components including deleted ones</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos list affected</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Filter deleted components in JSON format</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos list affected </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token plain"> json </span><span class="token operator" style="color:rgb(127, 219, 202)">|</span><span class="token plain"> jq </span><span class="token string" style="color:rgb(173, 219, 103)">'[.[] | select(.deleted == true)]'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Custom columns showing deletion status</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos list affected </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--columns</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"Component={{ .component }},Stack={{ .stack }},Deleted={{ .deleted }}"</span><br></span></code></pre></div></div>
<p>The <code>deleted</code> and <code>deletion_type</code> fields are available for custom column templates.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="cicd-integration-example">CI/CD Integration Example<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-deleted-detection#cicd-integration-example" class="hash-link" aria-label="Direct link to CI/CD Integration Example" title="Direct link to CI/CD Integration Example" translate="no">​</a></h2>
<p>Here's how to separate apply and destroy workflows in GitHub Actions:</p>
<div class="theme-admonition theme-admonition-warning admonition_cbIa alert alert--warning"><div class="admonitionHeading_squj"><span class="admonitionIcon_bxkr"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_HCPN"><p><strong>Review deletions carefully before destroying infrastructure.</strong> The destroy job below uses <code>--auto-approve</code> for automation purposes. In production environments, consider adding a manual approval gate or requiring PR review before executing destroy operations to prevent accidental resource deletion.</p></div></div>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">detect-changes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">outputs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">modified</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> steps.affected.outputs.modified </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">deleted</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> steps.affected.outputs.deleted </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> actions/checkout@v4</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">fetch-depth</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cloudposse/github</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">action</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">setup</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">atmos@v2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Detect affected</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> affected</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token scalar string" style="color:rgb(173, 219, 103)"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">          atmos describe affected --format json &gt; affected.json</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Separate modified and deleted components</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          jq '</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">.</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token plain"> select(.deleted </span><span class="token tag" style="color:rgb(127, 219, 202)">!=</span><span class="token plain"> true)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain">' affected.json </span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"> modified.json</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          jq '</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">.</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token plain"> select(.deleted == true)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain">' affected.json </span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"> deleted.json</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          echo "modified=$(cat modified.json </span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token plain"> jq </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">c)" </span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"> $GITHUB_OUTPUT</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          echo "deleted=$(cat deleted.json </span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token plain"> jq </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">c)" </span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"> $GITHUB_OUTPUT</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">apply</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">needs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> detect</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">changes</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">if</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> needs.detect</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">changes.outputs.modified </span><span class="token tag" style="color:rgb(127, 219, 202)">!=</span><span class="token plain"> '</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain">'</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">strategy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">matrix</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">include</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> fromJson(needs.detect</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">changes.outputs.modified) </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> actions/checkout@v4</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cloudposse/github</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">action</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">setup</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">atmos@v2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos terraform apply $</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> matrix.component </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">s $</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> matrix.stack </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">destroy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">needs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> detect</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">changes</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">if</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> needs.detect</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">changes.outputs.deleted </span><span class="token tag" style="color:rgb(127, 219, 202)">!=</span><span class="token plain"> '</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain">'</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> production  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Requires manual approval</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">strategy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">matrix</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">include</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> fromJson(needs.detect</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">changes.outputs.deleted) </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Check out BASE branch - deleted component config only exists there</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> actions/checkout@v4</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">ref</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> github.base_ref </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cloudposse/github</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">action</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">setup</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">atmos@v2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos terraform destroy $</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> matrix.component </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">s $</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> matrix.stack </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">auto</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">approve</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="edge-cases">Edge Cases<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-deleted-detection#edge-cases" class="hash-link" aria-label="Direct link to Edge Cases" title="Direct link to Edge Cases" translate="no">​</a></h2>
<ul>
<li class=""><strong>Abstract components</strong> (<code>metadata.type: abstract</code>) are not reported as deleted since they are blueprints and not provisioned</li>
<li class=""><strong>Component renames</strong> appear as both a deletion (old name) and a new component (new name)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="related-documentation">Related Documentation<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-deleted-detection#related-documentation" class="hash-link" aria-label="Direct link to Related Documentation" title="Direct link to Related Documentation" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/describe/affected">Describe Affected Command</a> - Full command reference</li>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/list/affected">List Affected Command</a> - Human-readable table view</li>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/integrations/github-actions/affected-stacks">Affected Stacks GitHub Action</a> - CI/CD integration</li>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/design-patterns/inheritance-patterns/abstract-component">Component Inheritance</a> - Abstract component patterns</li>
</ul>]]></content>
        <author>
            <name>Andriy Knysh</name>
            <uri>https://github.com/aknysh</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SSE-C Encryption Support for Remote State Lookups]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/sse-c-support</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/sse-c-support"/>
        <updated>2026-02-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The !terraform.state YAML function now supports reading from S3 buckets encrypted with customer-provided keys (SSE-C).]]></summary>
        <content type="html"><![CDATA[<p>The <code>!terraform.state</code> YAML function now supports reading from S3 buckets encrypted with customer-provided keys (SSE-C).</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/sse-c-support#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>When using <code>!terraform.state</code> to read Terraform or OpenTofu state directly from S3, Atmos now supports SSE-C (Server-Side Encryption with Customer-Provided Keys). Previously, state files stored in SSE-C encrypted buckets were inaccessible through <code>!terraform.state</code>, requiring workarounds to retrieve outputs.</p>
<p>You can provide the SSE-C key in two ways:</p>
<ol>
<li class="">
<p><strong>Backend attribute</strong> in your stack configuration:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">my-component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">backend</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">s3</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">sse_customer_key</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"your-base64-encoded-key"</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>Environment variable</strong>:</p>
<div class="language-shell codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-shell codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token builtin class-name" style="color:rgb(255, 203, 139)">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(214, 222, 235)">AWS_SSE_CUSTOMER_KEY</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token string" style="color:rgb(173, 219, 103)">"your-base64-encoded-key"</span><br></span></code></pre></div></div>
</li>
</ol>
<p>The backend attribute takes precedence over the environment variable, following the same convention as OpenTofu and Terraform.</p>
<p>This also works with <code>remote_state_backend</code> overrides, so you can configure SSE-C keys per-component when referencing remote state.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/sse-c-support#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Organizations that use SSE-C for S3 state encryption previously couldn't use <code>!terraform.state</code> to reference outputs from those state files. This meant either switching encryption strategies or falling back to <code>!terraform.output</code> (which runs <code>terraform output</code> and requires the full Terraform/OpenTofu binary). With SSE-C support, <code>!terraform.state</code> reads the state file directly from S3 with the correct encryption headers, keeping lookups fast and dependency-free.</p>
<p>Note that this only affects <code>!terraform.state</code> (which reads state files directly from S3). The <code>!terraform.output</code> function is unaffected since it delegates to Terraform/OpenTofu, which already handles SSE-C natively.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/sse-c-support#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Have questions or feedback? Join us on <a href="https://slack.cloudposse.com/" target="_blank" rel="noopener noreferrer" class="">Slack</a> or open an issue on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Enhancement" term="Enhancement"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[GCP Authentication Support]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/gcp-authentication-support</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/gcp-authentication-support"/>
        <updated>2026-02-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos now supports first-class Google Cloud authentication alongside AWS and Azure, with provider-scoped file isolation and a unified auth experience.]]></summary>
        <content type="html"><![CDATA[<p>Atmos now supports first-class Google Cloud authentication alongside AWS and Azure, with provider-scoped file isolation and a unified auth experience.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/gcp-authentication-support#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<ul>
<li class="">Added GCP providers: <code>gcp/adc</code> and <code>gcp/workload-identity-federation</code>.</li>
<li class="">Added GCP identities: <code>gcp/service-account</code> and <code>gcp/project</code>.</li>
<li class="">Implemented provider-scoped file isolation at <code>~/.config/atmos/gcp/&lt;provider-name&gt;/...</code>.</li>
<li class="">Integrated GCP auth with <code>atmos auth login</code>, <code>atmos auth whoami</code>, and Terraform execution.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/gcp-authentication-support#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<ul>
<li class="">Use the same auth flow across AWS, Azure, and GCP.</li>
<li class="">Avoid long-lived keys in CI/CD with Workload Identity Federation.</li>
<li class="">Keep credentials isolated per provider and identity, without touching user <code>gcloud</code> config.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/gcp-authentication-support#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<p>For local development with ADC:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">auth</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">providers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">gcp-adc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> gcp/adc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">project_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> my</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">project</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">identities</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> gcp/service</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">account</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">default</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">via</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">provider</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> gcp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">adc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">principal</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">service_account_email</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> terraform@my</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">project.iam.gserviceaccount.com</span><br></span></code></pre></div></div>
<p>For GitHub Actions with Workload Identity Federation — no <code>token_source</code> needed, everything is auto-detected:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">auth</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">providers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">gcp-wif</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> gcp/workload</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">identity</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">federation</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">project_number</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"123456789012"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">workload_identity_pool_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> github</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">pool</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">workload_identity_provider_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> github</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">provider</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">service_account_email</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ci</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">sa@my</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">project.iam.gserviceaccount.com</span><br></span></code></pre></div></div>
<p>In GitHub Actions, Atmos automatically detects <code>ACTIONS_ID_TOKEN_REQUEST_URL</code>, constructs the correct WIF audience, and fetches the OIDC token — no manual <code>token_source</code>, <code>url</code>, or <code>audience</code> configuration required. Just ensure your workflow has <code>id-token: write</code> permission.</p>
<p>Authenticate and verify:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos auth login </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--identity</span><span class="token plain"> terraform</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos auth </span><span class="token function" style="color:rgb(130, 170, 255)">whoami</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/gcp-authentication-support#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Feedback and testing reports are welcome. If you use GCP in CI/CD, try the WIF provider and share any edge cases you encounter.</p>]]></content>
        <author>
            <name>Mikhail Shirkov</name>
            <uri>https://github.com/shirkevich</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Auth Realm Isolation for Multi-Repository Workflows]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-realm-isolation</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-realm-isolation"/>
        <updated>2026-02-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos now supports credential realm isolation, preventing collisions when engineers]]></summary>
        <content type="html"><![CDATA[<p>Atmos now supports credential realm isolation, preventing collisions when engineers
work with multiple customer repositories using identical identity names.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-problem">The Problem<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-realm-isolation#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>When working with multiple repositories that use the same identity names (like <code>core-root/terraform</code>),
credentials from one repository could leak into another. This was especially problematic for
consultants and engineers managing infrastructure across multiple customer environments.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-realm-isolation#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Credentials are now stored in realm-scoped paths and keyring keys:</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain"># Before</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">~/.config/atmos/aws/{provider}/credentials</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Keyring: {identity}</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"># After</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">~/.config/atmos/{realm}/aws/{provider}/credentials</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Keyring: atmos:{realm}:{identity}</span><br></span></code></pre></div></div>
<p>The realm is computed automatically based on your project location, ensuring each
repository has isolated credentials.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="realm-computation">Realm Computation<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-realm-isolation#realm-computation" class="hash-link" aria-label="Direct link to Realm Computation" title="Direct link to Realm Computation" translate="no">​</a></h2>
<p>Realms are determined by priority:</p>
<ol>
<li class=""><strong>Environment variable</strong>: <code>ATMOS_AUTH_REALM</code> - explicit override</li>
<li class=""><strong>Config file</strong>: <code>auth.realm</code> in atmos.yaml - per-project setting</li>
<li class=""><strong>Auto-generated</strong>: SHA256 hash of the atmos.yaml path (first 8 characters)</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="viewing-your-realm">Viewing Your Realm<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-realm-isolation#viewing-your-realm" class="hash-link" aria-label="Direct link to Viewing Your Realm" title="Direct link to Viewing Your Realm" translate="no">​</a></h2>
<p>The <code>atmos auth whoami</code> and <code>atmos auth login</code> commands now display the active realm:</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos auth login --identity my-identity</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Realm     a1b2c3d4 (auto)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Provider  aws-sso</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Identity  my-identity</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Region    us-east-1</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="new-logout-options">New Logout Options<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-realm-isolation#new-logout-options" class="hash-link" aria-label="Direct link to New Logout Options" title="Direct link to New Logout Options" translate="no">​</a></h2>
<p>A new <code>--all-realms</code> flag allows logging out from all realms across all repositories:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Logout from current realm only</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos auth </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">logout</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--all</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Logout from ALL realms (all repositories)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos auth </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">logout</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--all</span><span class="token plain"> --all-realms</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="breaking-change">Breaking Change<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-realm-isolation#breaking-change" class="hash-link" aria-label="Direct link to Breaking Change" title="Direct link to Breaking Change" translate="no">​</a></h2>
<p>This is a <strong>breaking change</strong>. Existing credentials will not be found after updating
because they were stored in the old path format.</p>
<p><strong>Action required</strong>: Run <code>atmos auth login</code> after updating to re-authenticate.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/auth-realm-isolation#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Found an issue or have a feature request?
<a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">Open an issue on GitHub</a>.</p>]]></content>
        <author>
            <name>Ben Smith</name>
            <uri>https://github.com/Benbentwo</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="Breaking Change" term="Breaking Change"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Workflow Environment Variables]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/workflow-environment-variables</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/workflow-environment-variables"/>
        <updated>2026-02-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Workflows now support environment variables at both workflow and step levels with hierarchical merging.]]></summary>
        <content type="html"><![CDATA[<p>Workflows now support environment variables at both workflow and step levels with hierarchical merging.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/workflow-environment-variables#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>You can now define environment variables in workflow YAML files at two levels:</p>
<ul>
<li class=""><strong>Workflow-level</strong>: Applied to all steps in the workflow</li>
<li class=""><strong>Step-level</strong>: Applied to a specific step, overriding workflow-level variables with the same key</li>
</ul>
<p>Environment variables are merged hierarchically, with step-level values taking precedence over workflow-level values for the same keys.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="example">Example<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/workflow-environment-variables#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">workflows</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">deploy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">description</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Deploy with custom environment</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">env</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">FOO</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> bar</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">BAZ</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">value</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> echo "$FOO </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> $BAZ"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> shell</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">env</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">BAZ</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">value</span><br></span></code></pre></div></div>
<p>Running this workflow outputs <code>bar - step-value</code> because:</p>
<ul>
<li class=""><code>FOO</code> is inherited from the workflow level (<code>bar</code>)</li>
<li class=""><code>BAZ</code> is overridden by the step level (<code>step-value</code>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/workflow-environment-variables#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>This feature enables several use cases:</p>
<ul>
<li class=""><strong>Consistent environment setup</strong>: Define common variables once at the workflow level</li>
<li class=""><strong>Step-specific overrides</strong>: Override variables for specific steps without duplicating configuration</li>
<li class=""><strong>Integration with external tools</strong>: Pass environment variables to shell commands and Terraform</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="environment-variable-precedence">Environment Variable Precedence<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/workflow-environment-variables#environment-variable-precedence" class="hash-link" aria-label="Direct link to Environment Variable Precedence" title="Direct link to Environment Variable Precedence" translate="no">​</a></h2>
<p>The full precedence order (lowest to highest priority):</p>
<ol>
<li class="">System environment variables</li>
<li class="">Global env from <code>atmos.yaml</code></li>
<li class="">Workflow-level <code>env</code></li>
<li class="">Step-level <code>env</code></li>
<li class="">Auth identity env vars (if <code>identity</code> is specified)</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/workflow-environment-variables#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Have questions or feedback? Join us on <a href="https://cloudposse.com/slack" target="_blank" rel="noopener noreferrer" class="">Slack</a> or open an issue on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content>
        <author>
            <name>Ben Smith</name>
            <uri>https://github.com/Benbentwo</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Ansible Component Support]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ansible-component-support</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ansible-component-support"/>
        <updated>2026-01-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos now supports Ansible as a first-class component type, enabling unified orchestration of infrastructure provisioning (Terraform) and configuration management (Ansible) from the same stack manifests.]]></summary>
        <content type="html"><![CDATA[<p>Atmos now supports Ansible as a first-class component type, enabling unified orchestration of infrastructure provisioning (Terraform) and configuration management (Ansible) from the same stack manifests.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ansible-component-support#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Ansible joins Terraform, Helmfile, and Packer as a native component type in Atmos:</p>
<ul>
<li class=""><strong>New <code>atmos ansible playbook</code> command</strong> executes Ansible playbooks with stack-based configuration</li>
<li class=""><strong>New <code>atmos ansible version</code> command</strong> displays Ansible version information</li>
<li class=""><strong>Full-stack processor support</strong> including inheritance, vars, env, settings, and auth sections</li>
<li class=""><strong>Automatic variable file generation</strong> passed to Ansible via <code>--extra-vars @&lt;varfile&gt;</code></li>
<li class=""><strong>Native flag passthrough</strong> via <code>--</code> separator for any Ansible option</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ansible-component-support#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Infrastructure automation typically involves two layers: provisioning (creating resources) and configuration (setting up software). Teams often use Terraform for the first and Ansible for the second, but manage them with separate tooling and workflows.</p>
<p>With Ansible component support, you can:</p>
<ul>
<li class=""><strong>Manage both layers from one tool</strong> with consistent patterns</li>
<li class=""><strong>Share variables between Terraform and Ansible</strong> components in the same stack</li>
<li class=""><strong>Apply the same inheritance model</strong> to Ansible playbooks</li>
<li class=""><strong>Use familiar Atmos workflows</strong> for configuration management</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ansible-component-support#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="configuration">Configuration<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ansible-component-support#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no">​</a></h3>
<p>Add Ansible configuration to <code>atmos.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">ansible</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">base_path</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"components/ansible"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"ansible-playbook"</span><span class="token plain">      </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># optional</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="stack-manifest">Stack Manifest<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ansible-component-support#stack-manifest" class="hash-link" aria-label="Direct link to Stack Manifest" title="Direct link to Stack Manifest" translate="no">​</a></h3>
<p>Define Ansible components alongside Terraform:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">vpc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">cidr_block</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"10.0.0.0/16"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">ansible</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">webserver</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">app_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> myapp</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">app_port</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">settings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">ansible</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">playbook</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> site.yml</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">inventory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> inventory/production</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="commands">Commands<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ansible-component-support#commands" class="hash-link" aria-label="Direct link to Commands" title="Direct link to Commands" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Show Ansible version</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos ansible version</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Run playbook with stack settings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos ansible playbook webserver </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> prod</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Override playbook and inventory</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos ansible playbook webserver </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> prod </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-p</span><span class="token plain"> deploy.yml </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-i</span><span class="token plain"> hosts.ini</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Pass native Ansible flags</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos ansible playbook webserver </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> prod -- </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--check</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--verbose</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Use aliases</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos an pb webserver </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> prod</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/ansible-component-support#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<ul>
<li class="">Report issues or request features on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a></li>
<li class="">Join the discussion in <a href="https://slack.cloudposse.com/" target="_blank" rel="noopener noreferrer" class="">Slack</a></li>
</ul>]]></content>
        <author>
            <name>Michael Rosenfeld</name>
            <uri>https://github.com/rosesecurity</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Artifactory Store Fix and Documentation Corrections]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/artifactory-store-fix</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/artifactory-store-fix"/>
        <updated>2026-01-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fixed an issue where retrieving values from Artifactory stores would fail when using nested paths, and corrected store documentation to accurately reflect supported backends.]]></summary>
        <content type="html"><![CDATA[<p>Fixed an issue where retrieving values from Artifactory stores would fail when using nested paths, and corrected store documentation to accurately reflect supported backends.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/artifactory-store-fix#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="artifactory-store-fix">Artifactory Store Fix<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/artifactory-store-fix#artifactory-store-fix" class="hash-link" aria-label="Direct link to Artifactory Store Fix" title="Direct link to Artifactory Store Fix" translate="no">​</a></h3>
<p>When using Artifactory as a store backend with nested directory structures, retrieving values would fail with a "file not found" error even though the data existed. This happened because files were being downloaded to unexpected locations within temporary directories.</p>
<p>For example, storing a value at <code>dev/myapp/private_ip</code> and then trying to retrieve it would fail because Atmos was looking for the file in the wrong place.</p>
<p>This is now fixed. Retrieving values from Artifactory works correctly regardless of how deeply nested your paths are.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="documentation-corrections">Documentation Corrections<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/artifactory-store-fix#documentation-corrections" class="hash-link" aria-label="Direct link to Documentation Corrections" title="Direct link to Documentation Corrections" translate="no">​</a></h3>
<p>The store documentation had several issues that could cause confusion:</p>
<ul>
<li class=""><strong>Wrong field names</strong>: Examples showed <code>backend</code> and <code>config</code> instead of the correct <code>type</code> and <code>options</code></li>
<li class=""><strong>Wrong store type names</strong>: Examples showed <code>aws/ssm</code> instead of the correct <code>aws-ssm-parameter-store</code></li>
<li class=""><strong>Non-existent backends</strong>: Vault and AWS Secrets Manager were documented but aren't actually implemented</li>
<li class=""><strong>Missing backends</strong>: Azure Key Vault and Google Secret Manager were implemented but not documented</li>
<li class=""><strong>Artifactory setup</strong>: Added guidance on using Generic repository type in JFrog Artifactory</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/artifactory-store-fix#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>If you've been struggling to get Artifactory working as a store backend, especially with nested paths, this fix should resolve those issues. And if you've been confused by store configuration examples that didn't work, the documentation now reflects the actual supported backends and correct configuration format.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/artifactory-store-fix#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Have questions or feedback? Join us on <a href="https://slack.cloudposse.com/" target="_blank" rel="noopener noreferrer" class="">Slack</a> or open an issue on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Bug Fix" term="Bug Fix"/>
        <category label="Documentation" term="Documentation"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Version-Aware JIT Source Provisioning with TTL]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/version-aware-jit-provisioning</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/version-aware-jit-provisioning"/>
        <updated>2026-01-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos now supports intelligent version-aware JIT (Just-In-Time) source provisioning with automatic re-provisioning on version changes and TTL-based cleanup for stale workdirs.]]></summary>
        <content type="html"><![CDATA[<p>Atmos now supports intelligent version-aware JIT (Just-In-Time) source provisioning with automatic re-provisioning on version changes and TTL-based cleanup for stale workdirs.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/version-aware-jit-provisioning#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>The workdir provisioning system has been enhanced with version tracking and intelligent re-provisioning:</p>
<ul>
<li class=""><strong>Version-aware re-provisioning</strong> - When a remote source version changes in your configuration, Atmos automatically re-provisions the workdir with the new version</li>
<li class=""><strong>URI change detection</strong> - Changing the source URI triggers re-provisioning to ensure you always have the correct source</li>
<li class=""><strong>Incremental local sync</strong> - Local component changes are synced using per-file checksums, copying only modified files</li>
<li class=""><strong>TTL-based cleanup</strong> - Stale workdirs can be cleaned up automatically based on last-accessed time</li>
<li class=""><strong>Enhanced metadata</strong> - Workdirs now track <code>source_uri</code>, <code>source_version</code>, and <code>last_accessed</code> timestamps</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/version-aware-jit-provisioning#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Previously, if you updated a component's source version in your stack configuration, you had to manually clean the workdir before the change would take effect. Now Atmos handles this automatically:</p>
<ul>
<li class=""><strong>Seamless version upgrades</strong> - Change <code>version: "0.24.0"</code> to <code>version: "0.25.0"</code> and run <code>terraform plan</code> - Atmos detects the mismatch and re-provisions automatically</li>
<li class=""><strong>Reduced disk usage</strong> - The <code>--expired</code> cleanup option removes workdirs that haven't been accessed within a configurable TTL</li>
<li class=""><strong>Faster local iteration</strong> - Only modified files are synced to workdirs, making local development faster</li>
<li class=""><strong>Full visibility</strong> - The <code>workdir list</code> and <code>workdir show</code> commands now display version and access information</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/version-aware-jit-provisioning#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="version-aware-provisioning">Version-Aware Provisioning<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/version-aware-jit-provisioning#version-aware-provisioning" class="hash-link" aria-label="Direct link to Version-Aware Provisioning" title="Direct link to Version-Aware Provisioning" translate="no">​</a></h3>
<p>Configure a component with a source version:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">vpc</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">uri</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"github.com/cloudposse/terraform-aws-vpc//src"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"0.25.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">provision</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">workdir</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><br></span></code></pre></div></div>
<p>When you change the version, Atmos automatically re-provisions:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">$ atmos terraform plan vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Output: "Source version changed (0.24.0 → 0.25.0)"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Workdir is re-provisioned with the new version</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="ttl-based-cleanup">TTL-Based Cleanup<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/version-aware-jit-provisioning#ttl-based-cleanup" class="hash-link" aria-label="Direct link to TTL-Based Cleanup" title="Direct link to TTL-Based Cleanup" translate="no">​</a></h3>
<p>Clean workdirs that haven't been accessed in a week:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">$ atmos terraform workdir clean </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--expired</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ttl</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">7d</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Cleaning expired workdirs </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">TTL: 7d</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ✓ Removed dev-nginx </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">last accessed </span><span class="token number" style="color:rgb(247, 140, 108)">14</span><span class="token plain"> days ago</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  ✓ Removed staging-api </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">last accessed </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token plain"> days ago</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Cleaned </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"> expired workdirs</span><br></span></code></pre></div></div>
<p>Preview what would be cleaned with dry-run:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">$ atmos terraform workdir clean </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--expired</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ttl</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">7d --dry-run</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">Dry run: would clean </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"> expired workdir</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">TTL: 7d</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain">:</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  - dev-nginx </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">last accessed 14d 2h</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  - staging-api </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">last accessed 10d 5h</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="enhanced-workdir-information">Enhanced Workdir Information<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/version-aware-jit-provisioning#enhanced-workdir-information" class="hash-link" aria-label="Direct link to Enhanced Workdir Information" title="Direct link to Enhanced Workdir Information" translate="no">​</a></h3>
<p>View detailed workdir information:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">$ atmos terraform workdir show vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">✓ Workdir Status</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Name            dev-vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Component       vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Stack           dev</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Source Type     remote</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Source URI      github.com/cloudposse/terraform-aws-vpc//src</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Source Version  </span><span class="token number" style="color:rgb(247, 140, 108)">0.25</span><span class="token plain">.0</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Path            .workdir/terraform/dev-vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Created         </span><span class="token number" style="color:rgb(247, 140, 108)">2026</span><span class="token plain">-01-20 </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token plain">:00:00 UTC</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Updated         </span><span class="token number" style="color:rgb(247, 140, 108)">2026</span><span class="token plain">-01-22 </span><span class="token number" style="color:rgb(247, 140, 108)">14</span><span class="token plain">:30:00 UTC</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Last Accessed   </span><span class="token number" style="color:rgb(247, 140, 108)">2026</span><span class="token plain">-01-22 </span><span class="token number" style="color:rgb(247, 140, 108)">14</span><span class="token plain">:30:00 UTC</span><br></span></code></pre></div></div>
<p>List workdirs with version and access information:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">$ atmos terraform workdir list</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">COMPONENT   STACK   TYPE     VERSION   LAST_ACCESSED        </span><span class="token environment constant" style="color:rgb(130, 170, 255)">PATH</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">vpc         dev     remote   </span><span class="token number" style="color:rgb(247, 140, 108)">0.25</span><span class="token plain">.0    </span><span class="token number" style="color:rgb(247, 140, 108)">2026</span><span class="token plain">-01-22 </span><span class="token number" style="color:rgb(247, 140, 108)">14</span><span class="token plain">:30     .workdir/terraform/dev-vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">my-local    dev     </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">local</span><span class="token plain">    -         </span><span class="token number" style="color:rgb(247, 140, 108)">2026</span><span class="token plain">-01-22 </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token plain">:15     .workdir/terraform/dev-my-local</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="ttl-format">TTL Format<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/version-aware-jit-provisioning#ttl-format" class="hash-link" aria-label="Direct link to TTL Format" title="Direct link to TTL Format" translate="no">​</a></h2>
<p>The <code>--ttl</code> flag supports various duration formats:</p>
<ul>
<li class=""><strong>Time units</strong>: <code>30m</code>, <code>2h</code>, <code>7d</code> (minutes, hours, days)</li>
<li class=""><strong>Keywords</strong>: <code>hourly</code>, <code>daily</code>, <code>weekly</code>, <code>monthly</code></li>
<li class=""><strong>Seconds</strong>: <code>3600</code> (plain integers are interpreted as seconds)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/version-aware-jit-provisioning#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Have feedback on the version-aware provisioning feature? Open an issue on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a> or join the discussion in our <a href="https://slack.cloudposse.com/" target="_blank" rel="noopener noreferrer" class="">Slack community</a>.</p>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fixed: Describe Affected Now Detects Component File Changes]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-component-detection</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-component-detection"/>
        <updated>2026-01-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos now correctly detects component file changes when running atmos describe affected.]]></summary>
        <content type="html"><![CDATA[<p>Atmos now correctly detects component file changes when running <code>atmos describe affected</code>.
A regression introduced in v1.195.0 caused changes to Terraform, Helmfile, or Packer component files to not be detected when <code>atmos.yaml</code> was located in a subdirectory of the git repository (e.g., when using <code>atmos -C path/to/project</code>).</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-problem">The Problem<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-component-detection#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>When using <code>atmos describe affected</code> to identify components impacted by code changes, the command was only detecting stack configuration changes but missing actual component file changes. For example, modifying a <code>main.tf</code> file inside a Terraform component folder would not mark that component as affected.</p>
<p>This issue occurred because git diff returns file paths relative to the git repository root, while the path resolution was using the current working directory. This caused path mismatches in the following scenarios:</p>
<ul>
<li class=""><strong>Using <code>-C</code> flag</strong>: Running <code>atmos -C path/to/project describe affected</code> from a parent directory</li>
<li class=""><strong>Subdirectory projects</strong>: When <code>atmos.yaml</code> is located in a subdirectory of the git repository</li>
<li class=""><strong>Monorepo setups</strong>: When multiple Atmos projects share a single git repository</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-fix">The Fix<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-component-detection#the-fix" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix" translate="no">​</a></h2>
<p>We updated the changed files indexing logic to properly resolve relative paths against the git repository root instead of the current working directory. The fix ensures that:</p>
<ul>
<li class="">Relative paths from git diff are correctly resolved against the git repo root</li>
<li class="">Component folder changes are detected regardless of where Atmos is executed from</li>
<li class="">Individual file changes within component directories are properly tracked</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="example">Example<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-component-detection#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h2>
<p>Now when you modify component files, <code>atmos describe affected</code> correctly identifies them:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Modify a component file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"# comment"</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;&gt;</span><span class="token plain"> components/terraform/vpc/main.tf</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Run describe affected</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos describe affected </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ref</span><span class="token plain"> refs/heads/main</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Output now includes the vpc component</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token string" style="color:rgb(173, 219, 103)">"component"</span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"vpc"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token string" style="color:rgb(173, 219, 103)">"stack"</span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"plat-ue2-dev"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token string" style="color:rgb(173, 219, 103)">"affected"</span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"component"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="usage">Usage<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-component-detection#usage" class="hash-link" aria-label="Direct link to Usage" title="Direct link to Usage" translate="no">​</a></h2>
<p>Upgrade to the latest version of Atmos and run:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos describe affected </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ref</span><span class="token plain"> refs/heads/main</span><br></span></code></pre></div></div>
<p>The command now correctly detects:</p>
<ul>
<li class="">Changes to component folders (Terraform, Helmfile, Packer)</li>
<li class="">Changes to individual files within components</li>
<li class="">Stack configuration changes (as before)</li>
<li class="">Vendored components configured with <code>source</code> (even without an explicit <code>component</code> field)</li>
</ul>
<p>This fix ensures your CI/CD pipelines accurately identify which components need to be deployed based on actual code changes.</p>]]></content>
        <author>
            <name>Andriy Knysh</name>
            <uri>https://github.com/aknysh</uri>
        </author>
        <category label="Bug Fix" term="Bug Fix"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fixed: Describe Affected Now Detects Vendored Component Changes]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-source-vendoring</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-source-vendoring"/>
        <updated>2026-01-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos now correctly detects file changes in components that use the source attribute for just-in-time vendoring. Previously, components vendored from remote sources were not properly tracked for affected detection.]]></summary>
        <content type="html"><![CDATA[<p>Atmos now correctly detects file changes in components that use the <code>source</code> attribute for <a href="https://atmos.tools/cli/commands/terraform/source/" target="_blank" rel="noopener noreferrer" class="">just-in-time vendoring</a>. Previously, components vendored from remote sources were not properly tracked for affected detection.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-problem">The Problem<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-source-vendoring#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>When using <a href="https://atmos.tools/vendor/" target="_blank" rel="noopener noreferrer" class="">Atmos vendoring</a> with the <code>source</code> attribute to pull components from remote repositories, the <code>atmos describe affected</code> command was not detecting changes to those component files. This occurred because the affected detection logic required an explicit <code>component</code> field to determine which folder to monitor for changes.</p>
<p>Components configured like this were not being tracked:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">vpc-remote</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">uri</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"github.com/cloudposse/terraform-aws-vpc//."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"4.0.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">enabled</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-fix">The Fix<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-source-vendoring#the-fix" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix" translate="no">​</a></h2>
<p>The affected detection now defaults to using the component name (the YAML key, e.g., <code>vpc-remote</code>) as the component folder path when no explicit <code>component</code> field is specified. This ensures that:</p>
<ul>
<li class="">Components using <a href="https://atmos.tools/vendor/config/sources/" target="_blank" rel="noopener noreferrer" class=""><code>source</code></a> for vendoring are properly tracked</li>
<li class="">Components without explicit <code>component</code> field inheritance are detected</li>
<li class="">All component types (Terraform, Helmfile, Packer) benefit from this fix</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-about-workdir">What About Workdir?<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-source-vendoring#what-about-workdir" class="hash-link" aria-label="Direct link to What About Workdir?" title="Direct link to What About Workdir?" translate="no">​</a></h2>
<p>If you use <a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/terraform/workdir"><code>provision.workdir</code></a> with your vendored components, the detection still works correctly. The <code>describe affected</code> command tracks changes in the <strong>source</strong> files (<code>components/terraform/&lt;component&gt;/</code>), not the runtime workdir (<code>.workdir/</code>). Since <code>.workdir/</code> is in <code>.gitignore</code> and created at runtime, it doesn't affect change detection.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="example">Example<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-source-vendoring#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h2>
<p>Now when you modify vendored component files, <code>atmos describe affected</code> correctly identifies them:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Stack configuration with source vendoring</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">vpc-production</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">uri</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"github.com/cloudposse/terraform-aws-vpc//."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"4.0.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">included_paths</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"**/*.tf"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"production"</span><br></span></code></pre></div></div>
<p>After running <a href="https://atmos.tools/cli/commands/vendor/pull/" target="_blank" rel="noopener noreferrer" class=""><code>atmos vendor pull</code></a> and making changes:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Modify a vendored component file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"# update"</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;&gt;</span><span class="token plain"> components/terraform/vpc-production/main.tf</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Run describe affected</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos describe affected </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--ref</span><span class="token plain"> refs/heads/main</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Output now includes the vpc-production component</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token string" style="color:rgb(173, 219, 103)">"component"</span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"vpc-production"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token string" style="color:rgb(173, 219, 103)">"stack"</span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"prod-us-east-1"</span><span class="token plain">,</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token string" style="color:rgb(173, 219, 103)">"affected"</span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"component"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="related-documentation">Related Documentation<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/describe-affected-source-vendoring#related-documentation" class="hash-link" aria-label="Direct link to Related Documentation" title="Direct link to Related Documentation" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://atmos.tools/vendor/" target="_blank" rel="noopener noreferrer" class="">Vendoring Overview</a> - Learn about Atmos vendoring capabilities</li>
<li class=""><a href="https://atmos.tools/vendor/config/sources/" target="_blank" rel="noopener noreferrer" class="">Source Configuration</a> - Configure source URIs and protocols</li>
<li class=""><a href="https://atmos.tools/cli/commands/terraform/source/" target="_blank" rel="noopener noreferrer" class="">Just-in-Time Vendoring</a> - Inline source declarations</li>
<li class=""><a href="https://atmos.tools/cli/commands/vendor/pull/" target="_blank" rel="noopener noreferrer" class="">Vendor Pull Command</a> - Download vendored components</li>
</ul>]]></content>
        <author>
            <name>Andriy Knysh</name>
            <uri>https://github.com/aknysh</uri>
        </author>
        <category label="Bug Fix" term="Bug Fix"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[YAML Functions in Locals]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-yaml-functions</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-yaml-functions"/>
        <updated>2026-01-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Locals now support YAML functions like !env, !exec, !store, !terraform.state, and !terraform.output.]]></summary>
        <content type="html"><![CDATA[<p>Locals now support YAML functions like <code>!env</code>, <code>!exec</code>, <code>!store</code>, <code>!terraform.state</code>, and <code>!terraform.output</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-feature">The Feature<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-yaml-functions#the-feature" class="hash-link" aria-label="Direct link to The Feature" title="Direct link to The Feature" translate="no">​</a></h2>
<p>Locals can now use all Atmos YAML functions to fetch dynamic values:</p>
<ul>
<li class=""><code>!env</code> - Environment variables</li>
<li class=""><code>!exec</code> - Command execution</li>
<li class=""><code>!store</code> - Store lookups</li>
<li class=""><code>!terraform.state</code> - Terraform state queries</li>
<li class=""><code>!terraform.output</code> - Terraform outputs from other components</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="example-with-environment-variables">Example with Environment Variables<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-yaml-functions#example-with-environment-variables" class="hash-link" aria-label="Direct link to Example with Environment Variables" title="Direct link to Example with Environment Variables" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">locals</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">api_endpoint</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!env</span><span class="token plain"> API_ENDPOINT</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">api_url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"https://{{ .locals.api_endpoint }}/api/v1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">myapp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">api_url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"{{ .locals.api_url }}"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="example-with-terraform-state">Example with Terraform State<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-yaml-functions#example-with-terraform-state" class="hash-link" aria-label="Direct link to Example with Terraform State" title="Direct link to Example with Terraform State" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">locals</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Fetch from another component's terraform state</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">vpc_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!terraform.state</span><span class="token plain"> vpc .vpc_id</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">subnet_ids</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!terraform.state</span><span class="token plain"> vpc .private_subnet_ids</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">eks</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">vpc_id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"{{ .locals.vpc_id }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">subnet_ids</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"{{ .locals.subnet_ids }}"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="example-with-store">Example with Store<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-yaml-functions#example-with-store" class="hash-link" aria-label="Direct link to Example with Store" title="Direct link to Example with Store" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">locals</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">db_password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(127, 219, 202)">!store</span><span class="token plain"> secrets/database .password</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">connection_string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"postgresql://app:{{ .locals.db_password }}@db.example.com/mydb"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">backend</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">database_url</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"{{ .locals.connection_string }}"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-it-works">How It Works<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-yaml-functions#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<ol>
<li class="">YAML functions in locals are processed during stack configuration loading</li>
<li class="">The resolved values are available to other locals and component vars</li>
<li class="">Locals can combine YAML function results with Go templates</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="use-cases">Use Cases<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-yaml-functions#use-cases" class="hash-link" aria-label="Direct link to Use Cases" title="Direct link to Use Cases" translate="no">​</a></h2>
<ul>
<li class=""><strong>Environment-specific configuration</strong>: Use <code>!env</code> to inject environment-specific values</li>
<li class=""><strong>Cross-component references</strong>: Use <code>!terraform.state</code> to reference outputs from other components</li>
<li class=""><strong>Secret management</strong>: Use <code>!store</code> to fetch secrets from your configured store</li>
<li class=""><strong>Dynamic values</strong>: Use <code>!exec</code> to run commands and capture output</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="upgrade">Upgrade<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-yaml-functions#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<p>Upgrade Atmos to get this feature. Existing locals configurations continue to work unchanged.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="references">References<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-yaml-functions#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/stacks/locals">Locals Documentation</a></li>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/functions/yaml">YAML Functions Documentation</a></li>
</ul>]]></content>
        <author>
            <name>Andriy Knysh</name>
            <uri>https://github.com/aknysh</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Locals Context Access]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-context-access</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-context-access"/>
        <updated>2026-01-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Locals can access {{ .settings }}, {{ .vars }}, and {{ .env }} from the same file during template resolution.]]></summary>
        <content type="html"><![CDATA[<p>Locals can access <code>{{ .settings }}</code>, <code>{{ .vars }}</code>, and <code>{{ .env }}</code> from the same file during template resolution.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="the-enhancement">The Enhancement<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-context-access#the-enhancement" class="hash-link" aria-label="Direct link to The Enhancement" title="Direct link to The Enhancement" translate="no">​</a></h2>
<p>Previously, locals could only reference other locals via <code>{{ .locals.* }}</code>. Now they can also access:</p>
<ul>
<li class=""><code>{{ .settings.* }}</code> - Settings defined in the same file</li>
<li class=""><code>{{ .vars.* }}</code> - Vars defined in the same file</li>
<li class=""><code>{{ .env.* }}</code> - Environment variables</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="example">Example<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-context-access#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">settings</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">locals</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> acme</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">label</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"{{ .locals.namespace }}-{{ .vars.stage }}-{{ .settings.version }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">components</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">myapp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">vars</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">"{{ .locals.label }}"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="file-scoped-context">File-Scoped Context<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-context-access#file-scoped-context" class="hash-link" aria-label="Direct link to File-Scoped Context" title="Direct link to File-Scoped Context" translate="no">​</a></h2>
<p>The context available to locals comes from <strong>the same file only</strong>. Locals cannot access settings or vars from imported files.</p>
<p>If you need values from imported files, use <code>vars</code> or <code>settings</code> (which inherit across imports).</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="upgrade">Upgrade<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-context-access#upgrade" class="hash-link" aria-label="Direct link to Upgrade" title="Direct link to Upgrade" translate="no">​</a></h2>
<p>Upgrade Atmos to get this enhancement. Existing locals configurations will continue to work.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="references">References<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/locals-context-access#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/stacks/locals">Locals Documentation</a></li>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/design-patterns/configuration-composition/locals">DRY Configuration with Locals</a></li>
</ul>]]></content>
        <author>
            <name>Andriy Knysh</name>
            <uri>https://github.com/aknysh</uri>
        </author>
        <category label="Enhancement" term="Enhancement"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[List Components with Source Configuration]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-list-command</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-list-command"/>
        <updated>2026-01-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos now includes a source list command to display components with source configuration. Both --stack and [component] arguments are optional, allowing flexible filtering across your infrastructure.]]></summary>
        <content type="html"><![CDATA[<p>Atmos now includes a <code>source list</code> command to display components with source configuration. Both <code>--stack</code> and <code>[component]</code> arguments are optional, allowing flexible filtering across your infrastructure.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-list-command#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Two new commands are available with flexible filtering:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># List all terraform sources across all stacks</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">source</span><span class="token plain"> list</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># List terraform sources in a specific stack</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">source</span><span class="token plain"> list </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># List sources for a specific component across all stacks</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">source</span><span class="token plain"> list vpc</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># List sources for a specific component in a specific stack</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform </span><span class="token builtin class-name" style="color:rgb(255, 203, 139)">source</span><span class="token plain"> list vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Unified view: list sources across all component types</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos list sources</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos list sources </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--stack</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos list sources vpc</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="dynamic-output-columns">Dynamic Output Columns<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-list-command#dynamic-output-columns" class="hash-link" aria-label="Direct link to Dynamic Output Columns" title="Direct link to Dynamic Output Columns" translate="no">​</a></h2>
<p>The output adapts to your query:</p>
<p><strong>Listing all stacks</strong> - Shows Stack column:</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">STACK        COMPONENT    URI                                                           VERSION</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">plat-dev     vpc          github.com/cloudposse/terraform-aws-components//modules/vpc   1.450.0</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">plat-prod    vpc          github.com/cloudposse/terraform-aws-components//modules/vpc   1.450.0</span><br></span></code></pre></div></div>
<p><strong>Filtering by --stack</strong> - Omits Stack column since it's redundant:</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">COMPONENT    URI                                                           VERSION</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">eks          github.com/cloudposse/terraform-aws-components//modules/eks   1.450.0</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">rds          github.com/cloudposse/terraform-aws-components//modules/rds   1.449.0</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">vpc          github.com/cloudposse/terraform-aws-components//modules/vpc   1.450.0</span><br></span></code></pre></div></div>
<p><strong>With derived components</strong> - Shows Folder column when component names differ from their base component:</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">COMPONENT        FOLDER    URI                                                           VERSION</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">vpc/production   vpc       github.com/cloudposse/terraform-aws-components//modules/vpc   1.450.0</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">vpc/staging      vpc       github.com/cloudposse/terraform-aws-components//modules/vpc   1.450.0</span><br></span></code></pre></div></div>
<p>The Folder column only appears when there's a difference to show, keeping output clean for simple cases.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="multi-type-listing">Multi-Type Listing<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-list-command#multi-type-listing" class="hash-link" aria-label="Direct link to Multi-Type Listing" title="Direct link to Multi-Type Listing" translate="no">​</a></h2>
<p>The <code>atmos list sources</code> command includes a Type column since it lists sources across all component types (terraform, helmfile, packer) in a unified view:</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">STACK        TYPE        COMPONENT    URI                                                           VERSION</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">plat-dev     helmfile    nginx        github.com/cloudposse/helmfile-components//charts/nginx       1.0.0</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">plat-dev     terraform   vpc          github.com/cloudposse/terraform-aws-components//modules/vpc   1.450.0</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">plat-prod    terraform   vpc          github.com/cloudposse/terraform-aws-components//modules/vpc   1.450.0</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-list-command#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>With the source provisioner, components can declare their source inline in stack configuration for just-in-time vendoring. The <code>source list</code> command helps you:</p>
<ul>
<li class=""><strong>Audit</strong> which components have source configured across your infrastructure</li>
<li class=""><strong>Compare</strong> versions across stacks (same component, different versions)</li>
<li class=""><strong>Debug</strong> source configuration issues</li>
<li class=""><strong>Discover</strong> vendorable components in unfamiliar stacks</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="output-formats">Output Formats<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-list-command#output-formats" class="hash-link" aria-label="Direct link to Output Formats" title="Direct link to Output Formats" translate="no">​</a></h2>
<p>Multiple output formats are supported for integration with other tools:</p>
<div class="language-bash codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-bash codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Table (default, human-readable)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos list sources </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token plain"> table</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># JSON (for scripting)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos list sources </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token plain"> json</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># YAML (for configuration)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos list sources </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token plain"> yaml</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># CSV (for spreadsheets)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos list sources </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token plain"> csv</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># TSV (for tab-separated pipelines)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos list sources </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token plain"> tsv</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="documentation">Documentation<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/source-list-command#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/terraform/source">Source Provisioner</a> - JIT vendoring overview</li>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/list/sources"><code>atmos list sources</code></a> - Unified view across all component types</li>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/terraform/source/list"><code>atmos terraform source list</code></a> - List Terraform sources</li>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/helmfile/source/list"><code>atmos helmfile source list</code></a> - List Helmfile sources</li>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/packer/source/list"><code>atmos packer source list</code></a> - List Packer sources</li>
</ul>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="DX" term="DX"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Native GitHub Actions Support for Atmos Toolchain]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-actions-toolchain-path</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-actions-toolchain-path"/>
        <updated>2026-01-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos toolchain now has native GitHub Actions support with the new github format for atmos toolchain env.]]></summary>
        <content type="html"><![CDATA[<p>Atmos toolchain now has native GitHub Actions support with the new <code>github</code> format for <code>atmos toolchain env</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-actions-toolchain-path#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>The <code>atmos toolchain env</code> command now supports a <code>github</code> format that outputs paths compatible with GitHub Actions' <code>$GITHUB_PATH</code> environment file. When running in GitHub Actions, it automatically detects and writes to <code>$GITHUB_PATH</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="new-features">New Features<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-actions-toolchain-path#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>--format github</code></strong>: Outputs one path per line, compatible with <code>$GITHUB_PATH</code></li>
<li class=""><strong><code>--output</code> flag</strong>: Append output to any file instead of stdout</li>
<li class=""><strong>Auto-detection</strong>: When <code>$GITHUB_PATH</code> is set, the <code>github</code> format automatically writes to it</li>
<li class=""><strong>Improved error messages</strong>: Helpful hints guide you when tools aren't installed</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="how-to-use-it">How to Use It<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-actions-toolchain-path#how-to-use-it" class="hash-link" aria-label="Direct link to How to Use It" title="Direct link to How to Use It" translate="no">​</a></h2>
<p>In your GitHub Actions workflow:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Install Atmos toolchain</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token scalar string" style="color:rgb(173, 219, 103)"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">    atmos toolchain install</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">    atmos toolchain env --format github</span><br></span></code></pre></div></div>
<p>The next step in your workflow will have access to all your toolchain binaries (OpenTofu, Terraform, Helmfile, etc.) in the PATH.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-actions-toolchain-path#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Previously, integrating Atmos toolchain with GitHub Actions required shell tricks:</p>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Before: Manual PATH manipulation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> echo "$(atmos toolchain path)" </span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"> $GITHUB_PATH</span><br></span></code></pre></div></div>
<p>Now it's a single, intuitive command that handles everything automatically.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-actions-toolchain-path#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Try out the new GitHub Actions integration and let us know what you think! File issues or feature requests on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Enhancement" term="Enhancement"/>
        <category label="DX" term="DX"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Smarter Component Selection in Interactive Prompts]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/component-selection-filtering</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/component-selection-filtering"/>
        <updated>2026-01-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Interactive component selection now filters out non-deployable components.]]></summary>
        <content type="html"><![CDATA[<p>Interactive component selection now filters out non-deployable components.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="what-changed">What Changed<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/component-selection-filtering#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>When using <code>atmos terraform plan -s stack-name</code> without specifying a component, the interactive
"Choose a component" menu now correctly filters the component list:</p>
<ul>
<li class=""><strong>Abstract components</strong> (<code>metadata.type: abstract</code>) are hidden - they're templates, not deployable</li>
<li class=""><strong>Disabled components</strong> (<code>metadata.enabled: false</code>) are hidden - they can't be deployed</li>
<li class=""><strong>Stack-scoped filtering</strong> - only components in the specified stack appear</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/component-selection-filtering#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Previously, users would see all components from all stacks, including abstract base components
that serve as templates. This was confusing and could lead to errors when selecting a component
that couldn't actually be deployed.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="shell-completion-too">Shell Completion Too<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/component-selection-filtering#shell-completion-too" class="hash-link" aria-label="Direct link to Shell Completion Too" title="Direct link to Shell Completion Too" translate="no">​</a></h2>
<p>Tab completion for component arguments also uses the same filtering logic, so you'll only see
valid, deployable components when completing <code>atmos terraform plan -s stack &lt;TAB&gt;</code>.</p>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Bug Fix" term="Bug Fix"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[GitHub Actions Output Format]]></title>
        <id>https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format</id>
        <link href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format"/>
        <updated>2026-01-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atmos now supports a dedicated github output format for atmos terraform output, making it easier than ever to pass Terraform outputs between GitHub Actions steps.]]></summary>
        <content type="html"><![CDATA[<p>Atmos now supports a dedicated <code>github</code> output format for <code>atmos terraform output</code>, making it easier than ever to pass Terraform outputs between GitHub Actions steps.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="whats-new">What's New<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h2>
<p>The new <code>--format=github</code> option for <code>atmos terraform output</code> automatically writes outputs to <code>$GITHUB_OUTPUT</code> in the format GitHub Actions expects, including proper handling of multiline values using heredoc syntax.</p>
<div class="language-shell codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-shell codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># In a GitHub Actions workflow</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform output vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> dev </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">github</span><br></span></code></pre></div></div>
<p>This writes outputs directly to <code>$GITHUB_OUTPUT</code>, making them available to subsequent workflow steps.</p>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="why-this-matters">Why This Matters<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>Previously, passing Terraform outputs between GitHub Actions steps required manual formatting or shell scripting to handle:</p>
<ul>
<li class="">Multiline values (JSON objects, lists, multi-line strings)</li>
<li class="">Special characters that need escaping</li>
<li class="">The correct <code>$GITHUB_OUTPUT</code> file format</li>
</ul>
<p>The <code>github</code> format handles all of this automatically:</p>
<ul>
<li class=""><strong>Single-line values</strong> are written as <code>key=value</code></li>
<li class=""><strong>Multiline values</strong> use heredoc syntax: <code>key&lt;&lt;DELIMITER\nvalue\nDELIMITER</code></li>
<li class=""><strong>Complex types</strong> (maps, arrays) are JSON-encoded for easy parsing</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="example-workflow">Example Workflow<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format#example-workflow" class="hash-link" aria-label="Direct link to Example Workflow" title="Direct link to Example Workflow" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-yaml codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token key atrule">deploy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Checkout</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> actions/checkout@v4</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Get Terraform Outputs</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">id</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> outputs</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos terraform output vpc </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">s dev </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">format=github</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Use Outputs</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">|</span><span class="token scalar string" style="color:rgb(173, 219, 103)"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">          echo "VPC ID: ${{ steps.outputs.outputs.vpc_id }}"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">          echo "Subnets: ${{ steps.outputs.outputs.private_subnet_ids }}"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="usage-options">Usage Options<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format#usage-options" class="hash-link" aria-label="Direct link to Usage Options" title="Direct link to Usage Options" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="automatic-github_output-detection">Automatic <code>$GITHUB_OUTPUT</code> Detection<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format#automatic-github_output-detection" class="hash-link" aria-label="Direct link to automatic-github_output-detection" title="Direct link to automatic-github_output-detection" translate="no">​</a></h3>
<p>When running in GitHub Actions, the format automatically writes to <code>$GITHUB_OUTPUT</code>:</p>
<div class="language-shell codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-shell codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform output vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> dev </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">github</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="custom-output-file">Custom Output File<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format#custom-output-file" class="hash-link" aria-label="Direct link to Custom Output File" title="Direct link to Custom Output File" translate="no">​</a></h3>
<p>You can specify a different output file if needed:</p>
<div class="language-shell codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-shell codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform output vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> dev </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">github --output-file</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">outputs.txt</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="combined-with-other-options">Combined with Other Options<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format#combined-with-other-options" class="hash-link" aria-label="Direct link to Combined with Other Options" title="Direct link to Combined with Other Options" translate="no">​</a></h3>
<p>The <code>github</code> format works with other output options:</p>
<div class="language-shell codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-shell codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Uppercase keys for conventional ENV_VAR naming</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform output vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> dev </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">github </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--uppercase</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Flatten nested maps</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform output vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> dev </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">github </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--flatten</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Skip init for faster execution in CI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform output vpc </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> dev </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">--format</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">github --skip-init</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="output-format-details">Output Format Details<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format#output-format-details" class="hash-link" aria-label="Direct link to Output Format Details" title="Direct link to Output Format Details" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="simple-values">Simple Values<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format#simple-values" class="hash-link" aria-label="Direct link to Simple Values" title="Direct link to Simple Values" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">vpc_id=vpc-12345</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">region=us-east-1</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">enabled=true</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SsMH" id="multiline-values-heredoc">Multiline Values (Heredoc)<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format#multiline-values-heredoc" class="hash-link" aria-label="Direct link to Multiline Values (Heredoc)" title="Direct link to Multiline Values (Heredoc)" translate="no">​</a></h3>
<p>For values containing newlines, the format uses GitHub's heredoc syntax:</p>
<div class="language-text codeBlockContainer_E9g6 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_vFnX"><pre tabindex="0" class="prism-code language-text codeBlock_wj5q thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_hX2B"><span class="token-line" style="color:#d6deeb"><span class="token plain">vpc_config&lt;&lt;ATMOS_EOF_vpc_config</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">{</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  "id": "vpc-12345",</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  "cidr": "10.0.0.0/16"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">}</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">ATMOS_EOF_vpc_config</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="documentation">Documentation<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<p>For complete documentation on terraform output formatting options, see:</p>
<ul>
<li class=""><a class="" href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/cli/commands/terraform/output">Terraform Output Command</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SsMH" id="get-involved">Get Involved<a href="https://pr-1899.atmos-docs.ue2.dev.plat.cloudposse.org/changelog/github-output-format#get-involved" class="hash-link" aria-label="Direct link to Get Involved" title="Direct link to Get Involved" translate="no">​</a></h2>
<p>Try out the new GitHub Actions output format and let us know what you think! File issues or feature requests on <a href="https://github.com/cloudposse/atmos/issues" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content>
        <author>
            <name>Erik Osterman</name>
            <uri>https://github.com/osterman</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="DX" term="DX"/>
    </entry>
</feed>