Contents
5 October 2025

Odoo AWS Architecture Guide: 3 Tiers from $100 to $350/mo

by Aria Shaw

You deploy Odoo on AWS without a clear architecture plan. Six months later, you discover your RDS instance costs 4x more than necessary, your filestore balloons to $200/month in EBS charges, and you can’t scale because you chose the wrong tier.

This guide prevents that. You’ll design the correct architecture before deployment, choose the right tier for your workload, and calculate exact monthly costs.

Who this serves:

Prerequisites:

Time investment: 45 minutes to select architecture, 2 hours to validate with cost calculator.


Three Architecture Tiers Explained

AWS provides three distinct paths for Odoo deployment. Each tier balances cost, performance, and operational complexity.

Quick Comparison

Factor Tier 1: Single Tier 2: Separated Tier 3: Multi-AZ
Monthly Cost $100-120 $180-220 $350-420
Deployment Time 2 hours 4 hours 8 hours
Scaling Manual resize Vertical + horizontal Auto-scaling
Downtime Risk High (single point) Medium (planned) Low (<5 min/year)
Backup Strategy EBS snapshots RDS auto-backup Multi-region replica
Best For POC, <10 users Production, <100 users Mission-critical, 100+ users

Decision shortcut:


Tier 1: Single-Server Architecture

All components run on one EC2 instance. Nginx proxies to Odoo, Odoo connects to local PostgreSQL. Filestore sits on EBS volume attached to instance.

Architecture Diagram

Tier 1 single-server architecture showing all components on one EC2 instance with EBS storage

Technical Specifications

EC2 Instance:

Software Stack:

Backup Strategy:

Cost Breakdown

Component Specification Monthly Cost
EC2 t3.medium On-Demand, us-east-1 $30.37
EBS gp3 100GB 3,000 IOPS $8.00
EBS Snapshots 100GB × 7 days $3.50
Elastic IP 1 IP (attached) $0.00
Data Transfer 500GB outbound $45.00
Total   $86.87

Add 20% buffer for burstable CPU credits: $104/month

When to Choose Tier 1

Good fit:

Poor fit:

Scaling Limitations

Vertical scaling:

  1. Stop EC2 instance (downtime: 5-10 minutes)
  2. Resize to t3.large (4GB → 8GB RAM)
  3. Restart instance
  4. Reconfigure Odoo workers (adjust /opt/odoo/odoo.conf)

Problem: Database and application share resources. PostgreSQL memory pressure impacts Odoo response times. No way to scale independently.

Maximum capacity: ~20 concurrent users before performance degrades.


Tier 2: Separated Architecture

Application and database run on separate instances. EC2 hosts Nginx + Odoo. RDS manages PostgreSQL. S3 stores filestore attachments.

Architecture Diagram

Tier 2 separated architecture with EC2 application server, RDS database, and S3 filestore

Technical Specifications

EC2 Application Server:

RDS Database:

S3 Filestore:

Backup Strategy:

Cost Breakdown

Component Specification Monthly Cost
EC2 t3.large On-Demand $60.74
RDS db.t3.medium Single-AZ $48.18
RDS Storage 100GB gp3 $11.50
RDS Backup 100GB 7-day retention $9.50
S3 Standard 50GB Filestore $1.15
S3 Requests 100K PUT, 500K GET $0.50
EBS gp3 50GB Application tier $4.00
Data Transfer 500GB outbound $45.00
Total   $180.57

Conservative estimate: $200/month with buffer.

When to Choose Tier 2

Good fit:

Advantages over Tier 1:

Limitations:

Scaling Path

Phase 1: Vertical scaling (0-50 users)

Phase 2: Read replicas (50-80 users)

Phase 3: Horizontal scaling → Migrate to Tier 3


Tier 3: High-Availability Architecture

Multi-AZ deployment with automatic failover. Application Load Balancer distributes traffic across two EC2 instances in separate availability zones. RDS Multi-AZ provides sub-60-second database failover.

Architecture Diagram

Tier 3 high-availability architecture with load balancer, multi-AZ EC2 instances, RDS Multi-AZ, and cross-region S3 replication

Technical Specifications

Application Load Balancer:

EC2 Application Servers (×2):

RDS Multi-AZ:

S3 Filestore:

Backup Strategy:

Cost Breakdown

Component Specification Monthly Cost
ALB 0.5 LCU average $22.00
EC2 t3.xlarge ×2 On-Demand $121.47 × 2
RDS db.t3.large Multi-AZ $96.36 × 2
RDS Storage 200GB gp3 Multi-AZ $23.00 × 2
RDS Backup 200GB 30-day retention $19.00
S3 Standard 100GB Filestore + CRR $2.30 + $2.30
EBS gp3 50GB ×2 Application tier $4.00 × 2
Data Transfer 1TB outbound $90.00
Total   $427.43

Budget with 10% buffer: $470/month

When to Choose Tier 3

Good fit:

Advantages over Tier 2:

When NOT to choose Tier 3:

Scaling Path

Phase 1: Vertical scaling (100-200 users)

Phase 2: Horizontal scaling (200-500 users)

Phase 3: Enterprise (500+ users)


Cost Comparison Matrix

3-Year Total Cost of Ownership

Item Tier 1 Tier 2 Tier 3
Monthly AWS $104 $200 $470
Year 1 $1,248 $2,400 $5,640
Year 2 (10% growth) $1,373 $2,640 $6,204
Year 3 (10% growth) $1,510 $2,904 $6,824
3-Year Total $4,131 $7,944 $18,668
Downtime Cost (assumed) $12,000 $3,000 $500
True TCO $16,131 $10,944 $19,168

Downtime assumptions:

Conclusion: Tier 2 offers best TCO for most production deployments when downtime costs are factored in.

Break-Even Analysis

When does Tier 2 justify its cost over Tier 1?

Monthly delta: $200 - $104 = $96/month premium

If one 4-hour outage costs your business >$1,152 in lost revenue ($96 × 12 months), Tier 2 pays for itself in year one.

Calculation:

Decision rule: If 7+ employees lose productivity during Odoo downtime, choose Tier 2.

When does Tier 3 justify its cost over Tier 2?

Monthly delta: $470 - $200 = $270/month premium

Annual premium: $3,240

If one 2-hour outage costs >$3,240, Tier 3 pays for itself.

Calculation:

Decision rule: If peak-hour downtime costs exceed $1,500/hour, choose Tier 3.


Architecture Decision Framework

Step 1: Calculate Downtime Cost

Formula:

Hourly Impact = (Affected Employees × Avg Hourly Cost) + Direct Revenue Loss

Example (50-person company, $100K/month revenue):

Step 2: Apply Decision Tree

Architecture decision tree based on downtime cost calculation and production status

Step 3: Validate with Growth Projections

User growth rates:

Example (Tier 2 sizing validation):

Current: 25 users, 10 concurrent sessions

Year 1 projection: 25 × 1.20^4 = 52 users Year 2 projection: 52 × 1.15^4 = 91 users Year 3 projection: 91 × 1.10^4 = 133 users

Tier 2 capacity: 100 concurrent users (t3.large + db.t3.medium)

Verdict: Tier 2 fits years 1-2, requires resize in year 3 (upgrade to t3.xlarge + db.t3.large). Total cost remains <$300/month. Better than starting with Tier 3 at $470/month.

Step 4: Compliance Check

Regulatory requirements forcing architecture choices:

Requirement Minimum Tier Why
GDPR data residency Tier 2 RDS encryption at rest mandatory
SOC2 Type II Tier 3 Multi-AZ for availability control
HIPAA BAA Tier 3 AWS requires Multi-AZ for BAA
PCI-DSS Tier 2 Network segmentation (VPC) required

Gotcha: HIPAA compliance forces Tier 3 even if user count is low. Budget accordingly.


Component Deep-Dives

EC2 Instance Sizing Calculator

Formula:

Required RAM = (Concurrent Users × 150MB) + PostgreSQL Buffer + OS Overhead

Example (50 concurrent users):

Worker count formula:

Workers = (2 × vCPU cores) + 1

Validation:

Example (t3.large with 2 vCPU, 8GB RAM):

RDS vs Self-Managed PostgreSQL

Factor RDS Self-Managed (EC2)
Setup Time 10 minutes (console clicks) 2-3 hours (install, tune, secure)
Automated Backups Included, PITR 5-min granularity Manual (pg_dump cron job)
Patching Automated, scheduled maintenance window Manual (test, apply, restart)
Monitoring CloudWatch metrics (free) Install Prometheus + Grafana
Failover Multi-AZ: automatic <60s Manual (promote replica, update DNS)
Cost (100GB) $48/month (db.t3.medium Single-AZ) $30/month (t3.medium EC2 only)
True Cost $48/month $30 + 4 hours/month admin × $75/hour = $330/month

Conclusion: RDS costs 60% more in infrastructure, but saves $280/month in admin labor. Use RDS unless you have dedicated DBA on staff.

S3 vs EFS vs EBS for Filestore

Odoo filestore requirements:

Storage $/GB/month IOPS Latency Multi-Instance Access Best For
EBS gp3 $0.08 3,000-16,000 <1ms ❌ Single EC2 Tier 1 only
EFS $0.30 Variable 1-3ms ✓ Shared across EC2 Legacy (expensive)
S3 Standard $0.023 N/A 10-50ms ✓ Boto3 integration Tier 2, 3 (recommended)

S3 cost advantage example (50GB filestore):

S3 savings: 71% vs EBS, 92% vs EFS.

S3 implementation requirements:

  1. Install boto3 on EC2 instance
  2. Configure Odoo ir.attachment storage: s3://bucket-name
  3. Create IAM role for EC2 → S3 access (no hardcoded credentials)
  4. Enable S3 versioning (compliance requirement)

Gotcha: S3 latency (10-50ms) acceptable for document attachments, poor for database storage. NEVER run PostgreSQL on S3.


Common Architecture Mistakes

Mistake 1: Over-Provisioning for Future Growth

What happens: Company with 10 users deploys Tier 3 HA architecture “to avoid migration later.” Pays $470/month for infrastructure serving <5% capacity.

Math:

Correct approach: Start with Tier 1, migrate to Tier 2 when you hit 20 users (6-12 month timeline). Migration takes 4 hours, costs zero (manual process).

Mistake 2: Using EBS for Filestore in Multi-Instance Setup

What happens: Deploy Tier 3 with two EC2 instances, attach EBS volume to one instance. Second instance can’t access filestore. Attachments uploaded via Instance A fail to load on Instance B.

Why it fails: EBS volumes attach to single EC2 instance only. No shared access.

Fix: Migrate filestore to S3 before deploying second instance.

Migration script:

# Run from EC2 instance with EBS filestore
aws s3 sync /opt/odoo/.local/share/Odoo/filestore s3://odoo-filestore-bucket/
# Update Odoo config: ir_attachment.location = s3://odoo-filestore-bucket

Mistake 3: RDS Single-AZ in Production

What happens: Choose db.t3.medium Single-AZ ($48/month) to save 50% vs Multi-AZ ($96/month). AWS performs maintenance, RDS goes offline for 15 minutes. Odoo crashes, users locked out.

Cost of outage:

Correct approach: RDS Single-AZ acceptable for Tier 2 (non-critical), but schedule maintenance windows during off-hours (3am Sunday). Set up monitoring to alert on unplanned downtime.

Mistake 4: No Auto Scaling Group (Tier 3)

What happens: Deploy two EC2 instances manually behind ALB. Instance A crashes (hardware failure). ALB health checks fail, route traffic to Instance B only. Instance B overloads (18 workers → 9 workers), response times spike to 8 seconds.

Why it fails: No automatic instance replacement. Manual intervention required (launch new EC2, configure, attach to ALB).

Fix: Use Auto Scaling Group:

Min instances: 2
Desired: 2
Max: 4
Health check: ELB + EC2
Termination policy: OldestInstance

When instance fails, ASG launches replacement in <5 minutes. No manual intervention.

Mistake 5: Ignoring Data Transfer Costs

What happens: Deploy RDS in us-east-1, EC2 in us-west-2 (different regions). 500GB/month database queries cross regions. AWS charges $0.02/GB = $10/month extra.

Worse: Deploy RDS in AZ-1a, EC2 in AZ-1b (same region, different AZs). Cross-AZ transfer: 500GB × $0.01/GB = $5/month.

Correct approach:

Tier 3 cost validation:


Next Steps

Ready to Deploy?

Follow step-by-step deployment guide: Odoo AWS Deployment Guide: EC2 + RDS in 4 Hours

Covers:

Deployment time: 4 hours for Tier 2, 8 hours for Tier 3.

Get Production-Ready Tools

Technical Architecture Module ($199 standalone, included in Master Pack):

What you get:

Why buy vs build yourself:

Purchase: Technical Architecture Module or Master Pack ($699 for all 5 modules).

Secure Your Deployment

Next guide in series: Odoo AWS Production Security Hardening

Covers:

Time investment: 6 hours to implement all security controls.


Questions? Open GitHub issue or email aria@ariashaw.com.

Found this useful? Share architecture decision framework with your team.

tags: