Designing an AWS Account Strategy that actually scales
Michael Aicher
Cloud Architect at Netcloud AG, focused on AWS platform design, governance, and infrastructure automation with Terraform, and scalable infrastructure solutions in general.
Tags
Designing an AWS Account strategy that actually scales
Designing an AWS account structure is one of the earliest architectural decisions teams should make - and one of the hardest to change later. Too often, account strategies evolve organically, driven by short-term needs, until they become a constraint instead of an enabler. Or they simply don't exist at all and one big AWS account must take the whole burden of hosting multiple workloads - a setup that introduces significant security and operational risk and should be untangle as soon as possible.
In this post, I want to share a pragmatic approach to AWS account strategy based on what I’ve seen work (and fail) in real-world environments.
Why account strategy matters more than you might think
An AWS account is more than a billing container. It is a security boundary, a blast-radius limiter, a governance unit, and provides a simple cost attribution mechanism.
It's a "natural" isolation with the full power of AWS available and most importantly, this comes all without a $-sign, an AWS account itself is free. It starts to cost money once you start deploying actual resources into it.
If your account strategy is unclear or inconsistent, everything built on top of it — networking, IAM, compliance, cost management — becomes harder than necessary.
The challenge is not choosing one model, but choosing a model that can evolve as teams, workloads, and compliance requirements grow.
From experience, the biggest scaling problems I’ve seen were rarely caused by AWS service limits. They almost always stemmed from unclear account ownership, missing guardrails, and manual provisioning processes that did not keep up with organizational growth.
The most common anti-patterns
Although I prefer to learn from success rather than failure, it is important to be aware of the patterns that exist in general. Recognizing them helps you identify where your organization currently stands and what risks might already be present.
The single-account setup
Definitely one of the most widespread setups, as it is so easy to just start with one AWS account and focus on "more important things" as it is simply working.
To be clear, a single AWS account is not inherently limiting and works perfectly fine for experimentation, proof-of-concepts, or very small teams. However, it does not scale and it's protection measurments are far less evolved than what is possible in a multi-account setup. Just imagine the blast radius: if the account is taken over, each and every application you're running in it is affected and potentially deleted, blocked and/ or misused.
Those single-account setups usally come with the following symptoms:
- Shared IAM roles across unrelated workloads
- Fear of making changes due to unknown impacts
- No clear separation between environments and workloads
Once multiple teams and production workloads exist, a single account becomes a bottleneck. I would go even further, as soon as you have to deploy a second independant workload, you will start increasing your risk significantly.
The “one account per environment” trap
A common next step is to separate by environment: one account for production, one for staging, one for development, and so on. While this is slightly better than a single account for everything, the same problems reappear once additional workloads or teams are introduced.
This will usually end with permissions that are "temporarily" broadened and in most cases never revoked. Costs will be a pure nightmare to allocate to specific teams or workloads, although this is possible, but requires a very disciplined tagging strategy which introduces additional operational complexity. At the same time, the blast radius of a shared production account grows with every added workload.
Although this approach may seem reasonable at first glance, it doesnt scale safely like we would like to have it.
The uncontrolled account sprawl
Lets follow one of the marketing phrases of DevOps and shift left, let everyone be responsible for their accounts and let them freely create them...one per service, one per team, one per use case, one per everything.
While shared responsibility is desirable, this approach leads to pure chaos and an enourmous risk if you don't have the right guardrails in place and enforce them.
Security baselines become inconsistent, networking and connectivity models fragment quickly, onboarding differs from team to team, and to satisfy governance requirements will become a trilogy of nightmares.
Accounts alone are not enough for a solid foundation and especially not to solve your governance problems. A structured strategy combined with automation does.
A pragmatic way to think about account boundaries
Instead of starting with environments, start with ownership and blast radius. Think about similarities and relations between workloads.
A good starting point is to ask:
Who owns this workload, how much isolation does it require and what are its connections?
In practice, this often leads to:
- accounts owned by teams or domains, not environments
- separate accounts for production vs. non-production at the workload level
- shared platform and infrastructure accounts with strict access controls
This model scales better because ownership is clear, permissions remain understandable and you can profit from synergies.
AWS Organizations as the foundation, AWS Control Tower as baseline enabler
AWS Organizations becomes essential once you operate more than a handful of accounts. It is your first step for reducing duplication and complexity by centralizing billing and providing cost visibility over all your AWS accounts.
In addition, you get one of the most important security mechanisms to setup your security baseline - Service Control Policies (SCPs). SCPs act as preventive guardrails that are applied outside of your workload accounts, to restrict permissions at the principal level.
But SCPs are not the only policies you will get, AWS recently introduced Resource Control Policies (RCPs) that allow you to restrict your resources (e.g. S3 bucket or KMS key policies) to ensure they are not allowing unintended external access.
Beside those two very crucial policy types, AWS Organizations provides as well AI-opt-out policies, backup policies and tag policies. This allows you to protect your sensitive data, ensures you have a Plan B in an incident situation out of the box and heavily reduces the variations of your "environment" tags. And all of this happens on an organization level and gets automatically applied to all your (new) AWS accounts.
However, AWS Organizations alone is not a strategy. It is an enabler.
Without the right configuration of these policies and a clear guide how your Accounts get grouped - you wont achieve your goals.
To be crystal clear, an AWS Organization setup is not done with defining the organization chart, it only becomes production ready when you define and configure the policies, take care of the delegation of powers, properly integrate your services on an organization level and have a consistent procedure to provision AWS accounts (landing zones) in place. This doesnt have to be automated on day one, but it must be consistent.
AWS Control Tower can simplify this initial setup by providing standardized account provisioning and dedicated accounts for security and auditing. It offers a solid baseline that can be extended over time with options to establish security controls in your organization.
Guardrails before freedom
Due to their importance I want to emphasize guardrails a bit more in detail. They can be implemented using SCPs or RCPs within the AWS Organizations service (or via AWS Control Tower controls, which are ultimately managed SCPs or AWS Config rules).
For a successfull multi-account strategy, guardrails must be applied before a new AWS account is handed over to its owner.
They enforce baseline IAM configurations, can (and definitely should) restrict available AWS regions and services and ensure no one can use the most powerful AWS account access, the account-root-user. In practice, these guardrails will cover most probably 80% - 90% of your governance requirements.
These controls should be defined by code and applied automatically during account provisioning, not just as documented expectations.
With the power of guardrails and the fact that they are managed outside of the workload accounts, always keep in mind, that the goal is not to restrict teams, but to remove entire classes of mistakes without slowing them down to complete halt.
From manual provisioning to self-service
With this in mind, it becomes more and more mandatory to automate - your AWS organizations configuration & management AND also the creation of your AWS accounts. Everything can be set up just like in a picture book, but if you need 6 weeks to provide your teams a new AWS account, they will most probably fall back to one account that works for them and they don't care anymore if it contains another workload already.
In other words, account creation is a top notch candidate for becoming a bottleneck, a source of configuration drift and an operational risk.
To mitigate this, it is highly recommended to automate the account provisioning process, e.g. in a first step by defining account types (workloads, sandbox, shared, etc) which get different, predefined guardrails and default resources applied.
To get a scalable landing zone this should be written with some kind of (Infrastructure as) Code, to ensure repeatability and automation, without manual intervention which is then the basis for the final form of your landing zone.
Ideally, this is exposed through a self-service interface, allowing account owners to request changes, such as enabling an additional region in an AWS account through an auditable workflow including an approval process.
To be clear, self-service does not mean “anything goes” — it means fast, safe, and repeatable within established guardrails.
Designing for evolution, not perfection
One of the most important learnings in IT (definitely not only in cloud!) is that there is one consistency - and this is change. For AWS this means, there is at least one phase every year, where new features pop out of every service in AWS. Some make your life much easier, some make your so far "perfect" architecture require a complete refactor and many of them provide you with options to make your environment more secure.
The most important principle is therefore:
Your account strategy must be able to change.
What works for five accounts will not work for 50. What works for 50 may not work for 200.
To be prepared for this, define clear ownership, automate (with code) everything that repeats, separate platform concerns from workloads and most importantly - evolve incrementally instead of aiming for a “final” design.
There is no universal best practice — only patterns that fit your organization today and can adapt tomorrow.
AWS account strategy is not a one-time decision. It is a platform concern that deserves continuous architectural attention right from the beginning.
What’s next
In a future post, I’ll dive deeper into practical details: how organizational structures might look, which guardrails are commonly recommended, and how they can be implemented with real-world code examples.
I will also explore dynamic landing zone design, what works well to be centralized in an organization and how to stay ahead of cloud costs.