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.
AWS provides three distinct paths for Odoo deployment. Each tier balances cost, performance, and operational complexity.
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:
All components run on one EC2 instance. Nginx proxies to Odoo, Odoo connects to local PostgreSQL. Filestore sits on EBS volume attached to instance.
EC2 Instance:
t3.medium
(2 vCPU, 4GB RAM)Software Stack:
Backup Strategy:
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
Good fit:
Poor fit:
Vertical scaling:
/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.
Application and database run on separate instances. EC2 hosts Nginx + Odoo. RDS manages PostgreSQL. S3 stores filestore attachments.
EC2 Application Server:
t3.large
(2 vCPU, 8GB RAM)RDS Database:
db.t3.medium
(2 vCPU, 4GB RAM)S3 Filestore:
Backup Strategy:
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.
Good fit:
Advantages over Tier 1:
Limitations:
Phase 1: Vertical scaling (0-50 users)
Phase 2: Read replicas (50-80 users)
Phase 3: Horizontal scaling → Migrate to Tier 3
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.
Application Load Balancer:
/web/health
endpoint (30-second interval)EC2 Application Servers (×2):
t3.xlarge
(4 vCPU, 16GB RAM)RDS Multi-AZ:
db.t3.large
(2 vCPU, 8GB RAM)S3 Filestore:
Backup Strategy:
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
Good fit:
Advantages over Tier 2:
When NOT to choose Tier 3:
Phase 1: Vertical scaling (100-200 users)
Phase 2: Horizontal scaling (200-500 users)
Phase 3: Enterprise (500+ users)
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.
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.
Formula:
Hourly Impact = (Affected Employees × Avg Hourly Cost) + Direct Revenue Loss
Example (50-person company, $100K/month revenue):
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.
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.
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):
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.
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:
boto3
on EC2 instanceir.attachment
storage: s3://bucket-name
Gotcha: S3 latency (10-50ms) acceptable for document attachments, poor for database storage. NEVER run PostgreSQL on S3.
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).
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
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.
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.
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:
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.
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).
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: