<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>The Cloud Posse Reference Architecture Blog</title>
        <link>https://docs.cloudposse.com/blog/</link>
        <description>The Cloud Posse Reference Architecture Blog</description>
        <lastBuildDate>Mon, 13 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Security Update: Hardening Pull Request Preview Workflows]]></title>
            <link>https://docs.cloudposse.com/blog/pr-preview-workflow-hardening/</link>
            <guid>https://docs.cloudposse.com/blog/pr-preview-workflow-hardening/</guid>
            <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We removed a pull_request_target-based preview workflow from our documentation repository after a responsible disclosure highlighting the risk of executing code influenced by an untrusted pull request in the base repository context.]]></description>
            <content:encoded><![CDATA[<div class="intro"><p>We removed a <code>pull_request_target</code>-based preview workflow from our documentation repository after a responsible disclosure from security researcher Aviv Donenfeld. This was the last remaining instance of this pattern in our GitHub organization. The issue was limited to pull request preview environments for this repository, there is no indication it was ever exploited, and the overall impact was minimal.</p></div>
<p>One of our long-standing best practices is requiring maintainer approval before running workflows triggered by pull requests. That eliminates an entire class of CI/CD attack vectors involving untrusted code execution.</p>
<p>It is easy to assume that protection applies universally, including to workflows triggered by <code>pull_request_target</code>. That assumption breaks down when those workflows execute code, scripts, or artifacts influenced by an untrusted pull request.</p>
<p>Workflows triggered by <code>pull_request_target</code> run in the context of the base repository. That is not inherently unsafe if all executed code comes strictly from a trusted and protected branch. The problem is when such workflows execute code influenced by an untrusted pull request, or publish pull request content into a trusted location or environment. In that case, they can bypass the assumptions many teams make about pull request approval gates and create an avoidable CI/CD exposure.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-we-changed">What we changed<a href="https://docs.cloudposse.com/blog/pr-preview-workflow-hardening/#what-we-changed" class="hash-link" aria-label="Direct link to What we changed" title="Direct link to What we changed" translate="no">​</a></h2>
<p>Following Aviv's report, we removed the affected pattern from this repository's pull request preview workflow.</p>
<p>This was the last remaining instance of this pattern in our GitHub organization. We had already phased it out elsewhere some time ago, and it has now been fully removed here as well.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scope-and-impact">Scope and impact<a href="https://docs.cloudposse.com/blog/pr-preview-workflow-hardening/#scope-and-impact" class="hash-link" aria-label="Direct link to Scope and impact" title="Direct link to Scope and impact" translate="no">​</a></h2>
<p>The issue was limited to preview environments for this documentation repository.</p>
<ul class="list-disc pl-8 my-4">
<li class="my-1">There is no indication the issue was ever exploited</li>
<li class="my-1">We do not believe this had broader production impact</li>
<li class="my-1">The overall severity was low, but the pattern itself was still worth eliminating</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-matters">Why this matters<a href="https://docs.cloudposse.com/blog/pr-preview-workflow-hardening/#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 is one of those edge cases that is easy to miss because the workflow may still look "approved" or "maintainer-controlled" at first glance. The security boundary is different for <code>pull_request_target</code>, and that difference matters when the workflow executes anything influenced by untrusted pull request content.</p>
<p>The practical takeaway is simple: <code>pull_request_target</code> can be a convenient choice for labeling pull requests. Beyond that, it should be used only when all executed code is strictly from a trusted and protected branch. Do not use it to execute code influenced by an untrusted pull request, or to publish pull request content into a trusted location or environment.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="guidance-for-customers-and-the-community">Guidance for customers and the community<a href="https://docs.cloudposse.com/blog/pr-preview-workflow-hardening/#guidance-for-customers-and-the-community" class="hash-link" aria-label="Direct link to Guidance for customers and the community" title="Direct link to Guidance for customers and the community" translate="no">​</a></h2>
<p>Because this repository is our documentation site, we are also using this as an opportunity to point customers and the community to the upstream guidance we recommend reviewing:</p>
<ul class="list-disc pl-8 my-4">
<li class="my-1"><a href="https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target" target="_blank" rel="noopener noreferrer" class="">GitHub Actions: <code>pull_request_target</code> event</a></li>
<li class="my-1"><a href="https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions" target="_blank" rel="noopener noreferrer" class="">GitHub Actions security hardening</a></li>
<li class="my-1"><a href="https://securitylab.github.com/research/github-actions-preventing-pwn-requests/" target="_blank" rel="noopener noreferrer" class="">GitHub Security Lab: Preventing pwn requests</a></li>
</ul>
<p>We appreciate researchers like Aviv who take the time to surface issues like this clearly and responsibly. In this case, the report was thorough, accurate, and directly actionable.</p>]]></content:encoded>
            <category>security</category>
            <category>github-actions</category>
            <category>ci-cd</category>
            <category>docs</category>
        </item>
        <item>
            <title><![CDATA[Modular AWS Account Components: A More Granular Approach to Organization Management]]></title>
            <link>https://docs.cloudposse.com/blog/new-account-components/</link>
            <guid>https://docs.cloudposse.com/blog/new-account-components/</guid>
            <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We've replaced the monolithic account and account-settings components with six modular, single-responsibility components that give you a more granular approach to managing your AWS Organization.]]></description>
            <content:encoded><![CDATA[<div class="intro"><p>We've replaced the monolithic <code>account</code> and <code>account-settings</code> components with six modular, single-responsibility components that give you a more granular approach to managing your AWS Organization.</p></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-changing">What's Changing<a href="https://docs.cloudposse.com/blog/new-account-components/#whats-changing" class="hash-link" aria-label="Direct link to What's Changing" title="Direct link to What's Changing" translate="no">​</a></h2>
<p>The old <code>account</code> component handled everything: the AWS Organization, organizational units, individual accounts, and service control policies — all in one. Similarly, <code>account-settings</code> bundled account configuration with budget management. We've broken these apart into focused components that each do one thing well.</p>
<table><thead><tr><th>Old Component</th><th>Old Version</th><th>New Components</th><th>New Version</th></tr></thead><tbody><tr><td><code>account</code></td><td>v1.538.0</td><td><code>aws-account</code></td><td>V2</td></tr><tr><td></td><td></td><td><code>aws-organization</code></td><td>v0</td></tr><tr><td></td><td></td><td><code>aws-organizational-unit</code></td><td>v0</td></tr><tr><td></td><td></td><td><code>aws-scp</code></td><td>v0/v1</td></tr><tr><td><code>account-settings</code></td><td>v1.535.5</td><td><code>aws-account-settings</code></td><td>V2</td></tr><tr><td></td><td></td><td><code>aws-budget</code></td><td>V1</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-modular-components">Why Modular Components<a href="https://docs.cloudposse.com/blog/new-account-components/#why-modular-components" class="hash-link" aria-label="Direct link to Why Modular Components" title="Direct link to Why Modular Components" translate="no">​</a></h2>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1"><strong>Single responsibility</strong> — Each component manages one concern. Update an SCP without touching your accounts. Adjust a budget without redeploying account settings.</li>
<li class="my-1"><strong>Independent versioning</strong> — Components evolve on their own release cadence. Upgrade <code>aws-scp</code> to a new version without waiting for or affecting <code>aws-account</code>.</li>
<li class="my-1"><strong>Smaller blast radius</strong> — A change to organizational units doesn't risk impacting account creation or service control policies.</li>
<li class="my-1"><strong>Easier brownfield adoption</strong> — Need just budget management? Vendor <code>aws-budget</code> alone. You don't have to adopt the entire suite.</li>
<li class="my-1"><strong>Instance-based deployment</strong> — Components like <code>aws-account</code> and <code>aws-organizational-unit</code> are deployed as instances (e.g., <code>aws-account/plat-dev</code>, <code>aws-organizational-unit/core</code>), making configuration explicit and auditable.</li>
</ol></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-new-components">The New Components<a href="https://docs.cloudposse.com/blog/new-account-components/#the-new-components" class="hash-link" aria-label="Direct link to The New Components" title="Direct link to The New Components" translate="no">​</a></h2>
<table><thead><tr><th>Component</th><th>Purpose</th></tr></thead><tbody><tr><td><a href="https://github.com/cloudposse-terraform-components/aws-organization" target="_blank" rel="noopener noreferrer" class=""><code>aws-organization</code></a></td><td>Manages the AWS Organization itself</td></tr><tr><td><a href="https://github.com/cloudposse-terraform-components/aws-organizational-unit" target="_blank" rel="noopener noreferrer" class=""><code>aws-organizational-unit</code></a></td><td>Manages individual OUs (deployed as instances like <code>aws-organizational-unit/core</code>, <code>aws-organizational-unit/plat</code>)</td></tr><tr><td><a href="https://github.com/cloudposse-terraform-components/aws-account" target="_blank" rel="noopener noreferrer" class=""><code>aws-account</code></a></td><td>Creates and manages individual AWS accounts (deployed as instances like <code>aws-account/plat-dev</code>, <code>aws-account/core-artifacts</code>)</td></tr><tr><td><a href="https://github.com/cloudposse-terraform-components/aws-scp" target="_blank" rel="noopener noreferrer" class=""><code>aws-scp</code></a></td><td>Manages Service Control Policies (deployed as instances per policy, e.g., <code>aws-scp/deny-leaving-organization</code>)</td></tr><tr><td><a href="https://github.com/cloudposse-terraform-components/aws-account-settings" target="_blank" rel="noopener noreferrer" class=""><code>aws-account-settings</code></a></td><td>Account-level settings: IAM password policy, AWS Account Alias, EBS encryption, Service Quotas</td></tr><tr><td><a href="https://github.com/cloudposse-terraform-components/aws-budget" target="_blank" rel="noopener noreferrer" class=""><code>aws-budget</code></a></td><td>AWS budgets for cost management and alerting</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="part-of-reference-architecture-v2">Part of Reference Architecture V2<a href="https://docs.cloudposse.com/blog/new-account-components/#part-of-reference-architecture-v2" class="hash-link" aria-label="Direct link to Part of Reference Architecture V2" title="Direct link to Part of Reference Architecture V2" translate="no">​</a></h2>
<p>These new components are part of the broader Reference Architecture V2 changes, which also include the <a class="" href="https://docs.cloudposse.com/blog/deprecate-account-map/">deprecation of <code>account-map</code></a> in favor of static configuration and Atmos Auth profiles. Together, these changes reduce Terraform dependencies, simplify cold starts, and better support brownfield deployments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="adopting-with-legacy-infrastructure">Adopting with Legacy Infrastructure<a href="https://docs.cloudposse.com/blog/new-account-components/#adopting-with-legacy-infrastructure" class="hash-link" aria-label="Direct link to Adopting with Legacy Infrastructure" title="Direct link to Adopting with Legacy Infrastructure" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><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>Important for Existing Deployments</div><div class="admonitionContent_BuS1"><p>The new components ship with a <strong>next-gen <code>providers.tf</code></strong> that contains only a simple AWS provider declaration:</p><div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:rgb(127, 219, 202)">provider</span><span class="token keyword type variable" style="color:rgb(214, 222, 235)"> "aws" </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)">region</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> var.region</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 assumes <a href="https://atmos.tools/core-concepts/components/authentication/" target="_blank" rel="noopener noreferrer" class="">Atmos Auth</a> is in place — role assumption happens <em>before</em> Terraform begins, so the provider doesn't need to handle it. If you're adopting these components into an existing infrastructure that still uses <code>account-map</code> for provider configuration, you'll need to vendor in an overriding <code>providers.tf</code>.</p></div></div>
<p>Exclude the upstream <code>providers.tf</code> and use the legacy mixin instead:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockTitle_OeMC">components/terraform/&lt;component-name&gt;/component.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos/v1</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"> ComponentVendorConfig</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">spec</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"> github.com/cloudposse</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">components/aws</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">&lt;component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">.git//src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">?</span><span class="token plain">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"> .Version </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">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> vX.x.x  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># The new version with next-gen providers</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)">"**/**"</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">excluded_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)">"providers.tf"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Exclude the next-gen providers.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">mixins</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"># Vendor in the legacy providers.tf that works with account-map</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">uri</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">//raw.githubusercontent.com/cloudposse</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">components/mixins/</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"> .Version </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">/src/mixins/provider</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">with</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">account</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">map.tf</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"> v0.3.2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">filename</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> providers.tf</span><br></span></code></pre></div></div>
<p>This gives you the new modular component logic while keeping your existing provider configuration intact.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="questions">Questions?<a href="https://docs.cloudposse.com/blog/new-account-components/#questions" class="hash-link" aria-label="Direct link to Questions?" title="Direct link to Questions?" translate="no">​</a></h2>
<p>If you have questions about adopting the new account components:</p>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1">Join the <a href="https://cloudposse.com/slack" target="_blank" rel="noopener noreferrer" class="">SweetOps Slack</a> community</li>
<li class="my-1">Open a <a href="https://github.com/orgs/cloudposse/discussions" target="_blank" rel="noopener noreferrer" class="">GitHub Discussion</a></li>
<li class="my-1">Contact Cloud Posse <a class="" href="https://docs.cloudposse.com/support/">support</a></li>
</ol></div>]]></content:encoded>
            <category>reference-architecture</category>
            <category>aws</category>
            <category>components</category>
            <category>accounts</category>
        </item>
        <item>
            <title><![CDATA[Migrating to Next-Gen Components with Atmos Auth]]></title>
            <link>https://docs.cloudposse.com/blog/nextgen-component-migration/</link>
            <guid>https://docs.cloudposse.com/blog/nextgen-component-migration/</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Over the past couple of months, we've shipped two changes that fundamentally simplify how components authenticate with AWS: Atmos Auth and the deprecation of account-map. This post is a migration guide for updating your component providers to match the version of infrastructure you're running — whether you're moving to next-gen or staying on legacy.]]></description>
            <content:encoded><![CDATA[<div class="intro"><p>Over the past couple of months, we've shipped two changes that fundamentally simplify how components authenticate with AWS: <strong>Atmos Auth</strong> and the <strong>deprecation of <code>account-map</code></strong>. This post is a migration guide for updating your component providers to match the version of infrastructure you're running — whether you're moving to next-gen or staying on legacy.</p></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="which-guide-do-you-need">Which Guide Do You Need?<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#which-guide-do-you-need" class="hash-link" aria-label="Direct link to Which Guide Do You Need?" title="Direct link to Which Guide Do You Need?" translate="no">​</a></h2>
<table><thead><tr><th>Your situation</th><th>Guide</th></tr></thead><tbody><tr><td>You're on legacy infrastructure (account-map, team roles) and want to move to Atmos Auth</td><td><a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#migration-guide-1-upgrading-your-infrastructure-to-next-gen" class="">Migration Guide 1: Upgrading to Next-Gen</a></td></tr><tr><td>You're on legacy infrastructure but want to use a newer component version that ships with next-gen providers</td><td><a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#migration-guide-2-using-new-component-versions-on-legacy-infrastructure" class="">Migration Guide 2: New Components on Legacy Infrastructure</a></td></tr></tbody></table>
<p>Not sure which you are? Read the <a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#how-to-tell-which-generation-youre-on" class="">How to Tell Which Generation You're On</a> section first.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-we-made-these-changes">Why We Made These Changes<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#why-we-made-these-changes" class="hash-link" aria-label="Direct link to Why We Made These Changes" title="Direct link to Why We Made These Changes" translate="no">​</a></h2>
<p>The driving force behind these changes is <strong>testability</strong>. The legacy <code>account-map</code> component was a globally required dependency — every component's <code>providers.tf</code> referenced it to resolve IAM roles. That tight coupling meant you couldn't test a single component in isolation without first deploying <code>account-map</code> and its entire dependency chain. By removing <code>account-map</code> from the default <code>providers.tf</code>, components become self-contained and significantly simpler to test.</p>
<p>Atmos Auth reinforces this by moving authentication out of the Terraform layer entirely. Instead of chained role assumptions wired through provider configuration, Atmos Auth resolves credentials <em>before</em> Terraform ever runs. The result is a provider block with nothing but <code>region = var.region</code> — no dynamic lookups, no remote state, no implicit dependencies on other components.</p>
<p>The trade-off is that <strong>this is a breaking change</strong>. Components that ship with the new <code>providers.tf</code> are not backwards compatible with environments still relying on <code>account-map</code> and team roles. That's exactly why we provide provider override mechanisms (described below) — they let you adopt the new authentication model at your own pace, on any component version, without waiting for upstream releases.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>All Cloud Posse Components Are Still Usable</div><div class="admonitionContent_BuS1"><p>Every component we publish remains fully usable during this transition. The key thing to understand is that <strong><code>providers.tf</code> is what dictates which generation you're on</strong> — not the component version itself. As we upgrade components to ship with the next-gen <code>providers.tf</code>, you'll want to check the <code>providers.tf</code> of each component when you vendor a new version. If the upstream <code>providers.tf</code> has changed to the next-gen format and your infrastructure isn't ready for that yet, you can always override it — either via <code>atmos generate</code> in your stack config or by vendoring in a <code>providers.tf</code> mixin — to match your current setup.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-changed">What Changed<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#what-changed" class="hash-link" aria-label="Direct link to What Changed" title="Direct link to What Changed" translate="no">​</a></h2>
<p>Two major improvements landed recently:</p>
<table><thead><tr><th>Change</th><th>What It Does</th></tr></thead><tbody><tr><td><strong>Atmos Auth</strong></td><td>Handles AWS authentication before Terraform runs — no more dynamic role assumption in <code>providers.tf</code></td></tr><tr><td><strong>Account-Map Deprecation</strong></td><td>Replaces the <code>account-map</code> Terraform component with a static YAML variable, eliminating a critical deploy-time dependency</td></tr></tbody></table>
<p>Together, these remove the need for <code>account-map</code>, <code>aws-teams</code>, and <code>aws-team-roles</code>. If you missed the announcement, see <a class="" href="https://docs.cloudposse.com/blog/deprecate-account-map/">Reference Architecture v2: Deprecating Account-Map</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-generation-means">What "Generation" Means<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#what-generation-means" class="hash-link" aria-label="Direct link to What &quot;Generation&quot; Means" title="Direct link to What &quot;Generation&quot; Means" translate="no">​</a></h2>
<p>The generation is determined entirely by <strong>how <code>providers.tf</code> authenticates</strong> — not by component version numbers, module logic, or Terraform state format. A component's business logic (resources, variables, outputs) is unaffected by this change. The only thing that changes is the provider configuration and how credentials are resolved.</p>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1"><strong>Legacy</strong> — <code>providers.tf</code> uses <code>module.iam_roles</code> to dynamically look up and assume an IAM role via <code>account-map</code> remote state</li>
<li class="my-1"><strong>Next-Gen</strong> — <code>providers.tf</code> uses <code>region = var.region</code> with no role assumption; Atmos Auth has already set the correct credentials before Terraform runs</li>
</ol></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-tell-which-generation-youre-on">How to Tell Which Generation You're On<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#how-to-tell-which-generation-youre-on" class="hash-link" aria-label="Direct link to How to Tell Which Generation You're On" title="Direct link to How to Tell Which Generation You're On" translate="no">​</a></h2>
<p>The quickest way to tell is to look at your component's <code>providers.tf</code>. The majority of components use the <code>module.iam_roles</code> pattern described below. However, some <strong>cold start components</strong> (like <code>account</code>, <code>account-map</code>, <code>account-settings</code>, <code>tfstate-backend</code>) have always used a simple <code>provider "aws" { region = var.region }</code> — that's by design, because they run under your super admin profile before IAM roles infrastructure exists. Don't confuse a cold start component's simple provider with the next-gen pattern.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="legacy-account-map--team-roles">Legacy (Account-Map + Team Roles)<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#legacy-account-map--team-roles" class="hash-link" aria-label="Direct link to Legacy (Account-Map + Team Roles)" title="Direct link to Legacy (Account-Map + Team Roles)" translate="no">​</a></h3>
<p>If your <code>providers.tf</code> looks like this, you're on the older generation:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:rgb(127, 219, 202)">provider</span><span class="token keyword type variable" style="color:rgb(214, 222, 235)"> "aws" </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)">region</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> var.region</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"># Profile is deprecated in favor of terraform_role_arn. When profiles are not in use, terraform_profile_name is null.</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)">profile</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> module.iam_roles.terraform_profile_name</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">  dynamic </span><span class="token string" style="color:rgb(173, 219, 103)">"assume_role"</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 comment" style="color:rgb(99, 119, 119);font-style:italic"># module.iam_roles.terraform_role_arn may be null, in which case do not assume a role.</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)">for_each</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> compact(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">module.iam_roles.terraform_role_arn</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 keyword" style="color:rgb(127, 219, 202)">content</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)">role_arn</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> assume_role.value</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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:rgb(127, 219, 202)">module</span><span class="token keyword type variable" style="color:rgb(214, 222, 235)"> "iam_roles" </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)">source</span><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)">"../account-map/modules/iam-roles"</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)">context</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> module.this.context</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 pattern depends on <code>account-map</code>, <code>aws-teams</code>, and <code>aws-team-roles</code> being deployed. The <code>iam_roles</code> module reaches into the <code>account-map</code> remote state to figure out which role to assume.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-gen-atmos-auth">Next-Gen (Atmos Auth)<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#next-gen-atmos-auth" class="hash-link" aria-label="Direct link to Next-Gen (Atmos Auth)" title="Direct link to Next-Gen (Atmos Auth)" translate="no">​</a></h3>
<p>With Atmos Auth, authentication happens <em>before</em> Terraform runs — no dynamic role assumptions, no remote state lookups, no <code>account-map</code> dependency. The next-gen <code>providers.tf</code> includes the <code>account_map</code> variable (a static map of account names to IDs) and a dummy <code>iam_roles</code> module for backward compatibility:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:rgb(127, 219, 202)">variable</span><span class="token keyword type variable" style="color:rgb(214, 222, 235)"> "account_map_enabled" </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)">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> bool</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)">description</span><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)">"Enable the account map component"</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)">default</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">false</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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:rgb(127, 219, 202)">variable</span><span class="token keyword type variable" style="color:rgb(214, 222, 235)"> "account_map" </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)">type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> object(</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)">full_account_map</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> map(string)</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)">audit_account_account_name</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> optional(string, </span><span class="token string" style="color:rgb(173, 219, 103)">""</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)">root_account_account_name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> optional(string, </span><span class="token string" style="color:rgb(173, 219, 103)">""</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)">identity_account_account_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> optional(string, </span><span class="token string" style="color:rgb(173, 219, 103)">""</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)">aws_partition</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> optional(string, </span><span class="token string" style="color:rgb(173, 219, 103)">"aws"</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)">iam_role_arn_templates</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> optional(map(string), </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><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  </span><span class="token property" style="color:rgb(128, 203, 196)">description</span><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)">"Map of account names to account IDs."</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)">default</span><span class="token plain"> </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"></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)">full_account_map</span><span class="token plain">              </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><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token property" style="color:rgb(128, 203, 196)">audit_account_account_name</span><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)">""</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)">root_account_account_name</span><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)">""</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)">identity_account_account_name</span><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)">""</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)">aws_partition</span><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)">"aws"</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)">iam_role_arn_templates</span><span class="token plain">        </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><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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:rgb(127, 219, 202)">provider</span><span class="token keyword type variable" style="color:rgb(214, 222, 235)"> "aws" </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)">region</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> var.region</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" 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"># Dummy module to satisfy legacy references to module.iam_roles</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token keyword" style="color:rgb(127, 219, 202)">module</span><span class="token keyword type variable" style="color:rgb(214, 222, 235)"> "iam_roles" </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)">source</span><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)">"cloudposse/label/null"</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)">context</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> module.this.context</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>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-the-dummy-iam_roles-module">Why the Dummy <code>iam_roles</code> Module?<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#why-the-dummy-iam_roles-module" class="hash-link" aria-label="Direct link to why-the-dummy-iam_roles-module" title="Direct link to why-the-dummy-iam_roles-module" translate="no">​</a></h4>
<p>Many components reference <code>module.iam_roles</code> in their code — for example, to pass <code>module.iam_roles.terraform_role_arn</code> to sub-providers. The dummy module (sourced from <code>cloudposse/label/null</code>) satisfies Terraform's module reference validation so these components don't error during <code>terraform init</code>. It outputs empty/null values, which means any <code>dynamic "assume_role"</code> blocks that iterate over <code>compact([module.iam_roles.terraform_role_arn])</code> simply produce zero iterations — no role is assumed, and Atmos Auth's pre-configured credentials are used instead.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="atmos-auth-prerequisites">Atmos Auth Prerequisites<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#atmos-auth-prerequisites" class="hash-link" aria-label="Direct link to Atmos Auth Prerequisites" title="Direct link to Atmos Auth Prerequisites" translate="no">​</a></h2>
<p>Before using Atmos Auth, ensure you have:</p>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1"><strong>Atmos &gt;= v1.155.0</strong> — Atmos Auth requires a recent version of the Atmos CLI. Run <code>atmos version</code> to check.</li>
<li class="my-1"><strong>AWS IAM Identity Center (SSO)</strong> — For human users, Atmos Auth profiles authenticate via AWS SSO. You need IAM Identity Center configured in your <code>core-root</code> account with Permission Sets for Terraform access.</li>
<li class="my-1"><strong>IAM roles for CI/CD</strong> — For machine users, deploy the <code>iam-role</code> component with GitHub OIDC (or your CI provider's equivalent) in each target account.</li>
<li class="my-1"><strong>Atmos Auth profiles configured</strong> — Define profiles in your <code>atmos.yaml</code> that map to SSO Permission Sets or IAM roles. See <a href="https://atmos.tools/cli/configuration/auth" target="_blank" rel="noopener noreferrer" class="">Atmos Auth</a> for the configuration reference.</li>
</ol></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-provider-overrides-work">How Provider Overrides Work<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#how-provider-overrides-work" class="hash-link" aria-label="Direct link to How Provider Overrides Work" title="Direct link to How Provider Overrides Work" translate="no">​</a></h2>
<p>Both migration guides below rely on overriding a component's <code>providers.tf</code> so it matches your infrastructure. There are two mechanisms for this:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recommended-atmos-generate">Recommended: <code>atmos generate</code><a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#recommended-atmos-generate" class="hash-link" aria-label="Direct link to recommended-atmos-generate" title="Direct link to recommended-atmos-generate" translate="no">​</a></h3>
<p>The <code>terraform.generate</code> block in your stack configuration tells Atmos to write files into the component directory before Terraform runs. Define it once at any stack level (org, tenant, stage) and every component that inherits from that config gets the generated <code>providers.tf</code> automatically. This is the recommended approach because it's centrally managed, inheritable, and doesn't require per-component changes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="alternative-vendor-mixins">Alternative: Vendor Mixins<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#alternative-vendor-mixins" class="hash-link" aria-label="Direct link to Alternative: Vendor Mixins" title="Direct link to Alternative: Vendor Mixins" translate="no">​</a></h3>
<p>We also publish Atmos vendor mixins that can be added to individual <code>component.yaml</code> files. This is useful when you need per-component control or can't use <code>atmos generate</code> for a specific component. The two relevant mixins are:</p>
<p><strong><code>provider-without-account-map.tf</code></strong> — The next-gen provider. Defines the <code>account_map</code> variables, configures <code>provider "aws"</code> with just <code>region = var.region</code>, and includes a dummy <code>iam_roles</code> module for backward compatibility.</p>
<p><strong><code>provider-with-account-map.tf</code></strong> — The legacy provider. Restores the <code>module.iam_roles</code> pattern for components that need to run on infrastructure still using <code>account-map</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="account-verification">Account Verification<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#account-verification" class="hash-link" aria-label="Direct link to Account Verification" title="Direct link to Account Verification" translate="no">​</a></h3>
<p>Regardless of which override method you use, we recommend adding the <strong><code>account-verification.mixin.tf</code></strong> mixin. This uses an <code>aws_caller_identity</code> data source to check the account ID of the credentials Terraform is running with, then compares it against the expected account from the <code>account_map</code> variable. The check runs during <code>terraform plan</code> — if there's a mismatch, Terraform fails before making any changes. This catches misconfigured Atmos Auth profiles, stale SSO sessions, or wrong environment targets.</p>
<p>Example failure output:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Error: Account verification failed</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Expected account "567890123456" (plat-dev) but authenticated to "789012345678" (plat-prod).</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Check your Atmos Auth profile configuration.</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migration-guide-1-upgrading-your-infrastructure-to-next-gen">Migration Guide 1: Upgrading Your Infrastructure to Next-Gen<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#migration-guide-1-upgrading-your-infrastructure-to-next-gen" class="hash-link" aria-label="Direct link to Migration Guide 1: Upgrading Your Infrastructure to Next-Gen" title="Direct link to Migration Guide 1: Upgrading Your Infrastructure to Next-Gen" translate="no">​</a></h2>
<p><strong>Scenario:</strong> You're running legacy infrastructure with <code>account-map</code>, <code>aws-teams</code>, and <code>aws-team-roles</code>. You want to adopt Atmos Auth and remove the <code>account-map</code> dependency.</p>
<p>This is the full infrastructure migration — you're changing <em>how your platform authenticates</em>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-set-up-atmos-auth">1. Set Up Atmos Auth<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#1-set-up-atmos-auth" class="hash-link" aria-label="Direct link to 1. Set Up Atmos Auth" title="Direct link to 1. Set Up Atmos Auth" translate="no">​</a></h3>
<p>Configure Atmos Auth profiles in your <code>atmos.yaml</code>. This tells Atmos how to authenticate to each account before Terraform runs:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Authenticate with your profile</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos auth login</span><br></span></code></pre></div></div>
<p>See <a href="https://atmos.tools/cli/configuration/auth" target="_blank" rel="noopener noreferrer" class="">Atmos Auth</a> for configuration details and the <a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#atmos-auth-prerequisites" class="">prerequisites</a> section above.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-add-the-static-account-map">2. Add the Static Account Map<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#2-add-the-static-account-map" class="hash-link" aria-label="Direct link to 2. Add the Static Account Map" title="Direct link to 2. Add the Static Account Map" translate="no">​</a></h3>
<p>Define account IDs in your stack defaults so components can look up accounts without remote state:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># stacks/orgs/acme/_defaults.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">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">account_map_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)">false</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">account_map</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">full_account_map</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">core-root</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">core-artifacts</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)">"234567890123"</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">core-audit</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)">"345678901234"</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">core-auto</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)">"456789012345"</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">plat-dev</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)">"567890123456"</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">plat-staging</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)">"678901234567"</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">plat-prod</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)">"789012345678"</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">root_account_account_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> core</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">root</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">audit_account_account_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> core</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">audit</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">    </span><span class="token key atrule">iam_role_arn_templates</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">core-root</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)">"arn:aws:iam::123456789012:role/acme-core-gbl-root-%s"</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">core-artifacts</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)">"arn:aws:iam::234567890123:role/acme-core-gbl-artifacts-%s"</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">core-audit</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)">"arn:aws:iam::345678901234:role/acme-core-gbl-audit-%s"</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">core-auto</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)">"arn:aws:iam::456789012345:role/acme-core-gbl-auto-%s"</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">plat-dev</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)">"arn:aws:iam::567890123456:role/acme-plat-gbl-dev-%s"</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">plat-staging</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)">"arn:aws:iam::678901234567:role/acme-plat-gbl-staging-%s"</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">plat-prod</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)">"arn:aws:iam::789012345678:role/acme-plat-gbl-prod-%s"</span><br></span></code></pre></div></div>
<p>The <code>iam_role_arn_templates</code> map provides ARN templates for each account. The <code>%s</code> placeholder is replaced with the role name (e.g., <code>terraform</code>, <code>planner</code>) at runtime by components that need to assume cross-account roles.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-override-providerstf-for-your-components">3. Override providers.tf for Your Components<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#3-override-providerstf-for-your-components" class="hash-link" aria-label="Direct link to 3. Override providers.tf for Your Components" title="Direct link to 3. Override providers.tf for Your Components" translate="no">​</a></h3>
<p>Add the next-gen provider configuration to your stack defaults using <code>atmos generate</code>. This generates <code>providers.tf</code> for all components that inherit from this config:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># stacks/orgs/acme/_defaults.yaml (or any inherited stack config)</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">generate</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.tf"</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)">      variable "account_map_enabled" {</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">        type        = bool</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">        description = "Enable the account map component"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">        default     = false</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">      }</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">      variable "account_map" </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">        type = object(</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">          full_account_map              = map(string)</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          audit_account_account_name    = optional(string</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">          root_account_account_name     = optional(string</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">          identity_account_account_name = optional(string</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">          aws_partition                 = optional(string</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> "aws")</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          iam_role_arn_templates        = optional(map(string)</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><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">        description = "Static account map for components when account_map_enabled is false."</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        default = </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">          full_account_map              = </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">          audit_account_account_name    = ""</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          root_account_account_name     = ""</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          identity_account_account_name = ""</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          aws_partition                 = "aws"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">          iam_role_arn_templates        = </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><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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      provider "aws" </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">        region = var.region</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" 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"># Stub module that satisfies references to module.iam_roles in</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"># upstream components. With Atmos Auth this is no longer needed,</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"># so we replace it with a no-op label module.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      module "iam_roles" </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">        source  = "cloudposse/label/null"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">        context = module.this.context</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" 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"># TEMPORARY: Override file to declare stale providers so OpenTofu can</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"># load existing state that still references module.iam_roles from</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"># account-map/modules/iam-roles. Override files merge with existing</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"># required_providers blocks instead of conflicting.</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"># Remove this after all components have been migrated and state is clean.</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">"versions_override.tf"</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)">      terraform {</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">        required_providers {</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">          awsutils = {</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">            source  = "cloudposse/awsutils"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">            version = "&gt;= 0.1.0"</span><br></span><span class="token-line" style="color:#d6deeb"><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)">          utils = {</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">            source  = "cloudposse/utils"</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">            version = "&gt;= 0.1.0"</span><br></span><span class="token-line" style="color:#d6deeb"><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)">        }</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token scalar string" style="color:rgb(173, 219, 103)">      }</span><br></span></code></pre></div></div>
<p>Components that vendor a <code>providers.tf</code> from upstream need to exclude it so it doesn't conflict with the generated file:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># components/terraform/&lt;component-name&gt;/component.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">spec</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">excluded_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)">"providers.tf"</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="alternative-use-vendor-mixins">Alternative: Use Vendor Mixins<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#alternative-use-vendor-mixins" class="hash-link" aria-label="Direct link to Alternative: Use Vendor Mixins" title="Direct link to Alternative: Use Vendor Mixins" translate="no">​</a></h4>
<p>If you need per-component control or can't use <code>atmos generate</code>, you can vendor in the provider override directly in each <code>component.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># components/terraform/&lt;component-name&gt;/component.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">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos/v1</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"> ComponentVendorConfig</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">spec</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"> github.com/cloudposse</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">components/aws</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">&lt;component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">.git//src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">?</span><span class="token plain">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"> .Version </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">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v1.x.x</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)">"**/**"</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">excluded_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)">"providers.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">mixins</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">uri</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">//raw.githubusercontent.com/cloudposse</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">components/mixins/</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"> .Version </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">/src/mixins/provider</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">without</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">account</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">map.tf</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"> v0.3.2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">filename</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> providers.tf</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">uri</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">//raw.githubusercontent.com/cloudposse</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">components/mixins/</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"> .Version </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">/src/mixins/account</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">verification.mixin.tf</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"> v0.3.2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">filename</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> account</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">verification.mixin.tf</span><br></span></code></pre></div></div>
<p>Then re-vendor:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos vendor pull </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-c</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">&lt;</span><span class="token plain">component-name</span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-verify">4. Verify<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#4-verify" class="hash-link" aria-label="Direct link to 4. Verify" title="Direct link to 4. Verify" translate="no">​</a></h3>
<p>Run a plan against a non-production environment:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos terraform plan </span><span class="token operator" style="color:rgb(127, 219, 202)">&lt;</span><span class="token plain">component-name</span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-s</span><span class="token plain"> plat-ue1-dev</span><br></span></code></pre></div></div>
<p>Confirm the following:</p>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1"><strong>No <code>account-map</code> remote state reads</strong> — The plan output should not show any data source reads for <code>account-map</code> state</li>
<li class="my-1"><strong>No <code>assume_role</code> in provider config</strong> — Run <code>grep -r "assume_role" components/terraform/&lt;component-name&gt;/providers.tf</code> and confirm no matches</li>
<li class="my-1"><strong>Account verification passes</strong> — If you have the account-verification mixin, the plan should complete without an account mismatch error</li>
<li class="my-1"><strong>No unexpected drift</strong> — The plan should show no changes (or only expected changes) since only the provider authentication path changed, not the resources themselves</li>
</ol></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-migrate-incrementally">5. Migrate Incrementally<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#5-migrate-incrementally" class="hash-link" aria-label="Direct link to 5. Migrate Incrementally" title="Direct link to 5. Migrate Incrementally" translate="no">​</a></h3>
<p>You don't have to do every component at once. Migrate one at a time, verify with a plan, and move on. Components using the next-gen <code>providers.tf</code> and components still on the legacy <code>providers.tf</code> can coexist in the same infrastructure — they just authenticate differently.</p>
<p>For the full migration path including IAM Identity Center setup and removing legacy components, see <a class="" href="https://docs.cloudposse.com/layers/project/tutorials/migrate-from-account-map/">Migrate from Account-Map</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migration-guide-2-using-new-component-versions-on-legacy-infrastructure">Migration Guide 2: Using New Component Versions on Legacy Infrastructure<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#migration-guide-2-using-new-component-versions-on-legacy-infrastructure" class="hash-link" aria-label="Direct link to Migration Guide 2: Using New Component Versions on Legacy Infrastructure" title="Direct link to Migration Guide 2: Using New Component Versions on Legacy Infrastructure" translate="no">​</a></h2>
<p><strong>Scenario:</strong> You're still running <code>account-map</code> and team roles. You haven't set up Atmos Auth yet. But you want to upgrade to a newer version of a Cloud Posse component, and its <code>providers.tf</code> has already been updated to assume Atmos Auth.</p>
<p>This is the opposite problem — the <em>component</em> has moved to next-gen, but your <em>infrastructure</em> hasn't. The fix is the same tool: vendor in a <code>providers.tf</code> override via <code>component.yaml</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-tell-if-a-component-has-moved-to-next-gen">How to Tell If a Component Has Moved to Next-Gen<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#how-to-tell-if-a-component-has-moved-to-next-gen" class="hash-link" aria-label="Direct link to How to Tell If a Component Has Moved to Next-Gen" title="Direct link to How to Tell If a Component Has Moved to Next-Gen" translate="no">​</a></h3>
<p>When you vendor a new version of a component, check its <code>providers.tf</code>. If you see this:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token keyword" style="color:rgb(127, 219, 202)">provider</span><span class="token keyword type variable" style="color:rgb(214, 222, 235)"> "aws" </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)">region</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">=</span><span class="token plain"> var.region</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>Instead of the legacy <code>module.iam_roles</code> pattern, the component has been updated to assume Atmos Auth. It won't work out of the box with your <code>account-map</code>-based infrastructure.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-fix-vendor-in-a-legacy-compatible-providerstf">The Fix: Vendor in a Legacy-Compatible providers.tf<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#the-fix-vendor-in-a-legacy-compatible-providerstf" class="hash-link" aria-label="Direct link to The Fix: Vendor in a Legacy-Compatible providers.tf" title="Direct link to The Fix: Vendor in a Legacy-Compatible providers.tf" translate="no">​</a></h3>
<p>Override the component's <code>providers.tf</code> in your <code>component.yaml</code> to restore the legacy provider pattern:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># components/terraform/&lt;component-name&gt;/component.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">apiVersion</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> atmos/v1</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"> ComponentVendorConfig</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain"></span><span class="token key atrule">spec</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"> github.com/cloudposse</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">components/aws</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">&lt;component</span><span class="token punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">.git//src</span><span class="token punctuation" style="color:rgb(199, 146, 234)">?</span><span class="token plain">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"> .Version </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">version</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> v2.x.x  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># The new version with next-gen providers</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)">"**/**"</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">excluded_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)">"providers.tf"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Exclude the next-gen providers.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">mixins</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"># Vendor in the legacy providers.tf that works with account-map</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">uri</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">//raw.githubusercontent.com/cloudposse</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">terraform</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">components/mixins/</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"> .Version </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">/src/mixins/provider</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">with</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">account</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">map.tf</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"> v0.3.2</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">filename</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> providers.tf</span><br></span></code></pre></div></div>
<p>Then re-vendor:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos vendor pull </span><span class="token parameter variable" style="color:rgb(214, 222, 235)">-c</span><span class="token plain"> </span><span class="token operator" style="color:rgb(127, 219, 202)">&lt;</span><span class="token plain">component-name</span><span class="token operator" style="color:rgb(127, 219, 202)">&gt;</span><br></span></code></pre></div></div>
<p>This gives you the new component code with its bug fixes and features, but keeps the <code>providers.tf</code> compatible with your existing <code>account-map</code> infrastructure.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-to-use-this-approach">When to Use This Approach<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#when-to-use-this-approach" class="hash-link" aria-label="Direct link to When to Use This Approach" title="Direct link to When to Use This Approach" translate="no">​</a></h3>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1">You need a bug fix or feature from a newer component version</li>
<li class="my-1">The newer version ships with a next-gen <code>providers.tf</code></li>
<li class="my-1">You're not ready to migrate your infrastructure to Atmos Auth yet</li>
</ol></div>
<p>This is a <strong>bridge strategy</strong> — it lets you upgrade components now and migrate your infrastructure later, on your own timeline.</p>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><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>Keep Track of Overrides</div><div class="admonitionContent_BuS1"><p>When you override <code>providers.tf</code> this way, remember that you've pinned the provider behavior. Once you do migrate your infrastructure to Atmos Auth, come back and switch the mixin to <code>provider-without-account-map.tf</code> (or remove the override entirely if the upstream component already ships with the next-gen version).</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-breaks-and-common-errors">What Breaks and Common Errors<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#what-breaks-and-common-errors" class="hash-link" aria-label="Direct link to What Breaks and Common Errors" title="Direct link to What Breaks and Common Errors" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-gen-providers-on-legacy-infrastructure">Next-Gen Providers on Legacy Infrastructure<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#next-gen-providers-on-legacy-infrastructure" class="hash-link" aria-label="Direct link to Next-Gen Providers on Legacy Infrastructure" title="Direct link to Next-Gen Providers on Legacy Infrastructure" translate="no">​</a></h3>
<p>If you vendor a component with the next-gen <code>providers.tf</code> but your infrastructure still uses <code>account-map</code> and team roles, Terraform will authenticate with whatever credentials are in your environment (or none at all) instead of assuming the correct role. Common symptoms:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Error: error configuring Terraform AWS Provider: no valid credential sources found</span><br></span></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Error: AccessDenied: User: arn:aws:iam::123456789012:user/deploy is not authorized to perform: ...</span><br></span></code></pre></div></div>
<p><strong>Fix:</strong> Use <a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#migration-guide-2-using-new-component-versions-on-legacy-infrastructure" class="">Migration Guide 2</a> to vendor in the legacy-compatible <code>providers.tf</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="legacy-providers-on-next-gen-infrastructure">Legacy Providers on Next-Gen Infrastructure<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#legacy-providers-on-next-gen-infrastructure" class="hash-link" aria-label="Direct link to Legacy Providers on Next-Gen Infrastructure" title="Direct link to Legacy Providers on Next-Gen Infrastructure" translate="no">​</a></h3>
<p>If you still have the legacy <code>providers.tf</code> with <code>module.iam_roles</code> sourced from <code>../account-map/modules/iam-roles</code>, but you've already removed the <code>account-map</code> component:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Error: Module not found: module.iam_roles</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  The module at "../account-map/modules/iam-roles" could not be found.</span><br></span></code></pre></div></div>
<p><strong>Fix:</strong> Use <a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#migration-guide-1-upgrading-your-infrastructure-to-next-gen" class="">Migration Guide 1</a> to vendor in the next-gen <code>providers.tf</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="account-verification-mismatch">Account Verification Mismatch<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#account-verification-mismatch" class="hash-link" aria-label="Direct link to Account Verification Mismatch" title="Direct link to Account Verification Mismatch" translate="no">​</a></h3>
<p>If Atmos Auth is configured but pointing to the wrong account:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token plain">Error: Account verification failed</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">  Expected account "567890123456" (plat-dev) but authenticated to "789012345678" (plat-prod).</span><br></span></code></pre></div></div>
<p><strong>Fix:</strong> Check your Atmos Auth profile mapping in <code>atmos.yaml</code> and run <code>atmos auth login</code> to refresh credentials.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="terraform-state-impact">Terraform State Impact<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#terraform-state-impact" class="hash-link" aria-label="Direct link to Terraform State Impact" title="Direct link to Terraform State Impact" translate="no">​</a></h2>
<p>Switching <code>providers.tf</code> <strong>does not require a state migration</strong>. The provider configuration change only affects how Terraform authenticates — it doesn't change resource addresses, module paths, or state structure. When you run <code>terraform plan</code> after the migration, you should see <strong>no drift</strong> related to the provider change itself.</p>
<p>The <code>module.iam_roles</code> is replaced by a dummy module, but since <code>iam_roles</code> only produces outputs consumed within <code>providers.tf</code> (not resources in state), there are no state entries to migrate or remove.</p>
<p>If you do see unexpected drift, it's likely caused by a different component version (new resource defaults, renamed attributes) rather than the provider change. Roll back the component version to isolate whether the drift comes from the provider switch or the component upgrade.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cicd-implications">CI/CD Implications<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#cicd-implications" class="hash-link" aria-label="Direct link to CI/CD Implications" title="Direct link to CI/CD Implications" translate="no">​</a></h2>
<p>Atmos Auth changes how your CI/CD pipelines authenticate. The specifics depend on your runner.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-actions">GitHub Actions<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#github-actions" class="hash-link" aria-label="Direct link to GitHub Actions" title="Direct link to GitHub Actions" translate="no">​</a></h3>
<p>GitHub Actions workflows use OIDC to assume IAM roles directly. Deploy the <code>iam-role</code> component with GitHub OIDC trust policies in each target account. Your workflow authenticates via the standard <code>aws-actions/configure-aws-credentials</code> action before invoking <code>atmos terraform</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="spacelift">Spacelift<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#spacelift" class="hash-link" aria-label="Direct link to Spacelift" title="Direct link to Spacelift" translate="no">​</a></h3>
<p>Spacelift manages its own AWS credentials via cloud integrations. If you're using Spacelift, it already authenticates before Terraform runs — the next-gen <code>providers.tf</code> (with just <code>region = var.region</code>) aligns naturally with this model. Ensure your Spacelift stacks have the correct AWS integration attached.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="atlantis">Atlantis<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#atlantis" class="hash-link" aria-label="Direct link to Atlantis" title="Direct link to Atlantis" translate="no">​</a></h3>
<p>Atlantis authenticates via IAM roles configured on the server or via OIDC. Configure your Atlantis server's assumed role to target each account, then use the next-gen <code>providers.tf</code> as-is.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="general-pattern">General Pattern<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#general-pattern" class="hash-link" aria-label="Direct link to General Pattern" title="Direct link to General Pattern" translate="no">​</a></h3>
<p>Regardless of runner, the pattern is the same: <strong>authenticate before Terraform runs</strong>, not inside <code>providers.tf</code>. If your CI system already handles AWS credential setup before executing Terraform commands, it's compatible with next-gen providers.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<table><thead><tr><th>Before</th><th>After</th></tr></thead><tbody><tr><td><code>account-map</code> component deployed first</td><td>Static <code>account_map</code> variable in stack config</td></tr><tr><td><code>aws-teams</code> + <code>aws-team-roles</code> for IAM</td><td>AWS SSO Permission Sets + Atmos Auth</td></tr><tr><td>Dynamic role assumption in <code>providers.tf</code></td><td>Atmos Auth handles credentials before Terraform</td></tr><tr><td>Complex <code>iam_roles</code> module in every component</td><td>Simple <code>region = var.region</code> provider</td></tr><tr><td>Tight coupling between components via remote state</td><td>Components are independent</td></tr></tbody></table>
<p>The net result: fewer components to manage, simpler authentication, no deploy ordering dependencies, and a provider configuration you can actually read at a glance.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="learn-more">Learn More<a href="https://docs.cloudposse.com/blog/nextgen-component-migration/#learn-more" class="hash-link" aria-label="Direct link to Learn More" title="Direct link to Learn More" translate="no">​</a></h2>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1"><a class="" href="https://docs.cloudposse.com/blog/deprecate-account-map/">Deprecating Account-Map</a> — The full deprecation announcement</li>
<li class="my-1"><a class="" href="https://docs.cloudposse.com/layers/project/tutorials/migrate-from-account-map/">Migrate from Account-Map</a> — Detailed step-by-step migration guide</li>
<li class="my-1"><a href="https://atmos.tools/cli/configuration/auth" target="_blank" rel="noopener noreferrer" class="">Atmos Auth</a> — Authentication configuration reference</li>
<li class="my-1"><a class="" href="https://docs.cloudposse.com/layers/identity/how-to-log-into-aws/">How to Log into AWS</a> — Authentication workflows for human users</li>
</ol></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Need Help?</div><div class="admonitionContent_BuS1"><p>Migrating core authentication infrastructure is a significant change. If you need assistance, reach out in the <a href="https://cloudposse.com/slack" target="_blank" rel="noopener noreferrer" class="">SweetOps Slack</a> or contact <a href="https://cloudposse.com/support" target="_blank" rel="noopener noreferrer" class="">Cloud Posse support</a>.</p></div></div>]]></content:encoded>
            <category>reference-architecture</category>
            <category>identity</category>
            <category>migration</category>
            <category>atmos-auth</category>
            <category>components</category>
        </item>
        <item>
            <title><![CDATA[Reference Architecture v2: Deprecating Account-Map]]></title>
            <link>https://docs.cloudposse.com/blog/deprecate-account-map/</link>
            <guid>https://docs.cloudposse.com/blog/deprecate-account-map/</guid>
            <pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We're releasing Version 2 of the Cloud Posse Reference Architecture, which removes the account-map component and related identity components in favor of a simpler, more flexible approach using Atmos Auth profiles and static configuration.]]></description>
            <content:encoded><![CDATA[<div class="intro"><p>We're releasing Version 2 of the Cloud Posse Reference Architecture, which removes the <code>account-map</code> component and related identity components in favor of a simpler, more flexible approach using Atmos Auth profiles and static configuration.</p></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-changing">What's Changing<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#whats-changing" class="hash-link" aria-label="Direct link to What's Changing" title="Direct link to What's Changing" translate="no">​</a></h2>
<p>Version 2 of the Reference Architecture removes several components that were central to Version 1:</p>
<table><thead><tr><th>Removed Component</th><th>Replacement</th></tr></thead><tbody><tr><td><code>account-map</code></td><td>Static <code>account_map</code> variable in stack configuration</td></tr><tr><td><code>aws-teams</code></td><td>AWS SSO Permission Sets</td></tr><tr><td><code>aws-team-roles</code></td><td>AWS SSO Permission Sets</td></tr><tr><td><code>github-oidc-role</code></td><td><code>iam-role</code> component with GitHub OIDC support</td></tr><tr><td>Leapp</td><td>Atmos Auth profiles</td></tr></tbody></table>
<p>Additionally, the <code>core-identity</code> account is no longer used. Identity management is now centralized in <code>core-root</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-we-made-this-change">Why We Made This Change<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#why-we-made-this-change" class="hash-link" aria-label="Direct link to Why We Made This Change" title="Direct link to Why We Made This Change" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="reducing-terraform-dependencies">Reducing Terraform Dependencies<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#reducing-terraform-dependencies" class="hash-link" aria-label="Direct link to Reducing Terraform Dependencies" title="Direct link to Reducing Terraform Dependencies" translate="no">​</a></h3>
<p>The <code>account-map</code> component was a critical dependency that had to be deployed before most other components. It required careful ordering during cold starts and created circular dependency challenges. By replacing it with a static YAML configuration, we eliminate this complexity entirely.</p>
<p>This change also better supports <strong>brownfield deployments</strong> and <strong>alternate architectures</strong> where the full reference architecture isn't being adopted.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="simplifying-authentication">Simplifying Authentication<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#simplifying-authentication" class="hash-link" aria-label="Direct link to Simplifying Authentication" title="Direct link to Simplifying Authentication" translate="no">​</a></h3>
<p>Version 1 relied on a complex web of IAM roles created by <code>aws-teams</code> and <code>aws-team-roles</code>, which users accessed via Leapp. Version 2 uses:</p>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1"><strong>AWS SSO Permission Sets</strong> — Native AWS Identity Center integration for human users</li>
<li class="my-1"><strong>Atmos Auth profiles</strong> — Simple profile-based authentication that replaces Leapp</li>
<li class="my-1"><strong><code>iam-role</code> component</strong> — Flexible IAM roles for machine users (CI/CD)</li>
</ol></div>
<p>This also removes our dependency on Leapp, which is deprecated.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="better-separation-of-concerns">Better Separation of Concerns<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#better-separation-of-concerns" class="hash-link" aria-label="Direct link to Better Separation of Concerns" title="Direct link to Better Separation of Concerns" translate="no">​</a></h3>
<p>With static account mappings defined in YAML, configuration is:</p>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1"><strong>Visible</strong> — No need to query Terraform state to see account IDs</li>
<li class="my-1"><strong>Auditable</strong> — Changes are tracked in version control</li>
<li class="my-1"><strong>Portable</strong> — Works without access to Terraform state backend</li>
</ol></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="version-2-architecture">Version 2 Architecture<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#version-2-architecture" class="hash-link" aria-label="Direct link to Version 2 Architecture" title="Direct link to Version 2 Architecture" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="for-human-users">For Human Users<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#for-human-users" class="hash-link" aria-label="Direct link to For Human Users" title="Direct link to For Human Users" translate="no">​</a></h3>
<p>Human users authenticate via AWS SSO Permission Sets, accessed through Atmos Auth profiles:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># Select your profile based on your role</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)">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(214, 222, 235)">ATMOS_PROFILE</span><span class="token operator" style="color:rgb(127, 219, 202)">=</span><span class="token plain">devops</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"># Authenticate to AWS</span><span class="token plain"></span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">atmos 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"># Run Terraform commands</span><span class="token plain"></span><br></span><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"> plat-ue1-dev</span><br></span></code></pre></div></div>
<p>Profiles map to different Permission Sets based on user role and target environment:</p>
<table><thead><tr><th>Profile</th><th>Core Accounts</th><th>Dev/Sandbox</th><th>Staging/Prod</th></tr></thead><tbody><tr><td><code>managers</code></td><td>TerraformApplyAccess</td><td>TerraformApplyAccess</td><td>TerraformApplyAccess</td></tr><tr><td><code>devops</code></td><td>TerraformApplyAccess</td><td>TerraformApplyAccess</td><td>TerraformApplyAccess</td></tr><tr><td><code>developers</code></td><td>TerraformPlanAccess</td><td>TerraformApplyAccess</td><td>TerraformPlanAccess</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="for-machine-users-cicd">For Machine Users (CI/CD)<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#for-machine-users-cicd" class="hash-link" aria-label="Direct link to For Machine Users (CI/CD)" title="Direct link to For Machine Users (CI/CD)" translate="no">​</a></h3>
<p>GitHub Actions and other CI/CD systems use the <code>iam-role</code> component with GitHub OIDC:</p>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1"><strong><code>iam-role/terraform</code></strong> — Full admin access for applying changes</li>
<li class="my-1"><strong><code>iam-role/planner</code></strong> — Read-only access for planning</li>
<li class="my-1"><strong><code>iam-role/gitops</code></strong> — Access to GitOps resources (S3, DynamoDB)</li>
</ol></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="static-account-mapping">Static Account Mapping<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#static-account-mapping" class="hash-link" aria-label="Direct link to Static Account Mapping" title="Direct link to Static Account Mapping" translate="no">​</a></h3>
<p>Instead of the <code>account-map</code> component, account IDs are defined statically in your stack configuration:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#d6deeb;--prism-background-color:#011627"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#d6deeb;background-color:#011627"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#d6deeb"><span class="token comment" style="color:rgb(99, 119, 119);font-style:italic"># stacks/orgs/acme/_defaults.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">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">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">account_map</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">root_account_account_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> core</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">root</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">audit_account_account_name</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> core</span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain">audit</span><br></span><span class="token-line" style="color:#d6deeb"><span class="token plain">      </span><span class="token key atrule">full_account_map</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">core-root</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">core-artifacts</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)">"234567890123"</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">core-audit</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)">"345678901234"</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">core-auto</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)">"456789012345"</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">plat-dev</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)">"567890123456"</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">plat-staging</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)">"678901234567"</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">plat-prod</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)">"789012345678"</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="determining-your-version">Determining Your Version<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#determining-your-version" class="hash-link" aria-label="Direct link to Determining Your Version" title="Direct link to Determining Your Version" translate="no">​</a></h2>
<p>Not sure which version you're using? Check for these components in your infrastructure repository:</p>
<p><strong>Version 1 indicators:</strong></p>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1"><code>components/terraform/account-map/</code> exists</li>
<li class="my-1"><code>components/terraform/aws-teams/</code> exists</li>
<li class="my-1"><code>components/terraform/aws-team-roles/</code> exists</li>
</ol></div>
<p><strong>Version 2 indicators:</strong></p>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1"><code>profiles/</code> directory with Atmos Auth profiles</li>
<li class="my-1">Static <code>account_map</code> in <code>stacks/orgs/&lt;namespace&gt;/_defaults.yaml</code></li>
<li class="my-1"><code>components/terraform/iam-role/</code> exists</li>
</ol></div>
<p>For detailed guidance, see <a class="" href="https://docs.cloudposse.com/resources/version-identification/">Version Identification</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migration-path">Migration Path<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#migration-path" class="hash-link" aria-label="Direct link to Migration Path" title="Direct link to Migration Path" translate="no">​</a></h2>
<p>Migrating from Version 1 to Version 2 is a significant undertaking. The high-level steps are:</p>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1"><strong>Set up AWS SSO Permission Sets</strong> — Configure TerraformPlanAccess, TerraformApplyAccess, and TerraformStateAccess</li>
<li class="my-1"><strong>Create Atmos Auth profiles</strong> — Define profiles for managers, devops, developers, and github</li>
<li class="my-1"><strong>Deploy <code>iam-role</code> components</strong> — Set up terraform and planner roles in each account</li>
<li class="my-1"><strong>Create static account map</strong> — Add account IDs to your org defaults</li>
<li class="my-1"><strong>Update component vendoring</strong> — Use new mixins that don't require account-map</li>
<li class="my-1"><strong>Remove Version 1 components</strong> — Delete account-map, aws-teams, and aws-team-roles</li>
</ol></div>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><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>Migration Assistance</div><div class="admonitionContent_BuS1"><p>This migration affects core identity and authentication infrastructure. We recommend working with Cloud Posse for migration planning and execution. Contact us via the <a href="https://cloudposse.com/slack" target="_blank" rel="noopener noreferrer" class="">SweetOps Slack</a> or <a class="" href="https://docs.cloudposse.com/support/">support channels</a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentation">Documentation<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<p>This documentation site now supports versioned documentation:</p>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1"><strong>Latest</strong> — Documentation for Version 2 (current)</li>
<li class="my-1"><strong>v1</strong> — Documentation for Version 1 with account-map</li>
</ol></div>
<p>Use the version selector in the navigation bar to switch between versions.</p>
<p>For a comprehensive history of how our identity architecture has evolved over time, see <a class="" href="https://docs.cloudposse.com/layers/identity/tutorials/access-control-evolution/">AWS Access Control Evolution</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="questions">Questions?<a href="https://docs.cloudposse.com/blog/deprecate-account-map/#questions" class="hash-link" aria-label="Direct link to Questions?" title="Direct link to Questions?" translate="no">​</a></h2>
<p>If you have questions about this change or need migration assistance:</p>
<div class="steps_nwr1"><ol class="list-decimal pl-8 my-4">
<li class="my-1">Join the <a href="https://cloudposse.com/slack" target="_blank" rel="noopener noreferrer" class="">SweetOps Slack</a> community</li>
<li class="my-1">Open a <a href="https://github.com/orgs/cloudposse/discussions" target="_blank" rel="noopener noreferrer" class="">GitHub Discussion</a></li>
<li class="my-1">Contact Cloud Posse <a class="" href="https://docs.cloudposse.com/support/">support</a></li>
</ol></div>]]></content:encoded>
            <category>reference-architecture</category>
            <category>identity</category>
            <category>deprecation</category>
        </item>
        <item>
            <title><![CDATA[Comprehensive Security and Compliance Components for AWS Organizations]]></title>
            <link>https://docs.cloudposse.com/blog/security-compliance-components/</link>
            <guid>https://docs.cloudposse.com/blog/security-compliance-components/</guid>
            <pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We're excited to announce comprehensive documentation for our suite of security and compliance Terraform components.]]></description>
            <content:encoded><![CDATA[<div class="intro"><p>We're excited to announce comprehensive documentation for our suite of security and compliance Terraform components.
These components enable you to deploy AWS security services across your entire AWS Organization using the delegated
administrator pattern, providing centralized security monitoring and compliance assessment.</p></div>
<p>Hello SweetOps!</p>
<p>Security and compliance are critical for any organization running workloads on AWS.
Whether you're pursuing SOC2, HIPAA, PCI DSS, FedRAMP, or CIS benchmarks, you need comprehensive visibility into threats,
vulnerabilities, and configuration drift across all your accounts.</p>
<p>We've updated and documented our security and compliance components to make deploying these services straightforward and
maintainable at scale.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-included">What's Included<a href="https://docs.cloudposse.com/blog/security-compliance-components/#whats-included" class="hash-link" aria-label="Direct link to What's Included" title="Direct link to What's Included" translate="no">​</a></h2>
<p>Our security and compliance framework includes 9 Terraform components:</p>
<table><thead><tr><th>Component</th><th>Purpose</th></tr></thead><tbody><tr><td><a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/aws-config/">AWS Config</a></td><td>Configuration compliance and resource inventory</td></tr><tr><td><a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/aws-cloudtrail/">AWS CloudTrail</a></td><td>API activity logging and audit trail</td></tr><tr><td><a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/aws-guardduty/">AWS GuardDuty</a></td><td>Intelligent threat detection</td></tr><tr><td><a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/aws-security-hub/">AWS Security Hub</a></td><td>Centralized security findings aggregation</td></tr><tr><td><a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/aws-inspector2/">AWS Inspector 2</a></td><td>Automated vulnerability scanning</td></tr><tr><td><a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/aws-macie/">Amazon Macie</a></td><td>Sensitive data discovery in S3</td></tr><tr><td><a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/aws-access-analyzer/">IAM Access Analyzer</a></td><td>External and unused access detection</td></tr><tr><td><a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/aws-shield/">AWS Shield</a></td><td>DDoS protection</td></tr><tr><td><a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/aws-audit-manager/">AWS Audit Manager</a></td><td>Compliance evidence collection</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-architecture-decisions">Key Architecture Decisions<a href="https://docs.cloudposse.com/blog/security-compliance-components/#key-architecture-decisions" class="hash-link" aria-label="Direct link to Key Architecture Decisions" title="Direct link to Key Architecture Decisions" translate="no">​</a></h2>
<p>Our approach uses the <strong>delegated administrator</strong> pattern, centralizing security management while maintaining proper separation of concerns:</p>
<div class="steps_nwr1"><ul class="list-disc pl-8 my-4">
<li class="my-1"><strong>Security Account</strong>: Acts as the delegated administrator for threat detection and security monitoring services</li>
<li class="my-1"><strong>Audit Account</strong>: Stores immutable logs (CloudTrail) and configuration snapshots (Config)</li>
<li class="my-1"><strong>Root Account</strong>: Delegates administration but doesn't manage day-to-day security operations</li>
<li class="my-1"><strong>Member Accounts</strong>: Automatically enrolled and monitored by the security account</li>
</ul></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deployment-models">Deployment Models<a href="https://docs.cloudposse.com/blog/security-compliance-components/#deployment-models" class="hash-link" aria-label="Direct link to Deployment Models" title="Direct link to Deployment Models" translate="no">​</a></h2>
<p>Different AWS services require different deployment approaches. We've documented each pattern:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-step-delegated-administrator">3-Step Delegated Administrator<a href="https://docs.cloudposse.com/blog/security-compliance-components/#3-step-delegated-administrator" class="hash-link" aria-label="Direct link to 3-Step Delegated Administrator" title="Direct link to 3-Step Delegated Administrator" translate="no">​</a></h3>
<p>Used by GuardDuty, Security Hub, and Macie:</p>
<ol class="list-decimal pl-8 my-4">
<li class="my-1">Deploy to security account (creates the service)</li>
<li class="my-1">Deploy to root account (delegates administration)</li>
<li class="my-1">Deploy org settings to security account (configures organization-wide settings)</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-step-delegated-administrator">2-Step Delegated Administrator<a href="https://docs.cloudposse.com/blog/security-compliance-components/#2-step-delegated-administrator" class="hash-link" aria-label="Direct link to 2-Step Delegated Administrator" title="Direct link to 2-Step Delegated Administrator" translate="no">​</a></h3>
<p>Used by Inspector and Access Analyzer:</p>
<ol class="list-decimal pl-8 my-4">
<li class="my-1">Deploy to root account (delegates administration)</li>
<li class="my-1">Deploy org settings to security account</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="per-account-deployment">Per-Account Deployment<a href="https://docs.cloudposse.com/blog/security-compliance-components/#per-account-deployment" class="hash-link" aria-label="Direct link to Per-Account Deployment" title="Direct link to Per-Account Deployment" translate="no">​</a></h3>
<p>Used by Config and CloudTrail, with central aggregation in security/audit accounts.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="per-resource-deployment">Per-Resource Deployment<a href="https://docs.cloudposse.com/blog/security-compliance-components/#per-resource-deployment" class="hash-link" aria-label="Direct link to Per-Resource Deployment" title="Direct link to Per-Resource Deployment" translate="no">​</a></h3>
<p>Used by Shield Advanced for protecting specific resources like ALBs, CloudFront distributions, and Route53 hosted zones.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compliance-framework-support">Compliance Framework Support<a href="https://docs.cloudposse.com/blog/security-compliance-components/#compliance-framework-support" class="hash-link" aria-label="Direct link to Compliance Framework Support" title="Direct link to Compliance Framework Support" translate="no">​</a></h2>
<p>These components support multiple compliance frameworks out of the box:</p>
<ul class="list-disc pl-8 my-4">
<li class="my-1"><strong>CIS AWS Foundations Benchmark</strong> (v1.4, v1.5)</li>
<li class="my-1"><strong>AWS Foundational Security Best Practices</strong></li>
<li class="my-1"><strong>PCI DSS</strong> (Payment Card Industry)</li>
<li class="my-1"><strong>HIPAA</strong> (Healthcare)</li>
<li class="my-1"><strong>SOC 2</strong> (Service Organization Control)</li>
<li class="my-1"><strong>NIST 800-53</strong> (Federal)</li>
<li class="my-1"><strong>FedRAMP</strong> (Federal Risk and Authorization)</li>
<li class="my-1"><strong>CMMC</strong> (Cybersecurity Maturity Model Certification)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started">Getting Started<a href="https://docs.cloudposse.com/blog/security-compliance-components/#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>We've created comprehensive documentation to help you deploy these components:</p>
<ol class="list-decimal pl-8 my-4">
<li class="my-1"><strong><a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/">Security and Compliance Overview</a></strong> - Architecture and component descriptions</li>
<li class="my-1"><strong><a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/setup/">Setup Guide</a></strong> - Step-by-step deployment instructions</li>
<li class="my-1"><strong><a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/faq/">FAQ</a></strong> - Common issues and troubleshooting</li>
</ol>
<p>Each component also has its own detailed documentation page with stack configurations, deployment commands, and key variables.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="component-repositories">Component Repositories<a href="https://docs.cloudposse.com/blog/security-compliance-components/#component-repositories" class="hash-link" aria-label="Direct link to Component Repositories" title="Direct link to Component Repositories" translate="no">​</a></h2>
<p>All components are available in the <a href="https://github.com/cloudposse-terraform-components" target="_blank" rel="noopener noreferrer" class=""><code>cloudposse-terraform-components</code></a> GitHub organization:</p>
<ul class="list-disc pl-8 my-4">
<li class="my-1"><a href="https://github.com/cloudposse-terraform-components/aws-config" target="_blank" rel="noopener noreferrer" class="">aws-config</a></li>
<li class="my-1"><a href="https://github.com/cloudposse-terraform-components/aws-cloudtrail" target="_blank" rel="noopener noreferrer" class="">aws-cloudtrail</a></li>
<li class="my-1"><a href="https://github.com/cloudposse-terraform-components/aws-guardduty" target="_blank" rel="noopener noreferrer" class="">aws-guardduty</a></li>
<li class="my-1"><a href="https://github.com/cloudposse-terraform-components/aws-security-hub" target="_blank" rel="noopener noreferrer" class="">aws-security-hub</a></li>
<li class="my-1"><a href="https://github.com/cloudposse-terraform-components/aws-inspector2" target="_blank" rel="noopener noreferrer" class="">aws-inspector2</a></li>
<li class="my-1"><a href="https://github.com/cloudposse-terraform-components/aws-macie" target="_blank" rel="noopener noreferrer" class="">aws-macie</a></li>
<li class="my-1"><a href="https://github.com/cloudposse-terraform-components/aws-access-analyzer" target="_blank" rel="noopener noreferrer" class="">aws-access-analyzer</a></li>
<li class="my-1"><a href="https://github.com/cloudposse-terraform-components/aws-shield" target="_blank" rel="noopener noreferrer" class="">aws-shield</a></li>
<li class="my-1"><a href="https://github.com/cloudposse-terraform-components/aws-audit-manager" target="_blank" rel="noopener noreferrer" class="">aws-audit-manager</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://docs.cloudposse.com/blog/security-compliance-components/#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>We're continuing to improve our security and compliance components:</p>
<ul class="list-disc pl-8 my-4">
<li class="my-1">Additional conformance pack templates for common compliance frameworks</li>
<li class="my-1">Enhanced integration between services</li>
<li class="my-1">More automated remediation patterns via EventBridge</li>
<li class="my-1">Expanded documentation for GovCloud deployments</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Need Help?</div><div class="admonitionContent_BuS1"><p>If you have questions about deploying security and compliance components, reach out in the <a href="https://cloudposse.com/slack" target="_blank" rel="noopener noreferrer" class="">SweetOps Slack</a>
or check our <a class="" href="https://docs.cloudposse.com/layers/security-and-compliance/faq/">FAQ</a> for common issues.</p></div></div>
<p>We'd love to hear your feedback on these components. Let us know what compliance frameworks you're targeting and how we
can make these components work better for your organization!</p>]]></content:encoded>
            <category>security</category>
            <category>compliance</category>
            <category>aws</category>
            <category>components</category>
            <category>guardduty</category>
            <category>security-hub</category>
            <category>inspector</category>
            <category>macie</category>
        </item>
        <item>
            <title><![CDATA[Making Our Docs AI-Friendly with llms.txt]]></title>
            <link>https://docs.cloudposse.com/blog/llms-txt/</link>
            <guid>https://docs.cloudposse.com/blog/llms-txt/</guid>
            <pubDate>Fri, 17 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We've implemented the llms.txt standard to make our documentation more accessible to AI assistants, ensuring better responses when you ask ChatGPT, Claude, or other LLMs about Cloud Posse tools and best practices.]]></description>
            <content:encoded><![CDATA[<div class="intro"><p>We've implemented the llms.txt standard to make our documentation more accessible to AI assistants, ensuring better responses when you ask ChatGPT, Claude, or other LLMs about Cloud Posse tools and best practices.</p></div>
<p>Hello SweetOps!</p>
<p>As AI assistants become increasingly integrated into developer workflows, we're excited to announce support for the <a href="https://llmstxt.org/" target="_blank" rel="noopener noreferrer" class="">llms.txt standard</a> across our documentation site.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-llmstxt">What is llms.txt?<a href="https://docs.cloudposse.com/blog/llms-txt/#what-is-llmstxt" class="hash-link" aria-label="Direct link to What is llms.txt?" title="Direct link to What is llms.txt?" translate="no">​</a></h2>
<p>Think of <code>llms.txt</code> as the AI equivalent of <code>robots.txt</code> for search engines. It's an emerging standard that provides LLMs with structured, curated documentation in a format optimized for their understanding. Rather than crawling entire websites and hitting context window limits, AI assistants can now access our documentation in two curated formats:</p>
<ul class="list-disc pl-8 my-4">
<li class="my-1"><strong><a href="https://docs.cloudposse.com/llms.txt" target="_blank" rel="noopener noreferrer" class="">/llms.txt</a></strong> - A compact list of important documentation links</li>
<li class="my-1"><strong><a href="https://docs.cloudposse.com/llms-full.txt" target="_blank" rel="noopener noreferrer" class="">/llms-full.txt</a></strong> - Full documentation content in markdown format</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-matters">Why This Matters<a href="https://docs.cloudposse.com/blog/llms-txt/#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>When you ask an AI assistant about Atmos, Terraform components, or Cloud Posse best practices, you'll get more accurate and up-to-date responses. The assistant can reference our curated documentation directly instead of relying on training data that may be outdated or incomplete.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits-for-the-community">Benefits for the Community<a href="https://docs.cloudposse.com/blog/llms-txt/#benefits-for-the-community" class="hash-link" aria-label="Direct link to Benefits for the Community" title="Direct link to Benefits for the Community" translate="no">​</a></h3>
<ul class="list-disc pl-8 my-4">
<li class="my-1"><strong>Better AI Assistance</strong>: More accurate responses when asking AI tools about our projects</li>
<li class="my-1"><strong>Efficient Context Usage</strong>: LLMs can access precisely what they need without crawling</li>
<li class="my-1"><strong>Up-to-Date Information</strong>: Always references current documentation, not stale training data</li>
<li class="my-1"><strong>Developer Velocity</strong>: Faster answers means less time searching, more time building</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works">How It Works<a href="https://docs.cloudposse.com/blog/llms-txt/#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>We're using the <a href="https://github.com/rachfop/docusaurus-plugin-llms" target="_blank" rel="noopener noreferrer" class=""><code>docusaurus-plugin-llms</code></a> to automatically generate these files from our Docusaurus site. The plugin:</p>
<ol class="list-decimal pl-8 my-4">
<li class="my-1">Prioritizes core documentation sections (Atmos, components, tutorials)</li>
<li class="my-1">Includes blog content for recent updates and announcements</li>
<li class="my-1">Generates both compact and full-text versions</li>
<li class="my-1">Automatically updates with each documentation deployment</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-out">Try It Out<a href="https://docs.cloudposse.com/blog/llms-txt/#try-it-out" class="hash-link" aria-label="Direct link to Try It Out" title="Direct link to Try It Out" translate="no">​</a></h2>
<p>Next time you're working with an AI assistant, try asking questions about:</p>
<ul class="list-disc pl-8 my-4">
<li class="my-1">"How do I configure Atmos stacks?"</li>
<li class="my-1">"What's the latest on Cloud Posse component deprecation?"</li>
<li class="my-1">"Show me examples of Terraform component patterns"</li>
</ul>
<p>The assistant will have direct access to our structured documentation, leading to better, more accurate responses.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="join-the-movement">Join the Movement<a href="https://docs.cloudposse.com/blog/llms-txt/#join-the-movement" class="hash-link" aria-label="Direct link to Join the Movement" title="Direct link to Join the Movement" translate="no">​</a></h2>
<p>The llms.txt standard is gaining adoption across the developer community. If you maintain documentation, consider implementing it for your projects. It's a simple way to make your content more accessible to the AI tools your users are already using.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Questions?</div><div class="admonitionContent_BuS1"><p>Have feedback about our AI-friendly documentation? Join us in the <a href="https://cloudposse.com/slack" target="_blank" rel="noopener noreferrer" class="">SweetOps Slack</a> or <a href="https://github.com/orgs/cloudposse/discussions" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a>.</p></div></div>]]></content:encoded>
            <category>documentation</category>
            <category>ai</category>
            <category>llm</category>
        </item>
        <item>
            <title><![CDATA[Introducing Our Component Deprecation Process]]></title>
            <link>https://docs.cloudposse.com/blog/deprecation-process/</link>
            <guid>https://docs.cloudposse.com/blog/deprecation-process/</guid>
            <pubDate>Wed, 15 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We've documented our formal process for deprecating and archiving components to ensure transparency and give our community adequate notice when repositories are being sunset.]]></description>
            <content:encoded><![CDATA[<div class="intro"><p>We've documented our formal process for deprecating and archiving components to ensure transparency and give our community adequate notice when repositories are being sunset.</p></div>
<p>Hello SweetOps!</p>
<p>As part of our commitment to maintaining <a href="https://github.com/cloudposse/" target="_blank" rel="noopener noreferrer" class="">300+ open source projects</a> across Terraform modules, <a href="https://github.com/cloudposse-terraform-components" target="_blank" rel="noopener noreferrer" class="">components</a>, and other tooling, we occasionally need to deprecate repositories that are no longer actively maintained or have been superseded by better alternatives.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-to-expect">What to Expect<a href="https://docs.cloudposse.com/blog/deprecation-process/#what-to-expect" class="hash-link" aria-label="Direct link to What to Expect" title="Direct link to What to Expect" translate="no">​</a></h2>
<p>We've added comprehensive documentation outlining our <a class="" href="https://docs.cloudposse.com/community/contribute/our-github/#deprecation-and-archival-process">Deprecation and Archival Process</a> to ensure this transition is as smooth as possible for everyone in our community.</p>
<p>When we deprecate a repository, here's what you can expect:</p>
<ol class="list-decimal pl-8 my-4">
<li class="my-1"><strong>GitHub Issue Created</strong>: A pinned issue with detailed explanation, timeline, and migration guidance</li>
<li class="my-1"><strong>README Warnings Added</strong>: Prominent deprecation notices at the top of documentation</li>
<li class="my-1"><strong>Blog Post Published</strong>: Announcement in our changelog/blog about the deprecation</li>
<li class="my-1"><strong>Pull Request Submitted</strong>: All changes announced via PR for community visibility</li>
<li class="my-1"><strong>Grace Period</strong>: Typically 90+ days for the community to migrate and ask questions</li>
<li class="my-1"><strong>Repository Archived</strong>: After the grace period, repos are archived (not deleted) and remain publicly accessible</li>
<li class="my-1"><strong>Blog Post Updated</strong>: Announcement updated to reflect the archival completion</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-matters">Why This Matters<a href="https://docs.cloudposse.com/blog/deprecation-process/#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 structured approach ensures that:</p>
<ul class="list-disc pl-8 my-4">
<li class="my-1">You have advance notice before any repository is archived</li>
<li class="my-1">Migration paths and alternatives are clearly documented</li>
<li class="my-1">Historical access to code is preserved</li>
<li class="my-1">The community can provide feedback during the deprecation period</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="our-commitment">Our Commitment<a href="https://docs.cloudposse.com/blog/deprecation-process/#our-commitment" class="hash-link" aria-label="Direct link to Our Commitment" title="Direct link to Our Commitment" translate="no">​</a></h2>
<p>As stated in our <a class="" href="https://docs.cloudposse.com/community/contribute/our-github/">GitHub documentation</a>, we commit to always provide free and public access to our Open Source repositories. Even when archived, repositories remain accessible for historical reference and continued use.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Questions?</div><div class="admonitionContent_BuS1"><p>If you have questions about deprecated components or need migration assistance, reach out in the <a href="https://cloudposse.com/slack" target="_blank" rel="noopener noreferrer" class="">SweetOps Slack</a> or <a href="https://github.com/orgs/cloudposse/discussions" target="_blank" rel="noopener noreferrer" class="">GitHub Discussions</a>.</p></div></div>]]></content:encoded>
            <category>community</category>
            <category>maintenance</category>
            <category>github</category>
        </item>
        <item>
            <title><![CDATA[Why We Recommend Managed Node Groups Over Fargate for EKS Add-Ons]]></title>
            <link>https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/</link>
            <guid>https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/</guid>
            <pubDate>Wed, 15 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[For production EKS clusters, a small managed node group provides reliability, cost efficiency, and automation—without Fargate's hidden complexity and bootstrap deadlock.]]></description>
            <content:encoded><![CDATA[<div class="intro"><p>When simplicity meets automation, sometimes it's the hidden complexity that bites back.</p></div>
<p>For a while, running Karpenter on AWS Fargate sounded like a perfect solution. No nodes to manage, automatic scaling, and no EC2 lifecycle headaches. The <a href="https://aws.github.io/aws-eks-best-practices/karpenter/#run-the-karpenter-controller-on-eks-fargate-or-on-a-worker-node-that-belongs-to-a-node-group" target="_blank" rel="noopener noreferrer" class="">AWS EKS Best Practices Guide</a> and <a href="https://karpenter.sh/docs/getting-started/getting-started-with-karpenter/" target="_blank" rel="noopener noreferrer" class="">Karpenter's official documentation</a> both present Fargate as a viable option for running the Karpenter controller.</p>
<p>But in practice, that setup started to cause problems for certain EKS add-ons. Over time, those lessons led us — and our customers — to recommend using a small managed node group (MNG) instead of relying solely on Fargate.</p>
<p><strong>This recommendation diverges from some official AWS guidance</strong>, and we acknowledge that. Here's why we made this decision.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-fargate-was-attractive-and-still-is-sometimes">Why Fargate Was Attractive (and Still Is, Sometimes)<a href="https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/#why-fargate-was-attractive-and-still-is-sometimes" class="hash-link" aria-label="Direct link to Why Fargate Was Attractive (and Still Is, Sometimes)" title="Direct link to Why Fargate Was Attractive (and Still Is, Sometimes)" translate="no">​</a></h2>
<p>The appeal of Fargate for Karpenter is understandable:</p>
<ul class="space-y-2 !pl-0"><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">No need to bootstrap a managed node group before deploying Karpenter</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Simpler initial setup for teams not using Infrastructure-as-Code frameworks</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Karpenter's early versions had limited integration with managed node pools</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">It showcased Karpenter's capabilities in the most dramatic way possible</div></li></ul>
<p>For teams deploying clusters manually or with basic tooling, Fargate eliminates several complex setup steps. But when you're using sophisticated Infrastructure-as-Code like <a href="https://docs.cloudposse.com/components/" target="_blank" rel="noopener noreferrer" class="">Cloud Posse's Terraform components</a>, that initial complexity is already handled—and the operational benefits of a managed node group become far more valuable.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-with-no-nodes-and-the-terraform-catch-22">The Problem with "No Nodes" (and the Terraform Catch-22)<a href="https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/#the-problem-with-no-nodes-and-the-terraform-catch-22" class="hash-link" aria-label="Direct link to The Problem with &quot;No Nodes&quot; (and the Terraform Catch-22)" title="Direct link to The Problem with &quot;No Nodes&quot; (and the Terraform Catch-22)" translate="no">​</a></h2>
<p>EKS cluster creation with Terraform requires certain managed add-ons — like CoreDNS or the EBS CSI driver — to become active before Terraform considers the cluster complete.</p>
<p>But Fargate pods don't exist until there's a workload that needs them. That means when Terraform tries to deploy add-ons, there are no compute nodes for the add-ons to run on. Terraform waits… and waits… until the cluster creation fails.</p>
<p>Terraform enforces a strict dependency model: it won't complete a resource until it's ready. Without a static node group, Terraform can't successfully create the cluster (because the add-ons can't start). And without those add-ons running, Karpenter can't launch its first node (because Karpenter itself is waiting on the cluster to stabilize).</p>
<p>This circular dependency means your beautiful "fully automated" Fargate-only cluster gets stuck in the most ironic place: <strong>bootstrap deadlock</strong>.</p>
<p>You can manually retry or patch things later, but that defeats the purpose of automation. We build for repeatability — not babysitting.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-hidden-cost-of-serverless-nodes">The Hidden Cost of "Serverless Nodes"<a href="https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/#the-hidden-cost-of-serverless-nodes" class="hash-link" aria-label="Direct link to The Hidden Cost of &quot;Serverless Nodes&quot;" title="Direct link to The Hidden Cost of &quot;Serverless Nodes&quot;" translate="no">​</a></h2>
<p>Even after getting past cluster creation, there are subtle but serious issues with high availability.</p>
<p>By AWS and Cloud Posse best practices, production-grade clusters should span three availability zones, with cluster-critical services distributed across them.</p>
<p>However, during initial scheduling with <strong>managed node groups</strong>, Karpenter might spin up just one node large enough to fit all your add-on pods — even if they request three replicas with anti-affinity rules. Kubernetes will happily co-locate them all on that single node.</p>
<p>Once they're running, those pods don't move automatically, even as the cluster grows. The result?</p>
<p><strong>A deceptively healthy cluster with all your CoreDNS replicas living on the same node in one AZ — a single point of failure disguised as a distributed system.</strong></p>
<p>While <a href="https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/" target="_blank" rel="noopener noreferrer" class="">topologySpreadConstraints</a> can help encourage multi-AZ distribution, they don't guarantee it during the critical cluster bootstrap phase when Karpenter is creating its first nodes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-solution-a-minimal-managed-node-pool">The Solution: A Minimal Managed Node Pool<a href="https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/#the-solution-a-minimal-managed-node-pool" class="hash-link" aria-label="Direct link to The Solution: A Minimal Managed Node Pool" title="Direct link to The Solution: A Minimal Managed Node Pool" translate="no">​</a></h2>
<p>Our solution is simple:</p>
<p><strong>Deploy a tiny managed node group — one node per availability zone — as part of your base cluster.</strong></p>
<ul class="space-y-2 !pl-0"><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">This provides a home for cluster-critical add-ons during creation</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">It ensures that CoreDNS, EBS CSI, and other vital components are naturally distributed across AZs</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">It gives Karpenter a stable platform to run on</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">And it eliminates the bootstrap deadlock problem entirely</div></li></ul>
<p>You can even disable autoscaling for this node pool. One node per AZ is enough.</p>
<p>Think of it as your cluster's heartbeat — steady, predictable, and inexpensive.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="additional-fargate-constraints">Additional Fargate Constraints<a href="https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/#additional-fargate-constraints" class="hash-link" aria-label="Direct link to Additional Fargate Constraints" title="Direct link to Additional Fargate Constraints" translate="no">​</a></h2>
<p>Beyond the HA challenges, <a href="https://docs.aws.amazon.com/eks/latest/userguide/fargate-pod-configuration.html" target="_blank" rel="noopener noreferrer" class="">Fargate has architectural constraints</a> that can affect cluster add-ons:</p>
<ul class="space-y-2 !pl-0"><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Each Fargate pod runs on its own isolated compute resource (one pod per node)</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">No support for EBS-backed dynamic PVCs; only EFS CSI volumes are supported</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Fixed CPU and memory configurations with coarse granularity</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">256 MB memory overhead for Kubernetes components</div></li></ul>
<p>While these constraints don't necessarily prevent Fargate from working, they add complexity when running cluster-critical infrastructure that needs precise resource allocation and high availability guarantees.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cost-and-flexibility">Cost and Flexibility<a href="https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/#cost-and-flexibility" class="hash-link" aria-label="Direct link to Cost and Flexibility" title="Direct link to Cost and Flexibility" translate="no">​</a></h2>
<p>Fargate offers convenience, but at a premium. A pod requesting 2 vCPUs and 4 GiB of memory costs about <strong>$0.098/hour</strong>, compared to <strong>$0.076/hour</strong> for an equivalent EC2 c6a.large instance.</p>
<p>And because <a href="https://docs.aws.amazon.com/eks/latest/userguide/fargate-pod-configuration.html" target="_blank" rel="noopener noreferrer" class="">Fargate bills in coarse increments</a>, you often overpay for partial capacity.</p>
<p>By contrast, the hybrid approach unlocks significant advantages:</p>
<ul class="space-y-2 !pl-0"><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Static MNG with On-Demand instances provides a stable foundation for cluster add-ons</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Use cost-effective Graviton instances (c7g.medium) to reduce baseline costs</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Karpenter provisions Spot instances exclusively for application workloads (not add-ons)</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Achieve cost savings on application pods while maintaining reliability for cluster infrastructure</div></li></ul>
<p>The result: <strong>stable cluster services on On-Demand, cost-optimized applications on Spot</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-evolution-of-karpenters-recommendations">The Evolution of Karpenter's Recommendations<a href="https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/#the-evolution-of-karpenters-recommendations" class="hash-link" aria-label="Direct link to The Evolution of Karpenter's Recommendations" title="Direct link to The Evolution of Karpenter's Recommendations" translate="no">​</a></h2>
<p>Interestingly, the Karpenter team's own guidance has evolved over time. <a href="https://karpenter.sh/docs/getting-started/getting-started-with-karpenter/" target="_blank" rel="noopener noreferrer" class="">Karpenter's current getting started guide</a> now defaults to using <strong>EKS Managed Node Groups</strong> in its example configurations, with Fargate presented as an alternative that requires uncommenting configuration sections.</p>
<p>While we can't pinpoint exactly when this shift occurred, it suggests the Karpenter team recognized that managed node groups provide a more reliable foundation for most production use cases.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lessons-learned">Lessons Learned<a href="https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/#lessons-learned" class="hash-link" aria-label="Direct link to Lessons Learned" title="Direct link to Lessons Learned" translate="no">​</a></h2>
<p>At Cloud Posse, we love automation — but we love reliability through simplicity even more.</p>
<p>Running Karpenter on Fargate works for proof-of-concepts or ephemeral clusters.</p>
<p>But for production systems where uptime and high availability matter, a hybrid model is the clear winner:</p>
<ul class="space-y-2 !pl-0"><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Static MNG with On-Demand instances for cluster-critical add-ons (CoreDNS, Karpenter, etc.)</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Karpenter provisioning Spot instances for dynamic application workloads</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Fargate only when you truly need pod-level isolation</div></li></ul>
<p>It's not about Fargate being bad — it's about knowing where it fits in your architecture.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-fargate-only-might-still-work">When Fargate-Only Might Still Work<a href="https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/#when-fargate-only-might-still-work" class="hash-link" aria-label="Direct link to When Fargate-Only Might Still Work" title="Direct link to When Fargate-Only Might Still Work" translate="no">​</a></h2>
<p>To be fair, there are scenarios where running Karpenter on Fargate might make sense:</p>
<ul class="space-y-2 !pl-0"><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Long-lived development environments where the $120/month MNG baseline cost matters more than availability</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Clusters deployed manually (not via Terraform) where bootstrap automation isn't critical</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Proof-of-concept deployments demonstrating Karpenter's capabilities</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Organizations that have accepted the operational trade-offs and built workarounds</div></li></ul>
<p><strong>However</strong>, be aware that development clusters that are frequently rebuilt will hit the Terraform bootstrap deadlock problem more often—making automation failures a regular occurrence rather than a one-time setup issue.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-mileage-may-vary">Your Mileage May Vary<a href="https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/#your-mileage-may-vary" class="hash-link" aria-label="Direct link to Your Mileage May Vary" title="Direct link to Your Mileage May Vary" translate="no">​</a></h2>
<p>It's worth noting that <a href="https://sweetops.slack.com/" target="_blank" rel="noopener noreferrer" class="">experienced practitioners in the SweetOps community</a> have successfully run Karpenter on Fargate for years across multiple production clusters. Their setups work, and they've built processes around the constraints.</p>
<p>This proves our recommendation isn't absolute—some teams make Fargate work through careful configuration and accepted trade-offs. However, these same practitioners acknowledged they'd likely choose MNG if starting fresh today with modern tooling.</p>
<blockquote>
<p>"Karpenter doesn't use voting. Leader election uses Kubernetes leases. There's no strict technical requirement to have three pods — unless you actually care about staying up."</p>
<p>— Ihor Urazov, SweetOps Slack</p>
</blockquote>
<p>That's the key insight. The technical requirements are flexible—it's your operational requirements that determine the right choice.</p>
<p>If staying up matters, if automation matters, if avoiding manual intervention matters, then give your cluster something solid to stand on. A small, stable managed node pool does exactly that.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-about-eks-auto-mode">What About EKS Auto Mode?<a href="https://docs.cloudposse.com/blog/2025/10/15/fargate-vs-managed-node-groups/#what-about-eks-auto-mode" class="hash-link" aria-label="Direct link to What About EKS Auto Mode?" title="Direct link to What About EKS Auto Mode?" translate="no">​</a></h2>
<p>It's worth mentioning that AWS introduced <a href="https://docs.aws.amazon.com/eks/latest/userguide/automode.html" target="_blank" rel="noopener noreferrer" class="">EKS Auto Mode</a> in December 2024, which takes a fundamentally different approach to solving these problems.</p>
<p>EKS Auto Mode runs Karpenter and other critical cluster components (like the EBS CSI driver and Load Balancer Controller) <strong>off-cluster</strong> as AWS-managed services. This elegantly sidesteps the bootstrap deadlock problem entirely—there's no chicken-and-egg dependency because the control plane components don't need to run inside your cluster.</p>
<p>The cluster starts with zero nodes and automatically provisions compute capacity as workloads are scheduled. While this solves the technical bootstrap challenge we've discussed, it comes with trade-offs:</p>
<ul class="space-y-2 !pl-0"><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Additional 12-15% cost premium on top of EC2 instance costs</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Lock-in to AWS VPC CNI (can't use alternatives like Cilium or Calico)</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Less control over cluster infrastructure configuration</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Available only for Kubernetes 1.29+ and not in all AWS regions</div></li></ul>
<p>For organizations willing to accept these constraints in exchange for fully managed operations, EKS Auto Mode may address many of the concerns raised in this post. However, for teams requiring fine-grained control, cost optimization, or running on older Kubernetes versions, the MNG + Karpenter approach remains highly relevant.</p>]]></content:encoded>
            <category>eks</category>
            <category>kubernetes</category>
            <category>karpenter</category>
            <category>fargate</category>
            <category>managed node groups</category>
            <category>aws</category>
            <category>best practices</category>
        </item>
        <item>
            <title><![CDATA[Announcing Platform Advisory]]></title>
            <link>https://docs.cloudposse.com/blog/2025/06/01/platform-advisory/</link>
            <guid>https://docs.cloudposse.com/blog/2025/06/01/platform-advisory/</guid>
            <pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Our new Platform Advisory service gives teams private, on-demand access to senior Cloud Posse engineers—perfect for de-risking migrations and supporting high-stakes platform decisions.]]></description>
            <content:encoded><![CDATA[<div class="intro"><p>We're excited to announce our new <strong>Platform Advisory</strong> service—now available to Cloud Posse customers. Private access to Cloud Posse engineers.</p></div>
<p>Many of our larger customers—especially in <strong>fintech, health tech</strong>—who operate in regulated industries have asked for a way to get <strong>private, real-time access</strong> to senior Cloud Posse engineers for their most critical projects.</p>
<p>These teams often run into scenarios where:</p>
<ul class="space-y-2 !pl-0"><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]"><strong>Delays, mistakes, or failed migrations would cost big</strong></div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">They need to <strong>de-risk complex platform changes</strong></div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">They want trusted guidance on <strong>Cloud Posse architecture and components</strong>—from the engineers who built it</div></li></ul>
<p><strong>Platform Advisory</strong> was designed specifically to address these needs.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-platform-advisory">What is Platform Advisory?<a href="https://docs.cloudposse.com/blog/2025/06/01/platform-advisory/#what-is-platform-advisory" class="hash-link" aria-label="Direct link to What is Platform Advisory?" title="Direct link to What is Platform Advisory?" translate="no">​</a></h2>
<p>Platform Advisory gives your team:</p>
<ul class="space-y-2 !pl-0"><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]"><strong>Private Slack Connect</strong> → direct access to Cloud Posse’s staff-to-principal-level engineers</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]"><strong>On-demand Zoom sessions</strong> → architecture reviews, migration planning, compliance discussions, and more</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]"><strong>Same-day response (4-hour SLA)</strong> → for high-impact requests</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]"><strong>10 hrs/month of Flexible Support included</strong> → for bug fixes, upgrades, Atmos enhancements, new components, and integration work</div></li></ul>
<p>It’s designed for teams running on <strong>Cloud Posse’s reference architecture and open source components</strong> who need priority access to expert guidance—especially when getting it wrong isn’t an option.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-we-built-this">Why we built this<a href="https://docs.cloudposse.com/blog/2025/06/01/platform-advisory/#why-we-built-this" class="hash-link" aria-label="Direct link to Why we built this" title="Direct link to Why we built this" translate="no">​</a></h2>
<p>As more of our customers adopt Cloud Posse architecture for <strong>mission-critical platforms</strong>, they’ve asked for a way to engage more deeply—especially for projects where <strong>de-risking migrations and accelerating delivery</strong> matters.</p>
<p>When the team is facing a complex migration, rolling out new environments, or making high-impact platform changes—<strong>waiting days for answers isn’t good enough</strong>.</p>
<p>Platform Advisory gives them <strong>priority access</strong> to engineers who:</p>
<ul class="space-y-2 !pl-0"><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Know Cloud Posse architecture inside and out</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Understand their environments and goals</div></li><li class="flex items-start gap-3"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="w-5 h-5 text-green-500 flex-shrink-0 mt-[2px]"><path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 1 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z" clip-rule="evenodd"></path></svg><div class="text-lg leading-[1.4]">Can chart the best path forward quickly and safely</div></li></ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-fits-with-our-other-support-options">How it fits with our other support options<a href="https://docs.cloudposse.com/blog/2025/06/01/platform-advisory/#how-it-fits-with-our-other-support-options" class="hash-link" aria-label="Direct link to How it fits with our other support options" title="Direct link to How it fits with our other support options" translate="no">​</a></h2>
<table><thead><tr><th>Support Option</th><th>Best For</th></tr></thead><tbody><tr><td><strong>Essential Support</strong></td><td>Self-service teams who want async guidance</td></tr><tr><td><strong>Flexible Support</strong></td><td>Scheduled hands-on engineering work</td></tr><tr><td><strong>Platform Advisory</strong></td><td>Teams where delays, mistakes, or failed migrations would cost big</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-to-learn-more">Where to learn more<a href="https://docs.cloudposse.com/blog/2025/06/01/platform-advisory/#where-to-learn-more" class="hash-link" aria-label="Direct link to Where to learn more" title="Direct link to Where to learn more" translate="no">​</a></h2>
<p>You can explore all the details on the <a class="" href="https://docs.cloudposse.com/support/platform-advisory/">Platform Advisory support page</a>.</p>
<p>If you’re unsure whether Platform Advisory is the right fit for your team, <a class="" href="https://docs.cloudposse.com/support/">reach out to us</a>—we’re happy to help.</p>
<p><strong>Remember</strong>: When you invest in Cloud Posse, you’re not just helping your team—you’re strengthening the ecosystem your business depends on.</p>
<p>We’re excited to make <strong>Platform Advisory</strong> available—and we look forward to helping more teams succeed on Cloud Posse architecture.</p>]]></content:encoded>
            <category>support</category>
            <category>platform advisory</category>
            <category>premium support</category>
            <category>announcement</category>
        </item>
        <item>
            <title><![CDATA[Automated Component Testing]]></title>
            <link>https://docs.cloudposse.com/blog/automated-component-testing/</link>
            <guid>https://docs.cloudposse.com/blog/automated-component-testing/</guid>
            <pubDate>Fri, 21 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We're excited to announce the completion of the second phase of our Component Testing project, which has added automated testing for 27 components. This milestone follows our successful migration of 160+ Terraform Components from a monorepo to individual repositories, making them more maintainable and testable.]]></description>
            <content:encoded><![CDATA[<div class="intro"><p>We're excited to announce the completion of the second phase of our Component Testing project, which has added automated testing for 27 components. This milestone follows our successful migration of 160+ Terraform Components from a monorepo to individual repositories, making them more maintainable and testable.</p></div>
<p>Hello SweetOps!</p>
<p>A few months ago, we embarked on a MASSIVE project to enable Component Testing.</p>
<p>The goal is to improve the stability of our components, detect and fix integration errors, and pave the way for confident delivery of new features. In the first phase, we split the <a href="https://github.com/cloudposse/terraform-aws-components" target="_blank" rel="noopener noreferrer" class=""><code>cloudposse/terraform-aws-components</code></a> monorepo consisting of 160+ Terraform Components into individual repositories in the <a href="https://github.com/cloudposse-terraform-components" target="_blank" rel="noopener noreferrer" class=""><code>cloudposse-terraform-components</code></a> GitHub organization. We updated the <a href="https://github.com/cloudposse/github-action-atmos-component-updater" target="_blank" rel="noopener noreferrer" class=""><code>cloudposse/github-action-atmos-component-updater</code></a> GitHub action to rewrite URLs in component manifests automatically, allowing you to smoothly migrate to new repositories.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="current-status">Current Status<a href="https://docs.cloudposse.com/blog/automated-component-testing/#current-status" class="hash-link" aria-label="Direct link to Current Status" title="Direct link to Current Status" translate="no">​</a></h2>
<p>Now, we are happy to announce that we have completed the second phase of this project, introducing automated tests for the first 27 components. Hopefully, you are already using components from the <a href="https://github.com/cloudposse-terraform-components" target="_blank" rel="noopener noreferrer" class="">new organization</a>!</p>
<p>The complete list of covered components can be found <a href="https://github.com/orgs/cloudposse-terraform-components/projects/1/views/3" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<p>We've developed a Go-based <a href="https://github.com/cloudposse/test-helpers" target="_blank" rel="noopener noreferrer" class="">testing framework</a> built on top of Terratest, optimized specifically for testing Atmos components.<br>
<!-- -->Additionally, we created a <a href="https://docs.cloudposse.com/community/contribute/component-testing/" target="_blank" rel="noopener noreferrer" class="">step-by-step guide</a> to help you write effective component tests.<br>
<!-- -->You can track the project's progress on <a href="https://github.com/orgs/cloudposse-terraform-components/projects/1/views/1" target="_blank" rel="noopener noreferrer" class="">this board</a>.</p>
<p>We invite everyone to contribute to this project.</p>
<p>Please like the "Add component tests" issue in the corresponding component repository for which you are interested in prioritizing test coverage. If you want to contribute more, we have the opportunity.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-can-you-help">How can you help?<a href="https://docs.cloudposse.com/blog/automated-component-testing/#how-can-you-help" class="hash-link" aria-label="Direct link to How can you help?" title="Direct link to How can you help?" translate="no">​</a></h2>
<p>We really need help writing tests.</p>
<p>You can take any "Add component tests" issue with the "Good First Question" label and contribute to the test following our <a href="https://docs.cloudposse.com/community/contribute/component-testing/" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</p>
<p>We will prioritize reviewing your PRs in the <code>#pr-reviews</code> channel and help ensure they get merged smoothly.. Feel free to DM to <code>@Erik Osterman</code> or <code>@Igor Rodionov</code> in Slack with any questions or feedback.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Join the Conversation!</div><div class="admonitionContent_BuS1"><p>Want to help shape the future of our Terraform components? We're building it <em>in the open</em> and you're invited.<br>
<!-- -->Join us in the <a href="https://cloudposse.com/slack" target="_blank" rel="noopener noreferrer" class="">SweetOps Slack</a> to chat about component testing, automation, and all things Terraform.</p></div></div>
<p>P.S.: Huge thanks to <code>@RoseSecurity</code> for the first community-driven component test contribution <a href="https://github.com/cloudposse-terraform-components/aws-vpc/pull/25" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>]]></content:encoded>
            <category>testing</category>
            <category>components</category>
            <category>automation</category>
        </item>
        <item>
            <title><![CDATA[Terraform Component GitHub Repository Has Moved!]]></title>
            <link>https://docs.cloudposse.com/blog/terraform-components-have-moved/</link>
            <guid>https://docs.cloudposse.com/blog/terraform-components-have-moved/</guid>
            <pubDate>Tue, 12 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[The GitHub repository for Cloud Posse's Terraform components has migrated to a dedicated GitHub organization. All documentation remains here, but all future updates, contributions, and issue tracking for the source code should now be directed to the respective repositories in the new organization.]]></description>
            <content:encoded><![CDATA[<div class="intro"><p>The GitHub repository for Cloud Posse's Terraform components has migrated to a dedicated GitHub organization. All documentation remains here, but all future updates, contributions, and issue tracking for the source code should now be directed to the respective repositories in the new organization.</p></div>
<p>We're excited to announce that starting on November 12, 2024, we will begin migrating each component in the <code>cloudposse/terraform-aws-components</code> repository to individual repositories under a new GitHub organization. This change aims to improve the stability, maintainability, and usability of our components.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-migration">Why This Migration?<a href="https://docs.cloudposse.com/blog/terraform-components-have-moved/#why-this-migration" class="hash-link" aria-label="Direct link to Why This Migration?" title="Direct link to Why This Migration?" translate="no">​</a></h2>
<p>Our goal is to make each component easier to use, contribute to, and maintain. This migration will allow us to:</p>
<div class="steps_nwr1"><ul class="list-disc pl-8 my-4">
<li class="my-1">Leverage terratest automation for better testing</li>
<li class="my-1">Implement semantic versioning to clearly communicate updates and breaking changes</li>
<li class="my-1">Improve PR review times and accelerate community contributions</li>
<li class="my-1">Enable Dependabot automation for dependency management</li>
<li class="my-1">And much more!</li>
</ul></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-to-expect-starting-november-12-2024">What to Expect Starting November 12, 2024<a href="https://docs.cloudposse.com/blog/terraform-components-have-moved/#what-to-expect-starting-november-12-2024" class="hash-link" aria-label="Direct link to What to Expect Starting November 12, 2024" title="Direct link to What to Expect Starting November 12, 2024" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="migration-timeline">Migration Timeline<a href="https://docs.cloudposse.com/blog/terraform-components-have-moved/#migration-timeline" class="hash-link" aria-label="Direct link to Migration Timeline" title="Direct link to Migration Timeline" translate="no">​</a></h3>
<p>The migration will begin on November 12 and is anticipated to finish by the end of the following week.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="code-freeze">Code Freeze<a href="https://docs.cloudposse.com/blog/terraform-components-have-moved/#code-freeze" class="hash-link" aria-label="Direct link to Code Freeze" title="Direct link to Code Freeze" translate="no">​</a></h3>
<p>Starting on November 12, this repository will be set to read-only mode, marking the beginning of a code freeze. No new pull requests or issues will be accepted here after that date.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-contribution-workflow">New Contribution Workflow<a href="https://docs.cloudposse.com/blog/terraform-components-have-moved/#new-contribution-workflow" class="hash-link" aria-label="Direct link to New Contribution Workflow" title="Direct link to New Contribution Workflow" translate="no">​</a></h3>
<p>After the migration, all contributions should be directed to the new individual component repositories.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="updated-documentation">Updated Documentation<a href="https://docs.cloudposse.com/blog/terraform-components-have-moved/#updated-documentation" class="hash-link" aria-label="Direct link to Updated Documentation" title="Direct link to Updated Documentation" translate="no">​</a></h3>
<p>To support this transition, we are updating our documentation and cloudposse-component updater.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="future-archiving">Future Archiving<a href="https://docs.cloudposse.com/blog/terraform-components-have-moved/#future-archiving" class="hash-link" aria-label="Direct link to Future Archiving" title="Direct link to Future Archiving" translate="no">​</a></h3>
<p>In approximately six months, we plan to archive this repository and transfer it to the cloudposse-archives organization.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="frequently-asked-questions">Frequently Asked Questions<a href="https://docs.cloudposse.com/blog/terraform-components-have-moved/#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently Asked Questions" title="Direct link to Frequently Asked Questions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="does-this-affect-terraform-modules">Does this affect Terraform modules?<a href="https://docs.cloudposse.com/blog/terraform-components-have-moved/#does-this-affect-terraform-modules" class="hash-link" aria-label="Direct link to Does this affect Terraform modules?" title="Direct link to Does this affect Terraform modules?" translate="no">​</a></h3>
<p>No, only the <code>terraform-aws-components</code> repository is affected. Our Terraform modules will remain where they are.</p>
<p>We are committed to making this transition as seamless as possible. If you have any questions or concerns, please feel free to post them in this issue. Your feedback is important to us, and we appreciate your support as we embark on this new chapter!</p>]]></content:encoded>
            <category>terraform</category>
            <category>github</category>
            <category>migration</category>
        </item>
    </channel>
</rss>