Aurora Serverless
Key concepts
Aurora Serverless v2
ACU scaling
Cost comparison scenarios
Pause compute capability
When to use serverless
Overview
Amazon Aurora Serverless is an on-demand, auto-scaling configuration for Amazon Aurora that automatically adjusts database capacity based on application demand. With Aurora Serverless v2, you pay only for the capacity you use, making it ideal for applications with variable, unpredictable, or intermittent workloads.
Core Concept
Aurora Serverless v2 provides instant, fine-grained scaling measured in Aurora Capacity Units (ACUs). Each ACU provides approximately 2 GB of memory and corresponding CPU/networking. Capacity scales automatically between your configured minimum and maximum ACUs, scaling in increments of 0.5 ACU in milliseconds. You pay per ACU-hour consumed, making it cost-effective for variable workloads while eliminating capacity planning.
Exam questions often compare Aurora Serverless vs Provisioned. Key signals: 'unpredictable/variable workload' -> Serverless, 'infrequently used' -> Serverless with scale to 0 (v1), 'consistent 24/7 high load' -> Provisioned with Reserved Instances, 'development/test environments' -> Serverless for cost savings during idle periods.
Key Concepts
Aurora Serverless v2 Architecture

Aurora Serverless v2 Fundamentals
What is Aurora Serverless v2?
- On-demand, auto-scaling database configuration
- Compatible with Aurora MySQL and Aurora PostgreSQL
- Scales capacity in seconds (not minutes)
- Supports all Aurora features (Global Database, Multi-AZ, Read Replicas)
Key Improvements over v1: | Feature | v1 | v2 | |---------|----|----| | Scaling Granularity | Doubling (2, 4, 8, 16...) | 0.5 ACU increments | | Scaling Speed | 30 seconds - minutes | Milliseconds | | Scale to Zero | Yes | No (min 0.5 ACU) | | Read Replicas | No | Yes (up to 15) | | Multi-AZ | Limited | Full support | | Global Database | No | Yes |
Architecture Benefits:
- Scales writer and readers independently
- Maintains connections during scaling
- No cold starts (unlike v1)
- Seamless integration with provisioned instances
Aurora Capacity Units (ACUs)
What is an ACU?
- Unit of measurement for Aurora Serverless capacity
- 1 ACU = approximately 2 GB of memory
- CPU, networking, and memory scale proportionally
- Fractional ACUs supported (0.5, 1.5, 2.5, etc.)
ACU Specifications: | ACUs | Memory (approx.) | Use Case | |------|------------------|----------| | 0.5 | 1 GB | Minimal workloads | | 1 | 2 GB | Light development | | 2 | 4 GB | Small applications | | 4 | 8 GB | Medium workloads | | 8 | 16 GB | Production apps | | 16 | 32 GB | Large applications | | 128 | 256 GB | Maximum capacity |
ACU Range Configuration:
- Minimum ACUs: 0.5 to 128
- Maximum ACUs: 1 to 128
- Maximum must be >= Minimum
- Higher minimum = faster scaling response
Scaling Behavior:
- Scales up instantly when needed
- Scales down after cooldown period
- Scaling is transparent to applications
- No connection drops during scaling
# Create Aurora Serverless v2 cluster
aws rds create-db-cluster \
--db-cluster-identifier my-aurora-serverless \
--engine aurora-mysql \
--engine-version 8.0.mysql_aurora.3.04.0 \
--master-username admin \
--master-user-password MySecurePassword123! \
--serverless-v2-scaling-configuration MinCapacity=0.5,MaxCapacity=16 \
--vpc-security-group-ids sg-12345678
# Add Serverless v2 instance to cluster
aws rds create-db-instance \
--db-instance-identifier my-aurora-serverless-instance \
--db-instance-class db.serverless \
--engine aurora-mysql \
--db-cluster-identifier my-aurora-serverless
# Modify scaling configuration
aws rds modify-db-cluster \
--db-cluster-identifier my-aurora-serverless \
--serverless-v2-scaling-configuration MinCapacity=1,MaxCapacity=32
# Check current capacity
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name ServerlessDatabaseCapacity \
--dimensions Name=DBClusterIdentifier,Value=my-aurora-serverless \
--start-time $(date -u -v-1H +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--period 300 \
--statistics AverageACU Scaling Behavior

Scaling Mechanics
How Scaling Works:
- Aurora continuously monitors database workload
- Metrics tracked: CPU utilization, connections, memory pressure
- When threshold exceeded, capacity scales up instantly
- Scale-down occurs after sustained low utilization
Scaling Triggers: | Metric | Scale Up When | Scale Down When | |--------|---------------|-----------------| | CPU Utilization | High sustained usage | Prolonged low usage | | Memory Pressure | Buffer pool pressure | Excess memory available | | Connections | Approaching limits | Far below capacity |
Scaling Speed:
- Scale-up: Milliseconds to seconds
- Scale-down: Minutes (after cooldown)
- No connection interruption
- No query timeout during scaling
Minimum ACU Strategy:
- Higher minimum = faster scale-up response
- Lower minimum = more cost savings at idle
- Consider baseline workload when setting minimum
- Trade-off: cost vs responsiveness
Scaling Configuration Strategies
Conservative Configuration (Cost-Optimized):
MinCapacity: 0.5
MaxCapacity: 16
- Maximum cost savings during idle
- Slower initial scale-up response
- Best for dev/test environments
Balanced Configuration:
MinCapacity: 2
MaxCapacity: 32
- Good baseline for production
- Quick response to load spikes
- Moderate idle costs
Performance-Optimized:
MinCapacity: 8
MaxCapacity: 64
- Instant response to traffic
- Higher baseline cost
- Best for latency-sensitive apps
Setting Based on Workload: | Workload Pattern | Recommended Min | Recommended Max | |------------------|-----------------|-----------------| | Sporadic, unpredictable | 0.5-1 | 8-16 | | Business hours only | 2-4 | 16-32 | | Variable with peaks | 4-8 | 32-64 | | Constant high load | Consider Provisioned | - |
# Monitor current serverless capacity
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name ServerlessDatabaseCapacity \
--dimensions Name=DBClusterIdentifier,Value=my-aurora-serverless \
--start-time $(date -u -v-24H +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--period 3600 \
--statistics Average Maximum Minimum
# Monitor ACU utilization percentage
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name ACUUtilization \
--dimensions Name=DBClusterIdentifier,Value=my-aurora-serverless \
--start-time $(date -u -v-1H +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--period 300 \
--statistics Average Maximum
# Create CloudWatch alarm for high ACU utilization
aws cloudwatch put-metric-alarm \
--alarm-name "Aurora-Serverless-High-ACU" \
--alarm-description "ACU utilization above 80%" \
--metric-name ACUUtilization \
--namespace AWS/RDS \
--statistic Average \
--period 300 \
--threshold 80 \
--comparison-operator GreaterThanThreshold \
--dimensions Name=DBClusterIdentifier,Value=my-aurora-serverless \
--evaluation-periods 3 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:alerts
# Create alarm for approaching maximum capacity
aws cloudwatch put-metric-alarm \
--alarm-name "Aurora-Serverless-Near-Max" \
--alarm-description "Capacity approaching maximum ACUs" \
--metric-name ServerlessDatabaseCapacity \
--namespace AWS/RDS \
--statistic Maximum \
--period 300 \
--threshold 14 \
--comparison-operator GreaterThanThreshold \
--dimensions Name=DBClusterIdentifier,Value=my-aurora-serverless \
--evaluation-periods 2 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:alertsCost Comparison Scenarios

Aurora Serverless v2 Pricing
Pricing Model:
- Pay per ACU-hour consumed
- Billed per second (minimum 10 minutes)
- Storage billed separately (same as provisioned Aurora)
- I/O charges apply (same as provisioned)
Regional Pricing Example (us-east-1): | Component | Price | |-----------|-------| | ACU-hour | ~$0.12/ACU-hour | | Storage | $0.10/GB-month | | I/O Requests | $0.20 per million | | Backup Storage | $0.021/GB-month (beyond free) |
Monthly Cost Calculation:
Monthly Cost = (Average ACUs × Hours × $0.12) + Storage + I/O
Example - Variable Workload:
- Average 4 ACUs during business hours (10 hrs × 22 days)
- Average 1 ACU during off-hours (14 hrs × 22 days + weekends)
- Business hours: 4 × 220 × $0.12 = $105.60
- Off-hours: 1 × 308 × $0.12 = $36.96
- Weekend: 1 × 192 × $0.12 = $23.04
- Total compute: ~$165.60/month
Serverless vs Provisioned Cost Analysis
Cost Comparison Framework:
Scenario 1: Variable Workload (Serverless Wins) | Metric | Provisioned | Serverless v2 | |--------|-------------|---------------| | Instance | db.r6g.large | 0.5-8 ACUs | | Hours used | 730 (24/7) | 730 | | Avg utilization | 30% | Scales to demand | | Monthly compute | ~$175 | ~$88 | | Savings | - | ~50% |
Scenario 2: Consistent High Load (Provisioned Wins) | Metric | Provisioned | Serverless v2 | |--------|-------------|---------------| | Instance | db.r6g.xlarge | 8-16 ACUs | | Hours used | 730 (24/7) | 730 | | Avg utilization | 80% | Avg 8 ACUs | | Monthly compute | ~$350 | ~$700 | | Reserved (1yr) | ~$220 | N/A | | Winner | Provisioned + RI | - |
Scenario 3: Development Environment (Serverless Wins) | Metric | Provisioned | Serverless v2 | |--------|-------------|---------------| | Instance | db.r6g.medium | 0.5-4 ACUs | | Hours active | 200 (business hours) | 200 | | Avg ACUs needed | 2 equiv | 1.5 | | Monthly compute | ~$88 | ~$36 | | Savings | - | ~60% |
Aurora Serverless vs Provisioned Decision Guide
| Factor | Serverless v2 | Provisioned | Winner |
|---|---|---|---|
| Variable/unpredictable workloads | Scales automatically, pay for use | Pay for provisioned capacity 24/7 | Serverless |
| Consistent high utilization (70%+) | Higher per-ACU cost | Lower with Reserved Instances | Provisioned |
| Development/test environments | Scale down during idle | Paying even when idle | Serverless |
| Infrequent usage (< 10 hrs/day) | Pay only when active | Pay 24/7 | Serverless |
| Maximum performance/control | Limited by ACU scaling | Choose exact instance type | Provisioned |
| Read replica scaling | Independent ACU scaling | Fixed instance sizes | Serverless |
| Global Database | Fully supported | Fully supported | Tie |
| Reserved Instance savings | Not available | Up to 69% savings | Provisioned |
# Get Aurora Serverless costs from Cost Explorer
aws ce get-cost-and-usage \
--time-period Start=2024-01-01,End=2024-01-31 \
--granularity MONTHLY \
--metrics BlendedCost UsageQuantity \
--filter '{
"And": [
{"Dimensions": {"Key": "SERVICE", "Values": ["Amazon Relational Database Service"]}},
{"Dimensions": {"Key": "USAGE_TYPE", "Values": ["Aurora:ServerlessV2Usage"]}}
]
}' \
--group-by Type=DIMENSION,Key=USAGE_TYPE
# Compare ACU usage over time
aws cloudwatch get-metric-data \
--metric-data-queries '[
{
"Id": "capacity",
"MetricStat": {
"Metric": {
"Namespace": "AWS/RDS",
"MetricName": "ServerlessDatabaseCapacity",
"Dimensions": [{"Name": "DBClusterIdentifier", "Value": "my-aurora-serverless"}]
},
"Period": 3600,
"Stat": "Average"
}
}
]' \
--start-time $(date -u -v-7d +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ)
# Estimate monthly costs based on average ACU
# Formula: Average_ACUs × 730_hours × $0.12
echo "Estimated monthly cost for average 4 ACUs:"
echo "4 × 730 × 0.12 = \$350.40"Pause Compute Capability
Aurora Serverless v1 Pause vs v2 Scaling
Aurora Serverless v1 - Pause Feature:
- Can scale to 0 ACUs (fully pause)
- No compute charges when paused
- Storage charges continue
- Resume time: 30 seconds to 1 minute
Aurora Serverless v2 - No Pause:
- Minimum 0.5 ACU (cannot scale to 0)
- Always incurs some compute cost
- Instant scaling, no cold start
- Better for production workloads
v1 Pause Configuration:
SecondsUntilAutoPause: 300-86400 (5 min to 24 hrs)
AutoPause: true/false
Cost Impact of v1 Pause:
- Idle database: $0 compute (storage only)
- Resume cost: ~$0.06 (1 ACU for 30 seconds)
- Best for dev/test that sits idle for hours
Why v2 Doesn't Pause:
- Designed for production workloads
- Eliminates cold start latency
- 0.5 ACU minimum keeps database "warm"
- Trade-off: small cost vs no latency
Choosing v1 vs v2 for Cost Optimization
Use Aurora Serverless v1 When:
- Database sits completely idle for hours
- Can tolerate 30+ second cold start
- Cost savings outweigh resume latency
- Simple workloads without read replicas
Use Aurora Serverless v2 When:
- Need instant response to queries
- Require read replicas
- Using Multi-AZ or Global Database
- Production workloads with variable traffic
Hybrid Strategy:
- Development/Test: v1 with auto-pause
- Staging: v2 with low minimum ACUs
- Production: v2 with appropriate minimums
v1 Pause Best Practices:
- Set appropriate pause timeout (5-15 minutes)
- Understand resume latency impact
- Not suitable for user-facing applications
- Good for scheduled batch jobs
# Create Aurora Serverless v1 with auto-pause (note: v1 is legacy)
aws rds create-db-cluster \
--db-cluster-identifier my-aurora-v1-pausable \
--engine aurora-mysql \
--engine-version 5.7.mysql_aurora.2.11.2 \
--engine-mode serverless \
--scaling-configuration MinCapacity=1,MaxCapacity=16,AutoPause=true,SecondsUntilAutoPause=300 \
--master-username admin \
--master-user-password MySecurePassword123!
# Modify auto-pause settings
aws rds modify-db-cluster \
--db-cluster-identifier my-aurora-v1-pausable \
--scaling-configuration AutoPause=true,SecondsUntilAutoPause=600
# Disable auto-pause for production-like testing
aws rds modify-db-cluster \
--db-cluster-identifier my-aurora-v1-pausable \
--scaling-configuration AutoPause=false
# Force resume a paused cluster by connecting
# Or use Data API to wake it up
aws rds-data execute-statement \
--resource-arn arn:aws:rds:us-east-1:123456789012:cluster:my-aurora-v1-pausable \
--secret-arn arn:aws:secretsmanager:us-east-1:123456789012:secret:my-db-secret \
--database mydb \
--sql "SELECT 1"When to Use Serverless vs Provisioned
Decision Framework
Choose Aurora Serverless v2 When:
- Variable Workloads: Traffic spikes unpredictably
- New Applications: Unknown capacity requirements
- Multi-Tenant SaaS: Usage varies by tenant
- Development/Test: Environments with idle periods
- Periodic Reporting: Heavy queries at scheduled times
- Microservices: Many small databases with variable loads
Choose Provisioned Aurora When:
- Consistent High Load: 70%+ utilization sustained
- Predictable Workloads: Capacity needs are known
- Cost Optimization: Can leverage Reserved Instances
- Maximum Performance: Need specific instance types
- Compliance Requirements: Need fixed infrastructure
- Budget Predictability: Fixed monthly database costs
Hybrid Approach - Mixed Clusters:
- Provisioned writer + Serverless v2 readers
- Handles read scaling with Serverless
- Fixed cost for write capacity
- Best of both worlds
Workload Pattern Recommendations
| Workload Pattern | Recommendation | Reasoning |
|---|---|---|
| Morning spike, quiet evenings | Serverless v2 | Scales down during low usage periods |
| Consistent 24/7 API backend | Provisioned + RI | Reserved Instances provide 40-69% savings |
| Quarterly financial reporting | Serverless v2 | Heavy load only during reports |
| E-commerce with flash sales | Serverless v2 | Handles unpredictable traffic spikes |
| IoT ingestion - steady stream | Provisioned | Consistent load benefits from RI |
| Multi-tenant SaaS platform | Serverless v2 | Each tenant database scales independently |
| Dev/test environments | Serverless v2 or v1 | v1 can pause, v2 scales to 0.5 ACU |
| Data warehouse queries | Serverless v2 | Variable analytical query load |
# Create Aurora cluster with provisioned writer
aws rds create-db-cluster \
--db-cluster-identifier mixed-aurora-cluster \
--engine aurora-mysql \
--engine-version 8.0.mysql_aurora.3.04.0 \
--master-username admin \
--master-user-password MySecurePassword123!
# Add provisioned writer instance
aws rds create-db-instance \
--db-instance-identifier mixed-cluster-writer \
--db-instance-class db.r6g.large \
--engine aurora-mysql \
--db-cluster-identifier mixed-aurora-cluster
# Add Serverless v2 reader for variable read traffic
aws rds create-db-instance \
--db-instance-identifier mixed-cluster-reader-serverless \
--db-instance-class db.serverless \
--engine aurora-mysql \
--db-cluster-identifier mixed-aurora-cluster
# Configure Serverless v2 scaling for the cluster
aws rds modify-db-cluster \
--db-cluster-identifier mixed-aurora-cluster \
--serverless-v2-scaling-configuration MinCapacity=0.5,MaxCapacity=16
# Add custom endpoint for Serverless readers
aws rds create-db-cluster-endpoint \
--db-cluster-identifier mixed-aurora-cluster \
--db-cluster-endpoint-identifier serverless-reader-endpoint \
--endpoint-type READER \
--static-members mixed-cluster-reader-serverlessBest Practices
- Right-Size ACU Range: Set minimum based on baseline load, maximum based on peak requirements
- Monitor ACU Utilization: Track ServerlessDatabaseCapacity and ACUUtilization metrics
- Use Mixed Clusters: Combine provisioned writers with Serverless v2 readers for optimal cost/performance
- Set Appropriate Minimums: Higher minimum = faster scaling but higher baseline cost
- Leverage v1 for Dev/Test: Use auto-pause for truly idle development databases
- Configure Alarms: Alert when approaching maximum ACUs to avoid performance issues
- Analyze Usage Patterns: Use Cost Explorer to validate Serverless savings vs Provisioned
- Consider Reserved Instances: For consistent 70%+ utilization, Provisioned + RI is often cheaper
Common Exam Scenarios
Exam Scenario Decision Guide
| Scenario | Recommended Solution | Key Reasoning |
|---|---|---|
| Startup with unpredictable traffic growth | Aurora Serverless v2 | Scales automatically, no capacity planning needed |
| Enterprise with known steady database load | Provisioned Aurora + Reserved Instances | Up to 69% savings with RI commitment |
| Development databases idle 16+ hours/day | Aurora Serverless v1 with auto-pause | Zero compute cost when paused |
| SaaS with per-tenant databases | Aurora Serverless v2 | Each tenant scales independently |
| Read-heavy app with variable read traffic | Provisioned writer + Serverless v2 readers | Fixed write cost, elastic read scaling |
| Need to minimize database latency | Serverless v2 with higher minimum ACUs | Higher min prevents scale-up latency |
| Budget requires predictable monthly costs | Provisioned Aurora | Fixed instance pricing, no variability |
| Quarterly batch processing job | Serverless v2 (or v1 with pause) | Scale up for batch, scale down after |
Common Pitfalls
Setting Minimum ACUs Too Low for Production
While 0.5 minimum ACUs save costs, production workloads may experience latency during scale-up events. For production systems requiring consistent response times, set minimum ACUs to your typical baseline load (e.g., 2-4 ACUs) rather than the absolute minimum.
Expecting Aurora Serverless v2 to Pause
Unlike v1, Aurora Serverless v2 cannot scale to zero or pause. The minimum is 0.5 ACU, which costs approximately $44/month continuously. If you need zero-cost idle periods, use Serverless v1 (with its limitations) or consider stopping the cluster entirely for extended idle periods.
Using Serverless for Consistent High Utilization
Aurora Serverless has a higher per-ACU cost than equivalent provisioned capacity. For databases running at 70%+ utilization consistently, Provisioned Aurora with Reserved Instances is typically 40-60% cheaper. Always analyze workload patterns before choosing Serverless.
Ignoring Maximum ACU Limits
If your workload exceeds the configured maximum ACUs, performance degrades and queries may timeout. Set maximum ACUs with headroom for unexpected spikes. Monitor the ACUUtilization metric and set alarms at 80% to proactively increase limits.
Forgetting Storage and I/O Costs
ACU costs are only part of Aurora Serverless pricing. Storage ($0.10/GB-month) and I/O requests ($0.20 per million) can add significant costs. A database with high I/O can see I/O costs exceed compute costs. Monitor all cost components, not just ACU hours.
Related Services
Quick Reference
Aurora Serverless v2 Key Numbers
| Metric | Value |
|---|---|
| Minimum ACUs | 0.5 |
| Maximum ACUs | 128 |
| ACU Increment | 0.5 ACU |
| Memory per ACU | ~2 GB |
| Scale-up Speed | Milliseconds |
| Scale-down Cooldown | Minutes |
| Max Read Replicas | 15 |
Pricing Quick Reference
| Component | Approximate Price |
|---|---|
| ACU-hour (v2) | ~$0.12 |
| Storage | $0.10/GB-month |
| I/O Requests | $0.20/million |
| Backup (beyond free) | $0.021/GB-month |
| 0.5 ACU running 24/7 | ~$44/month |
| 4 ACU running 24/7 | ~$350/month |
v1 vs v2 Feature Comparison
| Feature | v1 | v2 |
|---|---|---|
| Scale to Zero | Yes | No (min 0.5) |
| Scaling Speed | 30+ seconds | Milliseconds |
| Read Replicas | No | Yes (up to 15) |
| Multi-AZ | Limited | Full support |
| Global Database | No | Yes |
| Scaling Granularity | Doubling | 0.5 ACU steps |
CLI Quick Reference
# Create Serverless v2 cluster
aws rds create-db-cluster \
--db-cluster-identifier my-cluster \
--engine aurora-mysql \
--serverless-v2-scaling-configuration MinCapacity=0.5,MaxCapacity=16
# Add Serverless v2 instance
aws rds create-db-instance \
--db-instance-identifier my-instance \
--db-instance-class db.serverless \
--engine aurora-mysql \
--db-cluster-identifier my-cluster
# Modify scaling configuration
aws rds modify-db-cluster \
--db-cluster-identifier my-cluster \
--serverless-v2-scaling-configuration MinCapacity=2,MaxCapacity=32
# Check current capacity
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name ServerlessDatabaseCapacity \
--dimensions Name=DBClusterIdentifier,Value=my-cluster \
--start-time $(date -u -v-1H +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--period 300 \
--statistics Average
Cost Optimization Decision Tree
Is utilization > 70% consistently?
├── Yes → Use Provisioned + Reserved Instances
└── No → Is the database idle for hours daily?
├── Yes → Can you tolerate 30+ sec cold start?
│ ├── Yes → Use Serverless v1 with auto-pause
│ └── No → Use Serverless v2 with low minimum
└── No → Use Serverless v2 with appropriate ACU range
Test Your Knowledge
A startup is launching a new application with unpredictable traffic patterns. They expect occasional traffic spikes during marketing campaigns but normal usage of only a few hundred concurrent users. The database must respond quickly at all times. Which Aurora configuration is MOST cost-effective?
A company has an Aurora database that handles financial reporting. The database sees heavy usage for 2 weeks each quarter during report generation but sits mostly idle the rest of the time. Cold start latency is acceptable. Which configuration provides the LOWEST cost?
An e-commerce company uses Aurora Serverless v2 configured with 1 minimum and 32 maximum ACUs. During a flash sale, the database maxed out at 32 ACUs and queries started timing out. What should the solutions architect recommend?
A solutions architect is comparing costs for a database that runs at 80% average utilization 24/7. Current usage is equivalent to 8 ACUs sustained. Which option is MOST cost-effective over 3 years?