cloud-foundation-principles/skills/multi-account-from-day-one/SKILL.md
This skill should be used when the user is setting up a new cloud project, designing account or project structure, creating environment isolation, configuring organization units or management groups, implementing landing zones, or deciding how to separate dev and prod workloads. Covers multi-account strategy, blast radius isolation, landing zone setup, and organizational governance.
npx skillsauth add oborchers/fractional-cto multi-account-from-day-oneInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Running development and production in a single cloud account is the most common shortcut in early-stage infrastructure, and it is cheap to fix on day one -- one afternoon of work. Six months later, when production databases share IAM policies with developer sandboxes, when billing is an undifferentiated blob, and when a misconfigured dev deployment takes down prod, the fix becomes a full migration measured in weeks. Multi-account isolation is not a scale concern. It is a day-one concern.
A single cloud account creates invisible couplings that compound over time:
| Problem | Single Account | Multi-Account | |---------|---------------|---------------| | Blast radius | A dev IAM policy change can affect prod resources | Accounts are hard boundaries; dev cannot touch prod | | Billing | All costs in one bucket; cost attribution requires tagging discipline | Per-account billing is automatic and unambiguous | | Permissions | Everyone who can deploy to dev can potentially access prod secrets | Cross-account access requires explicit trust policies | | Service quotas | Dev load tests consume prod quota | Each account has independent quotas | | Compliance | Auditors must review everything; no clean scope boundary | Prod account is the audit scope; dev is excluded | | Credential blast | One leaked key exposes everything | One leaked key exposes one environment |
The longer you wait, the worse each problem gets. Resources accumulate. IAM policies intertwine. Developers build tooling that assumes a single account. Every day you delay makes the eventual migration more expensive.
Start with six accounts or projects. This is the minimum that provides meaningful isolation:
Organization Root
├── Management Account -- SSO, billing, organization policies
│
├── Security OU -- (GCP: Folder, Azure: Management Group)
│ ├── security -- Centralized security services
│ └── log-archive -- Immutable, centralized audit logs
│
├── Sandbox OU
│ └── sandbox -- Unrestricted experimentation, no prod access
│
└── Workloads OU
├── dev -- Development workloads
└── prod -- Production workloads
Six accounts. One afternoon. This gives you environment isolation, a dedicated security boundary, centralized audit logging, a safe experimentation space, and clean billing separation from day one. All three major cloud providers (AWS Control Tower, GCP Cloud Foundation Toolkit, Azure Landing Zones) include a centralized logging account by default.
As your team and workloads grow, expand the structure:
| Account | Add When | Purpose |
|---------|----------|---------|
| cicd | You adopt self-hosted runners | Isolate CI/CD compute from application workloads |
| staging | You need a prod-like pre-release env | Full production mirror for release validation |
| data or ml-training | GPU or large data workloads | Isolate expensive compute with separate quotas and billing |
Do not create person-specific accounts. Use team-based identities and shared accounts with role-based access. Person-specific accounts create credential sprawl and make offboarding a security risk.
Manually creating accounts and configuring guardrails does not scale past three accounts. Use your cloud provider's landing zone tooling to automate account provisioning, enforce baseline policies, and centralize governance.
A landing zone provides:
# Organization structure -- Terraform manages the hierarchy
resource "cloud_organization" "root" {
feature_set = "ALL"
}
resource "cloud_organizational_unit" "security" {
name = "Security"
parent_id = cloud_organization.root.roots[0].id
}
resource "cloud_organizational_unit" "workloads" {
name = "Workloads"
parent_id = cloud_organization.root.roots[0].id
}
resource "cloud_organizational_unit" "workloads_prod" {
name = "Production"
parent_id = cloud_organizational_unit.workloads.id
}
resource "cloud_organizational_unit" "workloads_dev" {
name = "Development"
parent_id = cloud_organizational_unit.workloads.id
}
# DO NOT DO THIS -- "environment" tags are not isolation boundaries
resource "cloud_instance" "web" {
instance_type = "t3.micro"
tags = {
Environment = "prod" # This tag does NOT prevent dev from touching it
}
}
resource "cloud_instance" "web_dev" {
instance_type = "t3.micro"
tags = {
Environment = "dev" # Same account, same IAM, same blast radius
}
}
Tags are metadata, not security boundaries. An IAM policy that grants ec2:* in a single account grants it to both "prod" and "dev" tagged resources. Only account-level separation provides true isolation.
Centralize identity in the management account. Federate from an external identity provider (Google Workspace, Okta, Microsoft Entra ID) so that disabling a person in the IdP immediately revokes all cloud access.
| Tier | Dev/Sandbox Access | Prod Access | Assigned To | |------|-------------------|-------------|-------------| | Admin | Full | Full (time-boxed) | Platform team (2-3 people) | | Developer | Full | Read-only + targeted exceptions | Engineering team | | Auditor | Read-only | Read-only | Compliance, external auditors |
Developers should have full access in dev and sandbox but only read-only access in production. Targeted exceptions allow specific actions like viewing logs, connecting to debugging sessions, or reading container registries. No one should have permanent write access to production -- use time-boxed elevated access for incident response.
CI/CD pipelines authenticate to each account via workload identity federation (OIDC), not static API keys. Each account has its own CI/CD role with a trust policy restricting which repositories can assume it. This means zero stored secrets in your CI/CD system -- no API keys to rotate, no credentials to leak.
The multi-account angle: every account needs its own OIDC role. The trust policy in the dev account allows broader repository access (any branch), while the production account restricts to tag refs only (see the tag-based-production-deploys skill for the tag-driven deployment model). For the complete OIDC setup (provider configuration, trust policies, subject claim restrictions, per-provider Terraform), see the zero-static-credentials skill.
Use distribution lists or group aliases for account root emails, never personal addresses:
[email protected] -- Management/root account
[email protected] -- Security account
[email protected] -- Log archive account
[email protected] -- Sandbox account
[email protected] -- Development account
[email protected] -- Production account
Personal email addresses tied to accounts create single points of failure. When that person leaves, account recovery becomes a support ticket nightmare.
| Concept | AWS | GCP | Azure | |---------|-----|-----|-------| | Organization hierarchy | Organizations + OUs | Organization + Folders | Management Groups | | Landing zone automation | Control Tower | Cloud Foundation Toolkit | Azure Landing Zones (CAF) | | Account/project creation | AWS Account Factory | Project Factory | Subscription vending | | Guardrails / policies | Service Control Policies (SCPs) | Organization Policies | Azure Policy | | Centralized identity | IAM Identity Center (SSO) | Cloud Identity + Workforce IdF | Microsoft Entra ID | | Cross-account roles | IAM Roles + trust policies | Service account impersonation | Managed Identity + RBAC | | Billing isolation | Per-account billing | Per-project billing | Per-subscription billing | | Security delegation | Delegated administrator | Organization-level security | Microsoft Defender for Cloud |
Working implementations in examples/:
examples/organization-structure.md -- Terraform module that creates a six-account organization with OUs, account email conventions, and baseline policiesexamples/cross-account-roles.md -- Terraform configuration for CI/CD OIDC federation and developer cross-account access with least-privilege permissionsWhen designing or reviewing cloud account structure:
tools
This skill should be used when the user invokes any /plan-* command from the planning-tools plugin (/plan-context, /plan-master, /plan-open-questions, /plan-verify, /plan-tick, /plan-progress, /plan-delete), asks how Claude Code's plan files work, asks where plans are stored, asks to author or audit a multi-phase master planning document, asks how to walk through a plan's Open Questions interactively, asks how to write progress entries, or mentions ~/.claude/plans/ or .claude/planning-tools.local.md. Provides the index of planning-tools commands, the master-plan workflow lifecycle, the v0.3.0+ list-shape mandate (phases and questions as headings + bulleted scope items, never tables), the v0.3.2+ plain-bullet shape (no `- [ ]` checkboxes — heading emoji is the sole tick signal), the progress-entry methodology, and the mechanics of Claude Code's plan-mode file storage.
testing
This skill should be used by the plan-verifier agent and the /plan-verify command to audit a drafted master plan against a fixed checklist. Covers universal-core completeness, the v0.3.0+ no-tables-for-phases-or-questions rule, trigger-based section-coverage gaps, phase actionability (heading + per-phase TL;DR + bulleted scope + exit criteria), the v0.3.1+ per-phase TL;DR requirement, the v0.3.2+ plain-bullet scope shape (legacy `- [ ]`/`- [x]` accepted silently), the v0.3.3+ context-block shape (plan-level `**TL;DR:**` + bulleted metadata, legacy `>` blockquote accepted silently), integer phase numbering enforcement, dependency traceability, citation resolution, callout/evidence convention compliance, Open Questions placement, and the one-PR-per-master-plan rule. Single-owner of the audit checklist.
tools
This skill should be used when authoring, reviewing, or modifying a multi-phase master planning document via the planning-tools plugin (especially the /plan-master and /plan-verify commands). Codifies the universal core sections, trigger-based optional sections, integer-only phase numbering, Open Questions placement, one-PR-per-plan rule, status conventions, evidence attribution, callouts, cross-reference formats, the v0.3.0 list-shape mandate (phases and questions are heading + bulleted list, never markdown tables), the v0.3.1 per-phase TL;DR requirement (1–3 sentence what/why summary under each phase heading for glance-ability), the v0.3.2 plain-bullet scope shape (`- <action>` items, no `- [ ]` checkboxes — the phase status emoji is the sole tick signal), and the v0.3.3 context-block shape (a plan-level `**TL;DR:**` + a bulleted metadata list instead of a `>` blockquote; legacy blockquote blocks accepted silently). Project-agnostic — no ticket-prefix or plan-type taxonomy.
testing
This skill should be used when the user is adjusting spacing, padding, margins, content density, section gaps, vertical rhythm, or separation between elements. Also applies when reviewing whether a design feels cramped or too sparse, choosing between borders and whitespace for separation, or defining a spacing system. Covers the 4px/8px spacing system, macro vs micro whitespace, content density spectrum, separation techniques (whitespace > background shifts > borders), and vertical rhythm.