How to Set Up AWS Control Tower for Multi-Account Governance
Quick summary: AWS Control Tower automates multi-account management — setting up guardrails, enforcing compliance policies, and centralizing billing. This guide covers setup, customization, and production governance patterns.
Key Takeaways
- AWS Control Tower automates multi-account management — setting up guardrails, enforcing compliance policies, and centralizing billing
- AWS Control Tower automates multi-account management — setting up guardrails, enforcing compliance policies, and centralizing billing
Table of Contents
AWS Control Tower orchestrates a multi-account AWS environment with automated governance, guardrails, and compliance. Instead of manually managing organizational units, service control policies, and logging across 20+ accounts, Control Tower sets up the entire foundation in a few hours.
This guide covers setup, configuring guardrails, automating account creation, and implementing production governance patterns.
Building Multi-Account AWS? FactualMinds helps teams architect scalable AWS organizations with Control Tower, custom guardrails, and account governance. See our managed services or talk to our team.
Step 1: Understand Control Tower Architecture
Control Tower creates a multi-account landing zone with three core components:
1. Organizational Units (OUs)
Control Tower creates three OUs:
- Root — contains all accounts (you don’t work here)
- Security — contains Audit and Log Archive accounts (AWS-managed, read-only)
- Sandbox — for experimentation (new accounts auto-provisioned here)
You add additional OUs:
- Production — production workloads (strict guardrails)
- Development — development/staging (loose guardrails)
- Machine Learning — data science (GPU access, high limits)
2. Guardrails
Preventive guardrails use SCPs to block non-compliant actions. Detective guardrails use Config to log violations.
Example preventive guardrails:
- Prevent IAM access key creation
- Prevent root account access
- Require encryption on EBS volumes
3. Centralized Logging
All accounts send logs to the Log Archive account:
- CloudTrail logs (API calls)
- Config logs (resource compliance)
- CloudWatch Logs (application logs, optional)
Step 2: Prerequisites and Planning
Before starting, decide:
Account Structure
Minimal: 3 accounts
Management (billing, governance)
├── Security (audit, logging)
└── Development (dev/test)
Standard: 5+ accounts
Management
├── Security (audit, logging)
├── Production (workloads)
├── Development (dev/test)
├── Sandbox (experiments)
└── Data (analytics, separate cost center)
Enterprise: 15+ accounts per business unit
Management
├── Security
├── Production
├── Development
├── Sandbox
├── Finance-Prod
├── Finance-Dev
├── ML-GPU
├── ML-Dev
└── ...
Email Address Planning
Each account needs a unique email. Set up email forwarding:
management@company.com → security-team@company.com
security-audit@company.com → security-team@company.com
prod-workload@company.com → devops-team@company.com
dev-sandbox@company.com → developers@company.com
Use AWS Organizations to manage these or create a shared mailbox.
Step 3: Enable AWS Organizations
Control Tower requires AWS Organizations. If you don’t have it, enable it:
aws organizations create-organization --feature-set ALL
# Returns: organization ARN and root ID
Check current structure:
aws organizations list-roots
aws organizations list-accounts
Step 4: Set Up Control Tower Landing Zone
Prerequisites Checklist
- AWS Organizations enabled
- 3 email addresses ready (management, audit, log archive)
- No existing CloudTrail in the region (Control Tower will create it)
- No existing Config aggregator (Control Tower will create it)
- Root account has 24-hour absence of activity (security check)
Launch Control Tower
- Go to AWS Console → AWS Control Tower → Get Started
- Review Home Region: Select the region where landing zone will live (us-east-1 recommended for most accounts)
- Configure Management Account:
- Email: your-management@company.com
- Account name: Management
- Create Audit Account:
- Email: your-audit@company.com
- Name: Audit
- Create Log Archive Account:
- Email: your-log-archive@company.com
- Name: LogArchive
- Review and Create: Click “Create Landing Zone”
Time: 30-60 minutes. Control Tower will:
- Create the two new accounts
- Set up OUs (Security, Sandbox)
- Enable CloudTrail across all accounts
- Enable Config rules for compliance
- Set up a centralized S3 bucket for logs
Monitor progress in Control Tower → Dashboard → Landing Zone Status.
Step 5: Configure Guardrails
Guardrails are compliance rules. Control Tower provides ~40 guardrails; enable cautiously.
Recommended Guardrails for Most Teams
Must-Have (Preventive)
- Require MFA for root account
- Disallow root account access (SCPs)
- Enforce encryption on S3 buckets
- Enforce CloudTrail logging
Should-Have (Preventive)
- Prevent IAM policy changes (except approved roles)
- Prevent VPC security group changes
- Enforce encryption on EBS volumes
Nice-to-Have (Detective)
- Detect unencrypted S3 buckets
- Detect missing tags on resources
- Detect overly-permissive IAM policies
Enable Guardrails
- Go to AWS Control Tower → Guardrails
- Select guardrail category: Preventive or Detective
- Click Enable guardrail
- Select Organization Unit (OU) to apply (e.g., Security, Production)
- Click Enable
Best practice: Enable on Production OU first, test for 1 week, then expand to other OUs.
Example: Enforce S3 Encryption
- Search: “Disallow unencrypted object uploads”
- Guardrail type: Preventive
- Apply to: Security OU (test)
- Enable → takes 2-5 minutes to propagate
After enabling, any S3 upload without encryption will fail:
aws s3 cp file.txt s3://my-bucket/ --sse AES256
# ✓ Works
aws s3 cp file.txt s3://my-bucket/
# ✗ Error: Access Denied (guardrail blocked)
Step 6: Create Accounts via Account Factory
Manual account creation is tedious. Control Tower’s Account Factory automates it.
Set Up Account Factory
- Go to Control Tower → Account Factory
- Click Enroll account or Create new account
- Fill in:
- Account name:
prod-workloadordev-team-1 - Account email: unique email (forwarding works)
- Organization unit: choose OU (Production, Development, Sandbox)
- IAM role name:
OrganizationAccountAccessRole(default)
- Account name:
- Click Create account
Takes 5-10 minutes. New account is auto-configured with:
- All guardrails applied
- CloudTrail enabled
- Config enabled
- Logging to Log Archive account
Bulk Create Accounts with API
For many accounts, use the AWS CLI:
aws controltower create-account \
--account-name "team-a-prod" \
--account-email "team-a-prod@company.com" \
--organizational-unit-id ou-prod-xxxxx
# Returns: account creation token
# Poll status: aws controltower get-account-status --account-id <id>
Step 7: Set Up Additional OUs and Guardrails
Extend the landing zone with custom OUs for different teams:
Create a Custom OU
aws organizations create-organizational-unit \
--parent-id r-xxxx \ # Root OU ID
--name "Production"
aws organizations create-organizational-unit \
--parent-id r-xxxx \
--name "Development"
Move Accounts to OUs
aws organizations move-account \
--account-id 111111111111 \
--source-parent-id ou-xxxx \
--destination-parent-id ou-prod-xxxx
Apply Guardrails to New OUs
In Control Tower console:
- Go to Guardrails
- For each guardrail, click Manage guardrail
- Add the new OU to the list
Step 8: Implement Delegated Administration
Control Tower allows other accounts to manage certain services (like AWS Config, Security Hub). This reduces load on the management account.
Delegate CloudTrail Management
# Register AWS CloudTrail as a delegated service
aws organizations register-delegated-administrator \
--account-id 222222222222 \ # Audit account
--service-principal cloudtrail.amazonaws.com
The Audit account can now manage CloudTrail for all accounts.
Delegate Security Hub
aws organizations register-delegated-administrator \
--account-id 222222222222 \ # Security account
--service-principal securityhub.amazonaws.com
Step 9: Monitor and Maintain Compliance
CloudWatch Dashboard
Control Tower automatically creates a dashboard showing:
- Guardrail compliance (# accounts passing each guardrail)
- Account status
- Organizational compliance trends
Access: AWS Control Tower → Dashboard
AWS Config Aggregator
Control Tower sets up a centralized Config Aggregator in the Log Archive account. It shows:
- Compliance status across all accounts
- Non-compliant resources
- Remediation steps
Access: AWS Config → Aggregators
CloudTrail Search
Search logs across all accounts from Management account:
# Query: who deleted an S3 bucket?
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=DeleteBucket \
--max-results 50
Step 10: Production Governance Patterns
Pattern 1: Blast Radius Containment
Isolate risky workloads:
Production
├── critical-apps (strict guardrails, high cost)
├── backend-api (standard guardrails)
└── experiments (loose guardrails, auto-cleanup)
If experiments OU is compromised, critical-apps OU is unaffected.
Pattern 2: Cost Allocation per OU
Use AWS Cost Explorer to allocate costs per OU:
- Tag all resources with
OU: production,OU: development, etc. - Group costs by tag in Cost Explorer
- Charge back teams per their OU spending
Pattern 3: Automated Compliance Reporting
Create a Lambda function that runs weekly:
import boto3
def compliance_report():
ct = boto3.client('controltower')
ou_list = ct.list_organizational_units_for_parent()
for ou in ou_list:
guardrails = ct.list_guardrails_for_target(target_id=ou['Id'])
for gr in guardrails:
compliance = ct.get_guardrail_compliance_status(guardrail_id=gr)
print(f"{ou['Name']}: {gr['Name']} — {compliance['status']}")
Schedule weekly, email report to security team.
Pattern 4: Sandbox Auto-Cleanup
Automatically delete accounts in Sandbox OU after 30 days:
aws organizations list-accounts-for-parent \
--parent-id ou-sandbox-xxxxx | \
jq '.Accounts[] | select(.CreateDate | . < now - 30*24*60*60)' | \
xargs -I {} aws organizations close-account --account-id {}
Prevents sandbox sprawl and cost leakage.
Common Mistakes to Avoid
-
Enabling too many guardrails at once
- Results in “guardrail fatigue” — teams disable all of them to get work done
- Start with 5-10, add one per week
-
Not planning account structure upfront
- Refactoring OUs mid-year is painful
- Spend 1-2 weeks designing OU structure
-
Forgetting to manage service limits
- Create 50 accounts, hit 100-account soft limit
- Request limit increases upfront (takes 24 hours)
-
Ignoring delegated administration
- Management account becomes a bottleneck
- Use delegated admins for Config, Security Hub, etc.
-
Not testing guardrails in non-production OUs
- Test new guardrails in Dev, then Production
- Don’t enable on Production without dry-run
Cost Estimate
| Component | Cost | Scaling |
|---|---|---|
| CloudTrail | $2-5/month | per 100k API calls |
| Config | $0.30-1/month | per account |
| CloudWatch Logs | $0.50/GB ingested | per GB |
| Control Tower | Free | N/A |
| Log storage (S3) | $0.023/GB/month | per GB stored |
| Total for 10 accounts | ~$100-150/month | scales linearly |
Next Steps
- Plan your OU structure (1 day)
- Set up Control Tower landing zone (1-2 hours)
- Enable 5-10 guardrails (1 week testing)
- Create production and development OUs (1 day)
- Onboard first 5 teams (2-3 weeks)
- Implement automated compliance reporting (ongoing)
- Talk to FactualMinds if you need help designing governance or scaling to 50+ accounts
AWS Cloud Architect & AI Expert
AWS-certified cloud architect and AI expert with deep expertise in cloud migrations, cost optimization, and generative AI on AWS.