# Reserved vs. On-Demand Instances

> Commit to 1-3 year terms for up to 75% savings vs. pay-as-you-go. Trade flexibility for predictable cost savings.

- **Category**: Trade-offs
- **Subcategory**: Cloud Infrastructure
- **Canonical URL**: https://designpattern.fyi/trade_offs/reserved-vs-on-demand/

---

## Description
**Intent**: Balance cost savings against flexibility in cloud infrastructure commitments. Reserved instances require 1-3 year commitments but offer significant discounts (up to 75%). On-demand instances offer maximum flexibility at premium pricing.

**Context**: You have predictable, long-running workloads (databases, core services). Reserved instances provide substantial savings but lock you into specific instance types and terms. On-demand instances offer flexibility to scale down or change instance types but cost significantly more for steady-state workloads.

**Solution**: Use reserved instances for baseline capacity of predictable workloads. Use on-demand for spikes and variable workloads. Consider convertible reserved instances for some flexibility. Analyze usage patterns to determine optimal reserved/on-demand mix. Use AWS Cost Explorer or similar tools to identify reservation opportunities. Sell unused reservations on the marketplace if needs change.



## Use Cases
Production database cluster where 80% of capacity is baseline traffic using reserved instances. 20% is seasonal spikes using on-demand. Savings of 60% on baseline capacity with flexibility for growth.



## Implementation Example

```python
// Reserved vs. On-Demand: Optimizing instance mix

import boto3
datetime import datetime, timedelta

class InstanceOptimizer:
    def __init__(self):
        self.cloudwatch = boto3.client('cloudwatch')
        self.ec2 = boto3.client('ec2')
    
    def analyze_usage_patterns(self, instance_type, days=30):
        """Analyze usage to determine optimal reservation strategy"""
        end_time = datetime.utcnow()
        start_time = end_time - timedelta(days=days)
        
        # Get CPU utilization metrics
        metrics = self.cloudwatch.get_metric_statistics(
            Namespace='AWS/EC2',
            MetricName='CPUUtilization',
            Dimensions=[{'Name': 'InstanceType', 'Value': instance_type}],
            StartTime=start_time,
            EndTime=end_time,
            Period=3600,
            Statistics=['Average']
        )
        
        # Analyze patterns
        avg_utilization = sum(m['Average'] for m in metrics['Datapoints']) / len(metrics['Datapoints'])
        min_utilization = min(m['Average'] for m in metrics['Datapoints'])
        
        return {
            'avg_utilization': avg_utilization,
            'min_utilization': min_utilization,
            'baseline_recommendation': min_utilization
        }
    
    def calculate_reservation_roi(self, instance_type, hours_per_month=730):
        """Calculate ROI for reserved vs. on-demand"""
        # Get pricing (simplified)
        on_demand_price = self.get_on_demand_price(instance_type)
        reserved_price = self.get_reserved_price(instance_type, term='1yr')
        
        monthly_on_demand = on_demand_price * hours_per_month
        monthly_reserved = reserved_price / 12  # Annual reservation
        
        savings = (monthly_on_demand - monthly_reserved) / monthly_on_demand
        return savings
    
    def recommend_strategy(self, instance_type):
        """Recommend optimal reserved/on-demand mix"""
        usage = self.analyze_usage_patterns(instance_type)
        roi = self.calculate_reservation_roi(instance_type)
        
        if usage['min_utilization'] > 50 and roi > 0.3:
            return {
                'strategy': 'heavy_reservation',
                'reserved_percentage': 80,
                'on_demand_percentage': 20,
                'reason': 'High baseline utilization with good ROI'
            }
        elif usage['min_utilization'] > 20:
            return {
                'strategy': 'moderate_reservation',
                'reserved_percentage': 50,
                'on_demand_percentage': 50,
                'reason': 'Moderate baseline with flexibility needs'
            }
        else:
            return {
                'strategy': 'on_demand_only',
                'reserved_percentage': 0,
                'on_demand_percentage': 100,
                'reason': 'Unpredictable usage patterns'
            }

```



## Trade-offs


### Advantages

- Significant cost savings for predictable workloads (30-75%)

- Provides cost predictability for budgeting

- Different types (standard, convertible, scheduled) for different needs

- Can sell reservations if plans change




### Considerations & Drawbacks

- Locks you into specific instance types and regions

- Requires usage forecasting and planning

- Can lose money if usage drops significantly

- Adds complexity to cost management and optimization







