AWS Organizations & Control Tower for System Architects
Table of Contents
- What Problems Organizations & Control Tower Solve
- AWS Organizations Fundamentals
- Service Control Policies (SCPs)
- AWS Control Tower
- Multi-Account Strategy
- Landing Zone Architecture
- Guardrails and Compliance
- Account Factory and Provisioning
- Cost Optimization Strategies
- Integration with Other AWS Services
- Migration and Adoption
- Common Pitfalls
- Key Takeaways
What Problems Organizations & Control Tower Solve
AWS Organizations and AWS Control Tower address critical challenges in managing multiple AWS accounts at enterprise scale.
Without Organizations & Control Tower
Account sprawl and governance gaps:
- Teams create AWS accounts independently without central visibility
- No consistent security policies across accounts
- Difficult to enforce compliance requirements
- Separate billing for each account complicates cost tracking
- No centralized audit logging or monitoring
- Security incidents spread across isolated accounts
- Manual account provisioning takes days or weeks
Real cost: A financial services company with 50 AWS accounts spent $180,000 annually on manual governance tasks (security reviews, compliance audits, account provisioning) and suffered a security breach when a development account with overly permissive IAM policies was compromised, exposing production data through cross-account roles.
With Organizations & Control Tower
Centralized governance and automated compliance:
- Single payer account: Consolidated billing across all accounts with volume discounts
- Organizational units (OUs): Hierarchical structure for grouping accounts by function, environment, or business unit
- Service control policies (SCPs): Centrally enforced guardrails that limit what actions are allowed in member accounts
- Control Tower landing zone: Pre-configured multi-account environment following AWS best practices
- Guardrails: Detective and preventive controls for continuous compliance
- Account Factory: Self-service account provisioning with governance baked in
- Centralized logging: CloudTrail and Config aggregated across all accounts
- Automated compliance: Continuous monitoring against AWS best practices and regulatory frameworks
Measured impact: The same financial services company migrated to Organizations and Control Tower, reducing governance overhead by 75% ($135,000 savings annually), cutting account provisioning time from 2 weeks to 1 hour, and achieving continuous compliance with SOC 2 and PCI-DSS requirements through automated guardrails.
Organizations and Control Tower provide the foundation for secure, scalable, well-governed multi-account AWS deployments.
AWS Organizations Fundamentals
AWS Organizations enables central management and governance of multiple AWS accounts from a single management account.
Core Concepts
Management account (formerly master account):
- Root of the organization
- Pays all charges for member accounts (consolidated billing)
- Has full administrative control over the organization
- Cannot have SCPs applied to it
- Should be used only for billing and organization management (not workloads)
Member accounts:
- Accounts that belong to the organization
- Can only belong to one organization at a time
- Subject to SCPs from parent OUs and the root
- Retain their own IAM policies and permissions
- Can be moved between OUs
Organizational units (OUs):
- Containers for accounts within the organization
- Can be nested up to 5 levels deep
- Inherit SCPs from parent OUs
- Enable policy-based management at scale
- Typically organized by environment (dev/test/prod), business unit, or compliance requirement
Root:
- Top-level container in the organization hierarchy
- Contains all accounts and OUs
- SCPs attached to root apply to all accounts (except management account)
Organization Structure Example
Root
├── Management Account (billing, organization admin)
├── Security OU
│ ├── Log Archive Account (centralized logging)
│ ├── Security Tooling Account (GuardDuty, Security Hub)
│ └── Audit Account (read-only access for auditors)
├── Infrastructure OU
│ ├── Network Account (Transit Gateway, VPCs)
│ └── Shared Services Account (DNS, AD, monitoring)
├── Workloads OU
│ ├── Production OU
│ │ ├── App1 Production Account
│ │ └── App2 Production Account
│ ├── Staging OU
│ │ └── Staging Account
│ └── Development OU
│ ├── Dev Team 1 Account
│ └── Dev Team 2 Account
└── Suspended OU (for decommissioned accounts)
Consolidated Billing Benefits
Volume discounts:
- Usage aggregated across all accounts
- Reach higher volume tiers faster for EC2, S3, data transfer
- Single Reserved Instance or Savings Plan pool shared across accounts
Example savings: Organization with 10 accounts averaging 500 GB S3 storage each:
- Without Organizations: Each account pays $0.023/GB (first 50 TB tier) = $115/month total
- With Organizations: 5,000 GB aggregated still in first tier but benefits from combined purchasing power for Reserved Instances and Savings Plans, reducing effective compute costs by 40-50%
Single invoice:
- One bill for all accounts
- Simplified payment processing
- Easier financial reporting and chargeback
Cost allocation tags:
- Consistent tagging across all accounts
- Cost and usage reports aggregated at organization level
- Detailed chargeback and showback capabilities
AWS Organizations Limits
| Limit | Value | Notes |
|---|---|---|
| Accounts per organization | 10 (default), 5,000+ (with increase) | Default limit is 10; request increases via Support |
| OUs per organization | 1,000 | Includes all nested OUs |
| OU nesting depth | 5 levels | Root is level 0 |
| SCPs per entity | 5 | Accounts and OUs can have max 5 SCPs attached |
| SCP size | 5,120 characters | JSON policy document size |
| Organizations per account | 1 | Account can only be in one organization |
| Invitations per day | 20 | Rate limit for inviting existing accounts |
Creating an Organization
Via AWS Console:
- Navigate to AWS Organizations in management account
- Click “Create organization”
- Choose “All features” (recommended) or “Consolidated billing only”
- Verify email address for management account
- Create organizational units
- Invite or create member accounts
Via AWS CLI:
# Create organization
aws organizations create-organization --feature-set ALL
# Create organizational unit
aws organizations create-organizational-unit \
--parent-id r-xxxx \
--name "Production"
# Create new account (faster than inviting)
aws organizations create-account \
--email prod-app1@example.com \
--account-name "App1 Production" \
--role-name OrganizationAccountAccessRole
# Invite existing account
aws organizations invite-account-to-organization \
--target-id 123456789012 \
--notes "Invitation for dev account"
# Move account to OU
aws organizations move-account \
--account-id 123456789012 \
--source-parent-id r-xxxx \
--destination-parent-id ou-xxxx-yyyyyyyy
Features vs. Consolidated Billing Only
All features (recommended):
- Service control policies (SCPs)
- Tag policies (enforce tagging standards)
- AI services opt-out policies
- Backup policies
- Access to AWS Control Tower
- Cannot be downgraded to consolidated billing only once enabled
Consolidated billing only (legacy):
- Only provides consolidated billing
- No SCPs or governance features
- Can be upgraded to all features
- Not recommended for new organizations
Service Control Policies (SCPs)
Service control policies are the primary mechanism for enforcing governance rules across accounts in an organization.
How SCPs Work
Permission boundaries at the account level:
- SCPs define the maximum permissions for accounts and OUs
- They don’t grant permissions; they filter what IAM policies can allow
- Explicit deny in SCP overrides any allow in IAM policies
- SCPs affect all users and roles in an account, including the root user
- Management account is not affected by SCPs
Evaluation logic:
Effective Permissions = IAM Permissions ∩ SCP Permissions
If SCP denies action OR IAM denies action:
Result: Deny
Else if SCP allows action AND IAM allows action:
Result: Allow
Else:
Result: Deny (implicit deny)
Example: If an SCP on the Production OU denies ec2:TerminateInstances, no user in any production account can terminate instances, even if their IAM policy allows it.
SCP Strategies
Strategy 1: Deny list (default):
- Start with
FullAWSAccesspolicy attached to root - Add specific deny statements for prohibited actions
- Easier to start with, but can lead to policy sprawl
- Good for organizations with mature governance processes
Example deny list SCP (prevent leaving organization):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"organizations:LeaveOrganization"
],
"Resource": "*"
}
]
}
Strategy 2: Allow list (more secure):
- Remove
FullAWSAccessfrom root - Explicitly allow only required services and actions
- More restrictive and secure
- Requires careful planning and maintenance
- Recommended for highly regulated environments
Example allow list SCP (production accounts):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:*",
"s3:*",
"rds:*",
"lambda:*",
"dynamodb:*",
"cloudwatch:*",
"logs:*"
],
"Resource": "*"
},
{
"Effect": "Deny",
"Action": [
"ec2:PurchaseReservedInstancesOffering",
"ec2:ModifyReservedInstances",
"rds:PurchaseReservedDBInstancesOffering"
],
"Resource": "*"
}
]
}
Common SCP Patterns
1. Region restriction (enforce data residency):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:RequestedRegion": [
"us-east-1",
"us-west-2"
]
},
"ArnNotLike": {
"aws:PrincipalARN": [
"arn:aws:iam::*:role/OrganizationAccountAccessRole"
]
}
}
}
]
}
2. Require encryption for S3 uploads:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "s3:PutObject",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": [
"AES256",
"aws:kms"
]
}
}
}
]
}
3. Prevent disabling security services:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"cloudtrail:StopLogging",
"cloudtrail:DeleteTrail",
"config:DeleteConfigurationRecorder",
"config:DeleteDeliveryChannel",
"config:StopConfigurationRecorder",
"guardduty:DeleteDetector",
"guardduty:DisassociateFromMasterAccount",
"securityhub:DisableSecurityHub",
"securityhub:DeleteMembers"
],
"Resource": "*"
}
]
}
4. Prevent public S3 buckets:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"s3:PutBucketPublicAccessBlock"
],
"Resource": "*",
"Condition": {
"Bool": {
"s3:BlockPublicAcls": "false",
"s3:BlockPublicPolicy": "false",
"s3:IgnorePublicAcls": "false",
"s3:RestrictPublicBuckets": "false"
}
}
},
{
"Effect": "Deny",
"Action": [
"s3:PutAccountPublicAccessBlock"
],
"Resource": "*",
"Condition": {
"Bool": {
"s3:BlockPublicAcls": "false"
}
}
}
]
}
5. Restrict instance types in non-production:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"StringNotLike": {
"ec2:InstanceType": [
"t3.*",
"t3a.*",
"t4g.*"
]
}
}
}
]
}
SCP Inheritance
SCPs are inherited down the organization hierarchy:
Root (SCP: DenyRegionRestriction)
├── Production OU (SCP: DenyInstanceTermination)
│ └── App1 Prod Account
│ Effective SCPs: DenyRegionRestriction + DenyInstanceTermination
└── Development OU (SCP: AllowOnlyT3Instances)
└── Dev Account
Effective SCPs: DenyRegionRestriction + AllowOnlyT3Instances
Multiple SCPs: If multiple SCPs are attached to an account or OU, all must allow the action (logical AND). If any SCP denies, the action is denied.
Testing SCPs
IAM Policy Simulator:
- Test how SCPs affect IAM permissions
- Simulate actions before applying SCPs to production
- Accessible at https://policysim.aws.amazon.com
CloudTrail analysis:
- Review CloudTrail logs to identify API calls that would be blocked
- Test SCPs in development accounts first
- Monitor for unexpected denials after SCP deployment
Gradual rollout:
- Apply SCP to test OU with single account
- Monitor CloudTrail for denied actions
- Refine SCP based on findings
- Expand to additional OUs incrementally
AWS Control Tower
AWS Control Tower provides an automated landing zone based on AWS best practices, with built-in governance and compliance.
Control Tower vs. Organizations
| Feature | Organizations | Control Tower |
|---|---|---|
| Multi-account management | ✅ Manual setup | ✅ Automated setup |
| Service Control Policies | ✅ Manual creation | ✅ Pre-configured guardrails |
| Account provisioning | Manual process | Account Factory (automated) |
| Logging and monitoring | Manual setup | Automatic (CloudTrail, Config) |
| Compliance dashboard | Not included | ✅ Guardrail compliance view |
| Baseline security | Manual configuration | ✅ Automated baseline |
| Landing zone | Build yourself | ✅ Pre-built landing zone |
| Cost | Free (Organizations) | Free (Control Tower), pay for resources |
When to use Control Tower:
- Starting fresh with multi-account AWS deployment
- Need automated compliance and governance
- Want AWS best practices applied by default
- Require self-service account provisioning
- Have compliance requirements (SOC 2, PCI-DSS, HIPAA)
When to use Organizations alone:
- Already have mature multi-account setup
- Need flexibility beyond Control Tower’s opinionated structure
- Have complex custom requirements
- Want to avoid Control Tower’s specific OU structure
Control Tower Architecture
Core accounts (created automatically):
- Management account:
- Billing and organization administration
- Control Tower setup and management
- Should not run workloads
- Log Archive account:
- Centralized CloudTrail logs from all accounts
- Config logs and snapshots
- Read-only access for compliance team
- Retention policies enforced
- Audit account:
- Security Hub aggregator
- GuardDuty delegated administrator
- Config aggregator
- Cross-account read-only access for security audits
- SNS topics for compliance notifications
Default organizational units:
- Security OU: Contains Log Archive and Audit accounts
- Sandbox OU: For experimentation without strict guardrails (optional)
- Custom OUs: Create additional OUs for Production, Staging, Development
Guardrails
Guardrails are governance rules implemented through SCPs (preventive) or AWS Config rules (detective).
Guardrail categories:
| Category | Type | Description | Count |
|---|---|---|---|
| Mandatory | Preventive & Detective | Always enabled, cannot be disabled | 17 |
| Strongly Recommended | Preventive & Detective | AWS best practices | 7 |
| Elective | Preventive & Detective | Optional based on requirements | 120+ |
Preventive guardrails (SCPs):
- Block actions before they happen
- Enforce policies at the account level
- Cannot be bypassed
- Examples: Disallow public S3 buckets, restrict regions
Detective guardrails (Config rules):
- Monitor for non-compliant resources
- Alert but don’t prevent
- Provide compliance status
- Examples: Detect unencrypted EBS volumes, identify non-MFA root users
Example mandatory guardrails:
- Disallow changes to CloudTrail (preventive)
- Detect public read access to S3 buckets (detective)
- Disallow changes to AWS Config (preventive)
- Detect unencrypted EBS volumes (detective)
- Disallow internet access for the management account (preventive)
Example strongly recommended guardrails:
- Disallow public write access to S3 buckets (preventive)
- Detect MFA enabled for root user (detective)
- Enable encryption for EBS volumes (detective)
- Detect whether CloudTrail is enabled (detective)
Elective guardrails examples:
- Disallow specific AWS services (EC2, RDS instance types)
- Enforce encryption for specific services
- Restrict use of root user
- Require tags on resources
Guardrail Compliance States
| State | Meaning | Action |
|---|---|---|
| Clear | No resources in violation | No action needed |
| In violation | Resources violate detective guardrail | Remediate resources |
| Not enabled | Guardrail not applied to OU | Enable if needed |
| Unknown | Config recorder issue or data not available | Check Config status |
Compliance dashboard: Control Tower provides a centralized view showing guardrail status across all accounts and OUs.
Account Factory
Account Factory enables self-service, automated account provisioning with governance controls.
Features:
- Standardized account baseline: Every account gets CloudTrail, Config, guardrails
- Network configuration: Automated VPC setup or integration with centralized network account
- SSO integration: Automatic user and permission set assignment
- Tagging: Consistent tags applied at creation
- Provisioning time: 20-30 minutes vs. days for manual setup
Account Factory workflow:
- User requests account via Service Catalog
- Selects OU (determines which guardrails apply)
- Provides account name, email, network configuration
- Control Tower creates account and applies baseline
- Account appears in organization with full governance
Via AWS Service Catalog:
- Account Factory product available in Service Catalog
- Users with
AWSServiceCatalogEndUserFullAccesscan provision - Approval workflows can be added
Via AWS CLI (Account Factory for Terraform - AFT):
# Using Account Factory for Terraform (AFT)
# Define account in Terraform
resource "aws_servicecatalog_provisioned_product" "new_account" {
name = "app1-production"
product_name = "AWS Control Tower Account Factory"
provisioning_artifact_name = "AWS Control Tower Account Factory"
provisioning_parameters {
key = "AccountEmail"
value = "app1-prod@example.com"
}
provisioning_parameters {
key = "AccountName"
value = "App1 Production"
}
provisioning_parameters {
key = "ManagedOrganizationalUnit"
value = "Production"
}
provisioning_parameters {
key = "SSOUserEmail"
value = "admin@example.com"
}
provisioning_parameters {
key = "SSOUserFirstName"
value = "Admin"
}
provisioning_parameters {
key = "SSOUserLastName"
value = "User"
}
}
Account Factory for Terraform (AFT)
AFT extends Account Factory with GitOps workflows and Terraform customization.
Benefits:
- Provision and customize accounts via Terraform
- GitOps workflow for account management
- Global customizations applied to all accounts
- Account-specific customizations via separate Terraform modules
- Pipeline automation with account vending
Architecture:
- AFT management account runs Step Functions pipeline
- Git repositories for account requests and customizations
- CodePipeline triggers on Git commits
- Terraform applies baseline and customizations
- Supports external Terraform modules
Use case: Organization needs to provision 50 accounts with custom networking (Transit Gateway attachments), tagging, IAM roles, and application-specific infrastructure. AFT automates this with version-controlled Terraform, reducing provisioning time from 2 days to 1 hour per account.
Multi-Account Strategy
Effective multi-account strategy balances isolation, governance, and operational efficiency.
Account Segmentation Patterns
1. Environment-based segmentation:
Root
├── Production OU
├── Staging OU
├── Development OU
└── Sandbox OU
Benefits: Clear environment separation, different guardrails per stage Drawbacks: Can lead to large numbers of accounts as applications scale
2. Application-based segmentation:
Root
├── App1 OU
│ ├── App1 Prod
│ ├── App1 Staging
│ └── App1 Dev
└── App2 OU
├── App2 Prod
└── App2 Dev
Benefits: Application isolation, independent lifecycles Drawbacks: Difficult to enforce environment-level policies
3. Hybrid segmentation (recommended):
Root
├── Core OU
│ ├── Security OU (Log Archive, Audit)
│ └── Infrastructure OU (Network, Shared Services)
├── Workloads OU
│ ├── Production OU
│ │ ├── App1 Prod
│ │ └── App2 Prod
│ ├── Non-Production OU
│ │ ├── App1 Staging
│ │ ├── App1 Dev
│ │ └── App2 Dev
│ └── Sandbox OU (experimentation)
└── Suspended OU (decommissioned accounts)
Benefits: Combines environment and application isolation, flexible policy application Recommended for: Most enterprise deployments
Account Sizing Guidelines
When to use a separate account:
- Different compliance or regulatory requirements
- Different teams with separate ownership
- Separate billing or chargeback requirements
- Isolated blast radius needed (production vs. development)
- Independent lifecycle management
When to use the same account:
- Tightly coupled applications
- Shared resources needed (databases, caching layers)
- Same team owns all components
- Similar security and compliance requirements
Example: E-commerce platform:
- Production Account: Web application, API, database
- Data Analytics Account: Data warehouse, ETL jobs (separate for cost tracking)
- CI/CD Account: Build pipelines, artifact storage (shared across all apps)
Cross-Account Access Patterns
1. IAM cross-account roles (recommended):
// In target account (123456789012)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::987654321098:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "unique-external-id"
}
}
}
]
}
// In source account (987654321098), attach to user/role
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::123456789012:role/CrossAccountRole"
}
]
}
2. Resource-based policies (for services that support them):
// S3 bucket policy allowing cross-account access
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::987654321098:role/DataProcessor"
},
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::shared-bucket/*"
}
]
}
3. AWS Resource Access Manager (RAM):
- Share resources like Transit Gateway, Route 53 Resolver rules, subnets
- No need for cross-account roles for supported resources
- Centralized management in network account
# Share Transit Gateway with entire organization
aws ram create-resource-share \
--name "Shared-TGW" \
--resource-arns "arn:aws:ec2:us-east-1:123456789012:transit-gateway/tgw-xxxx" \
--principals "arn:aws:organizations::123456789012:organization/o-xxxx"
Landing Zone Architecture
A landing zone is a pre-configured, secure, multi-account AWS environment based on best practices.
Landing Zone Components
1. Identity and access management:
- AWS IAM Identity Center (SSO) for centralized authentication
- Permission sets for role-based access
- MFA enforcement
- Integration with corporate directory (Active Directory, Okta, etc.)
2. Logging and monitoring:
- CloudTrail: Organization trail in Log Archive account
- AWS Config: Aggregator in Audit account
- VPC Flow Logs: Centralized in Log Archive account
- CloudWatch Logs: Cross-account log aggregation
- S3 bucket: Encrypted, versioned, lifecycle policies
3. Security services:
- Security Hub: Aggregated findings in Audit account
- GuardDuty: Delegated administrator in Audit account
- AWS Config: Compliance monitoring with conformance packs
- Detective controls: Config rules for continuous compliance
4. Network architecture:
- Shared VPCs: Centralized network account owns VPCs
- Transit Gateway: Hub-and-spoke connectivity
- Route 53: Private hosted zones shared via RAM
- PrivateLink: Secure access to AWS services
- Network segmentation: Separate subnets for different environments
5. Governance:
- Service control policies: Preventive guardrails
- Tag policies: Enforce tagging standards
- Backup policies: Centralized backup rules
- SCPs for compliance: Region restrictions, encryption requirements
Network Design Patterns
Pattern 1: Centralized network with shared VPCs:
Network Account
├── Shared Production VPC (shared via RAM)
│ ├── Public Subnets (ALB, NAT Gateway)
│ ├── Private Subnets (application tier)
│ └── Data Subnets (databases)
├── Shared Non-Production VPC
└── Transit Gateway (connectivity hub)
Workload Accounts
├── App1 Production (uses shared Production VPC subnets)
└── App2 Production (uses shared Production VPC subnets)
Benefits: Centralized network management, reduced VPC sprawl, easier compliance Drawbacks: Tight coupling with network account, requires RAM sharing
Pattern 2: Distributed VPCs with Transit Gateway:
Network Account
├── Transit Gateway (connectivity hub)
├── Shared Services VPC (DNS, AD, monitoring)
└── Egress VPC (centralized internet egress)
Workload Accounts
├── App1 Production (own VPC, attached to TGW)
└── App2 Production (own VPC, attached to TGW)
Benefits: Application isolation, flexibility, independent network control Drawbacks: More VPCs to manage, potential IP overlap concerns
Pattern 3: Hybrid (recommended for most organizations):
- Shared Services VPC in network account (DNS, Active Directory, monitoring)
- Egress VPC for centralized internet access
- Application-specific VPCs in workload accounts
- Transit Gateway for connectivity
- VPC sharing for tightly coupled applications
Identity Center (SSO) Setup
AWS IAM Identity Center provides single sign-on access to multiple AWS accounts and applications.
Benefits:
- Centralized authentication: One set of credentials for all accounts
- Permission sets: Reusable role-based access templates
- MFA enforcement: Consistent security across accounts
- Integration: Supports external identity providers (Okta, Azure AD, Google Workspace)
- Temporary credentials: No long-lived access keys
Permission set example:
// AdministratorAccess permission set
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
// ReadOnlyAccess permission set
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"s3:List*",
"s3:GetObject",
"cloudformation:Describe*",
"cloudwatch:Describe*",
"logs:Describe*"
],
"Resource": "*"
}
]
}
Assignment pattern:
- Admin group → AdministratorAccess → Production OU (all accounts)
- Developer group → PowerUserAccess → Development OU
- Security Auditor group → ViewOnlyAccess → All accounts
- Finance group → BillingReadOnly → Management account
Session duration: Configure session duration (1-12 hours) based on security requirements. Shorter sessions (1-2 hours) for production, longer (8-12 hours) for development.
Cost Optimization Strategies
Organizations and Control Tower provide centralized cost management and optimization opportunities.
Consolidated Billing Benefits
Reserved Instances and Savings Plans sharing:
- RIs and Savings Plans purchased in any account apply to eligible usage across all accounts
- Optimization recommendations at organization level
- Example: Purchase Compute Savings Plan in management account, automatically applies to EC2 and Fargate in all accounts
Volume discounts:
- S3 storage aggregated across accounts for tiered pricing
- Data transfer pooled across accounts
- EBS snapshot storage combined
Example cost reduction:
- Scenario: 20 accounts, each with 100 GB S3 storage and 5 t3.medium EC2 instances
- Without Organizations: Each account pays standard on-demand rates
- With Organizations + Savings Plans:
- 1-year Compute Savings Plan (72% discount on t3.medium)
- Monthly savings: $2,800 (from $7,000 to $4,200)
- Annual savings: $33,600
Cost Allocation and Chargeback
Cost allocation tags:
- Define tags like
Environment,CostCenter,Application,Owner - Activate tags in management account billing preferences
- Tags appear in Cost and Usage Reports
Tag policies (enforce tagging):
{
"tags": {
"Environment": {
"tag_key": {
"@@assign": "Environment"
},
"tag_value": {
"@@assign": [
"Production",
"Staging",
"Development",
"Sandbox"
]
},
"enforced_for": {
"@@assign": [
"ec2:instance",
"s3:bucket",
"rds:db"
]
}
},
"CostCenter": {
"tag_key": {
"@@assign": "CostCenter"
},
"enforced_for": {
"@@assign": [
"ec2:instance",
"s3:bucket"
]
}
}
}
}
Cost and Usage Report (CUR):
- Enable in management account
- Export to S3 with Athena or QuickSight integration
- Query by account, tag, service, resource
- Build chargeback reports
Example Athena query (monthly cost by account and environment):
SELECT
line_item_usage_account_id AS account,
resource_tags_user_environment AS environment,
SUM(line_item_unblended_cost) AS total_cost
FROM
cur_database.cost_and_usage_report
WHERE
year = '2025' AND month = '01'
GROUP BY
line_item_usage_account_id,
resource_tags_user_environment
ORDER BY
total_cost DESC;
Control Tower Cost Optimization
Control Tower itself is free, but you pay for:
- AWS Config rules (per rule per region per account)
- CloudTrail logging (first trail free, additional trails charged)
- S3 storage for logs
- Lambda executions for customizations
Cost estimation for 10-account Control Tower deployment:
- AWS Config: ~$2/rule/region/account/month × 5 mandatory rules × 2 regions × 10 accounts = $200/month
- CloudTrail: Organization trail is free; S3 storage for logs ~$5/month
- S3 log storage: 100 GB × $0.023/GB = $2.30/month
- Total: ~$207/month for governance (offset by consolidated billing savings)
Optimization tips:
- Enable Config rules only in required regions
- Use detective guardrails selectively (each = Config rule)
- Lifecycle policies for log archival to Glacier ($0.004/GB)
- Disable elective guardrails not needed for compliance
Example savings: Organization reduced Config costs by 60% ($200 → $80/month) by:
- Enabling Config only in 2 primary regions (us-east-1, us-west-2) instead of 6
- Using only mandatory + strongly recommended guardrails (24 rules) instead of all elective (120+ rules)
- Lifecycle policy moving logs >90 days to Glacier
Integration with Other AWS Services
Organizations and Control Tower integrate with AWS services for centralized management.
AWS CloudFormation StackSets
Deploy CloudFormation stacks across multiple accounts and regions from a central location.
Use cases:
- Deploy IAM roles for cross-account access
- Enable security services (GuardDuty, Security Hub)
- Configure logging and monitoring baselines
- Create VPC resources in all accounts
Example: Deploy CloudWatch log retention policy to all accounts:
# CloudFormation template
Resources:
LogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: /aws/lambda/application-logs
RetentionInDays: 30
# StackSet deployment
aws cloudformation create-stack-set \
--stack-set-name "log-retention-policy" \
--template-body file://log-retention.yaml \
--capabilities CAPABILITY_NAMED_IAM \
--auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false
aws cloudformation create-stack-instances \
--stack-set-name "log-retention-policy" \
--deployment-targets OrganizationalUnitIds=ou-xxxx-yyyyyyyy \
--regions us-east-1 us-west-2
Auto-deployment: When enabled, StackSets automatically deploy to new accounts added to target OUs.
AWS Security Hub Integration
Security Hub aggregates findings from GuardDuty, Config, Inspector, and third-party tools.
Organization integration:
- Designate Audit account as Security Hub administrator
- Automatically enable Security Hub in new accounts
- Aggregate findings across all accounts
- Centralized compliance dashboard
Control Tower automation: Security Hub automatically enabled in Audit account with delegated administrator permissions.
AWS Systems Manager Integration
Parameter sharing across accounts:
- Share Systems Manager parameters across organization
- Centralize configuration values
- Update parameters once, available in all accounts
Session Manager:
- Connect to EC2 instances without SSH keys
- Audit all sessions via CloudTrail
- SCP can restrict Session Manager access by OU
AWS RAM (Resource Access Manager)
Share resources across accounts without duplicating them.
Shareable resources:
- VPC subnets (shared VPCs)
- Transit Gateway
- Route 53 Resolver rules
- License Manager configurations
- Aurora DB clusters
- CodeBuild projects
- EC2 Capacity Reservations
- Resource Groups
Example: Share Transit Gateway with entire organization:
aws ram create-resource-share \
--name "Organization-TGW" \
--resource-arns "arn:aws:ec2:us-east-1:123456789012:transit-gateway/tgw-xxxx" \
--principals "arn:aws:organizations::123456789012:organization/o-xxxx" \
--permission-arns "arn:aws:ram::aws:permission/AWSRAMDefaultPermissionTransitGateway"
Benefit: Central network team manages Transit Gateway in network account; application teams in workload accounts can attach VPCs without cross-account roles.
Migration and Adoption
Migrating existing AWS accounts to Organizations and Control Tower requires careful planning.
Migration Strategies
Strategy 1: Greenfield (new organization):
- Create fresh organization with Control Tower
- Migrate workloads from existing accounts to new accounts
- Decommission old accounts
Best for: Small number of accounts, simple architectures, willingness to rebuild Timeline: 1-3 months depending on workload complexity
Strategy 2: Brownfield (migrate existing accounts):
- Create organization and Control Tower in new management account
- Invite existing accounts to organization
- Apply Control Tower baseline via customizations
Best for: Large number of accounts, complex production workloads, minimize disruption Timeline: 3-6 months for large organizations
Strategy 3: Hybrid (gradual migration):
- Create organization with Control Tower
- Migrate non-production accounts first
- Create new accounts for greenfield projects
- Gradually migrate production workloads
Best for: Most organizations; balances risk and timeline Timeline: 6-12 months for enterprise-scale migrations
Migration Steps (Brownfield)
Phase 1: Planning (2-4 weeks):
- Inventory existing accounts, resources, dependencies
- Design target OU structure
- Define guardrails and SCPs
- Plan network architecture (Transit Gateway, shared VPCs)
- Identify customizations needed
- Create migration runbook
Phase 2: Pilot (4-6 weeks):
- Create organization in new management account
- Set up Control Tower
- Invite 1-2 non-production accounts
- Test SCPs and guardrails
- Validate logging and monitoring
- Document issues and refine approach
Phase 3: Non-Production Migration (8-12 weeks):
- Invite remaining development and staging accounts
- Apply SCPs gradually (monitor for impact)
- Enable guardrails incrementally
- Configure cross-account access
- Migrate logging to Log Archive account
- Validate security controls
Phase 4: Production Migration (12-16 weeks):
- Migrate production accounts during maintenance windows
- Test all functionality post-migration
- Enable production SCPs and guardrails
- Configure alerting and monitoring
- Document operational procedures
- Train teams on new workflows
Phase 5: Optimization (ongoing):
- Review SCP effectiveness
- Tune guardrails based on findings
- Optimize costs with consolidated billing
- Implement additional security controls
- Automate account provisioning via Account Factory
Inviting Existing Accounts
Invitation process:
# From management account
aws organizations invite-account-to-organization \
--target-id 123456789012 \
--notes "Invitation to join organization for centralized governance"
# From target account
aws organizations accept-handshake \
--handshake-id h-xxxx
Post-invitation steps:
- Move account to appropriate OU
- Apply SCPs (test in isolation first)
- Enable Config, CloudTrail to Log Archive account
- Register with Security Hub in Audit account
- Update IAM roles for cross-account access
- Configure network connectivity (VPC peering, Transit Gateway)
Control Tower Enrollment
Enrolling an existing account into Control Tower applies the baseline configuration.
What enrollment does:
- Creates
AWSControlTowerExecutionrole in account - Enables AWS Config
- Creates CloudTrail trail
- Applies guardrails from parent OU
- Adds account to Security Hub and GuardDuty in Audit account
Via AWS Console:
- Navigate to Control Tower → Organization
- Select account
- Click “Enroll account”
- Choose OU
- Enrollment takes 20-30 minutes
Limitations:
- Account must not have existing Config recorder or delivery channel (must delete first)
- Existing CloudTrail trail may conflict (rename or delete)
- SCPs may block existing workloads (test carefully)
Rollback considerations: Unenrolling removes Control Tower management but doesn’t restore previous state. Plan carefully and test in non-production first.
Common Migration Challenges
1. Existing IAM roles conflict with Control Tower roles:
- Issue: Control Tower creates
AWSControlTowerExecutionrole; may conflict with existing roles - Solution: Rename or remove conflicting roles before enrollment
2. SCP blocks critical operations:
- Issue: Production workload uses API that’s denied by SCP
- Solution: Test SCPs in non-production; use CloudTrail to identify blocked calls; refine SCPs before production
3. CloudTrail conflicts:
- Issue: Existing CloudTrail trail with same S3 bucket
- Solution: Disable or rename existing trail; Control Tower creates organization trail
4. Config recorder conflicts:
- Issue: Existing Config recorder in account
- Solution: Delete existing recorder and delivery channel before enrollment
5. Cross-account access breaks:
- Issue: Existing cross-account roles rely on specific trust relationships
- Solution: Update trust policies to work within organization; use
aws:PrincipalOrgIDcondition
6. Network architecture changes:
- Issue: Moving to centralized network model requires re-architecting
- Solution: Gradual migration; use Transit Gateway for hybrid connectivity during transition
Common Pitfalls
1. Management Account Misuse
Issue: Running workloads in the management account exposes billing and organizational controls to application risk.
Why it happens: Teams start with a single account and grow into multi-account without migrating workloads.
Impact:
- Security breach in workload can compromise entire organization
- Accidental deletion or misconfiguration affects all accounts
- Cannot apply SCPs to management account
- Difficult to isolate blast radius
Solution:
- Use management account only for billing and organization administration
- Move all workloads to member accounts
- Restrict access to management account (MFA, IP restrictions)
- Monitor CloudTrail in management account closely
Prevention: From day one, create separate accounts for workloads, even if starting small.
2. Overly Restrictive SCPs in Production
Issue: Deploying restrictive SCPs without testing blocks critical production operations.
Example: SCP denying ec2:ModifyInstanceAttribute prevents updating security groups on running instances, blocking routine operations.
Impact:
- Production incidents prolonged by inability to make changes
- Emergency exceptions create governance gaps
- Team frustration and SCP resistance
Solution:
- Test SCPs in development accounts first
- Use CloudTrail to identify API calls that would be blocked
- Start with deny list strategy (less restrictive)
- Implement SCPs gradually with monitoring period
- Document SCP exceptions process for emergencies
Prevention: Use IAM Policy Simulator and CloudTrail analysis before applying SCPs to production OUs.
3. Config Recorder Conflicts During Enrollment
Issue: Enrolling an account with existing Config recorder fails because Control Tower requires exclusive Config management.
Error message: “Account already has a Config recorder or delivery channel.”
Solution:
# Delete existing Config recorder before enrollment
aws configservice stop-configuration-recorder \
--configuration-recorder-name default
aws configservice delete-delivery-channel \
--delivery-channel-name default
aws configservice delete-configuration-recorder \
--configuration-recorder-name default
Prevention: Document pre-enrollment checklist; automate cleanup with script.
4. Guardrail Costs Exceed Budget
Issue: Enabling all elective guardrails across many accounts and regions creates unexpectedly high AWS Config costs.
Example: Organization with 20 accounts, 4 regions, enabling 50 guardrails:
- Cost: 20 accounts × 4 regions × 50 Config rules × $2/rule/month = $8,000/month
- Budget shock: Expected $500/month for Control Tower
Solution:
- Enable only mandatory and strongly recommended guardrails (24 rules)
- Use detective guardrails selectively based on compliance requirements
- Enable Config only in primary regions (2-3 regions instead of all)
- Set up billing alerts before expanding guardrails
- Calculate Config costs before enabling elective guardrails
Prevention: Cost estimation during planning phase; phased guardrail rollout with cost monitoring.
5. Lack of Exception Process for SCPs
Issue: No documented process for handling SCP exceptions during incidents leads to chaos or governance bypasses.
Scenario: Production incident requires API call blocked by SCP. Team has no process to request temporary exception, leading to:
- Incident resolution delayed
- Unauthorized SCP modifications
- Permanent exceptions that weaken security posture
Solution:
- Document SCP exception process:
- Exception request template (business justification, duration, scope)
- Approval workflow (security team, compliance)
- Temporary exception implementation (time-limited SCP override)
- Post-incident review and exception removal
- Communicate process to all teams
- Track exceptions in ticketing system
- Regular review of exceptions (quarterly)
Prevention: Establish governance processes before deploying restrictive SCPs.
6. IAM Identity Center (SSO) Single Point of Failure
Issue: IAM Identity Center outage or misconfiguration locks users out of all accounts.
Impact:
- Cannot access AWS Console or CLI in any account
- Break-glass procedures not documented
- Incident response delayed
Solution:
- Create break-glass IAM users in critical accounts (management, production)
- Store credentials in secure vault (1Password, Keeper)
- Regularly test break-glass access (quarterly)
- Document emergency access procedures
- Set up CloudWatch alarm for Identity Center service issues
Break-glass user policy (MFA-protected, full access):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
Prevention: Establish break-glass procedures during Control Tower setup; test regularly.
7. Inadequate Log Retention and Analysis
Issue: Logs in Log Archive account fill S3 bucket without lifecycle policies, driving up costs and making analysis difficult.
Example: 20 accounts generating 500 GB CloudTrail logs per month:
- Year 1: 6 TB logs × $0.023/GB = $138/month
- Year 2: 12 TB logs × $0.023/GB = $276/month (no lifecycle policy)
- Querying massive log volume becomes slow and expensive
Solution:
- S3 lifecycle policy for Log Archive bucket:
- Logs >90 days → Glacier ($0.004/GB) = 90% cost reduction
- Logs >1 year → Glacier Deep Archive ($0.00099/GB) = 95% cost reduction
- CloudTrail Lake for queryable log storage (separate from S3 archive)
- Athena for ad-hoc log queries
- CloudWatch Logs Insights for real-time analysis
S3 lifecycle policy example:
{
"Rules": [
{
"Id": "ArchiveOldLogs",
"Status": "Enabled",
"Transitions": [
{
"Days": 90,
"StorageClass": "GLACIER"
},
{
"Days": 365,
"StorageClass": "DEEP_ARCHIVE"
}
]
}
]
}
Prevention: Configure lifecycle policies during Log Archive account setup; monitor storage costs monthly.
8. Forgetting to Update OU Structure as Organization Grows
Issue: Initial OU structure doesn’t scale as organization adds teams, applications, and compliance requirements.
Example: Starting with flat structure:
Root
├── Production OU (50 accounts)
└── Development OU (30 accounts)
Problem: Cannot apply different policies to subsets of production or development accounts; everything gets same SCPs.
Solution:
- Plan for growth with nested OU structure from the start:
Root ├── Core OU │ └── Security OU ├── Workloads OU │ ├── Production OU │ │ ├── High-Security OU (PCI-DSS accounts) │ │ └── Standard-Security OU │ └── Non-Production OU │ ├── Staging OU │ └── Development OU └── Sandbox OU - Review OU structure quarterly
- Move accounts to appropriate OUs as requirements change
- Use nested OUs for policy inheritance flexibility
Prevention: Design OU hierarchy with future growth in mind; avoid flat structure.
Key Takeaways
AWS Organizations provides centralized multi-account management:
- Consolidated billing with volume discounts and cost allocation
- Service control policies (SCPs) for governance at scale
- Organizational units (OUs) for hierarchical policy management
- Centralized logging and security monitoring
- Foundation for Control Tower and advanced governance
AWS Control Tower automates landing zone setup:
- Pre-configured multi-account environment following AWS best practices
- Mandatory, strongly recommended, and elective guardrails for compliance
- Account Factory for self-service account provisioning with governance
- Centralized logging, monitoring, and compliance dashboard
- Integration with IAM Identity Center (SSO) for centralized access
Effective multi-account strategy balances isolation and operational efficiency:
- Separate accounts for production, staging, development, and security functions
- Hybrid OU structure (environment + application-based) works best for most organizations
- Cross-account access via IAM roles and resource sharing (RAM)
- Centralized network architecture with Transit Gateway or shared VPCs
- Break-glass procedures for emergencies
Service control policies enforce preventive governance:
- SCPs define maximum permissions at the account level
- Deny list strategy (easier to start) vs. allow list strategy (more secure)
- Common patterns: region restriction, encryption requirements, preventing security service disablement
- Test SCPs in non-production before applying to production
- Document exception process for emergencies
Cost optimization through Organizations:
- Consolidated billing enables Reserved Instances and Savings Plans sharing across accounts
- Volume discounts for S3, data transfer, and other services
- Cost allocation tags and tag policies for chargeback
- Cost and Usage Reports (CUR) for detailed analysis
- Control Tower costs primarily from AWS Config rules; optimize by limiting regions and elective guardrails
Migration requires careful planning:
- Greenfield (new organization) vs. brownfield (migrate existing) vs. hybrid approaches
- Phase migration: non-production first, then production
- Address conflicts (Config recorders, CloudTrail, IAM roles) before enrollment
- Test SCPs and guardrails in isolation before broad deployment
- Establish break-glass procedures and exception processes
Common pitfalls to avoid:
- Running workloads in management account (security risk)
- Deploying restrictive SCPs without testing (blocks production operations)
- Enabling all elective guardrails without cost analysis (budget overruns)
- No break-glass IAM users (locked out during SSO outage)
- Inadequate log retention policies (storage costs balloon)
- Flat OU structure that doesn’t scale (difficult to apply granular policies)
Organizations and Control Tower are essential for enterprise AWS governance. They transform multi-account management from manual, error-prone processes into automated, compliant, cost-optimized operations. Start with Control Tower for greenfield deployments; migrate carefully for existing environments. Invest in planning OU structure, SCPs, and guardrails upfront to avoid costly rework later.
Found this guide helpful? Share it with your team:
Share on LinkedIn