
A comprehensive cost optimization savings plans vs reserved instances(RI)
AWS Cost Optimization: Savings Plans vs Reserved Instances When it comes to reducing AWS costs, two primary discount mechanisms stand out: Savings Plans and Reserved Instances (RIs). Both offer significant savings over On-Demand pricing, but they work differently and suit different use cases. Understanding when to use each can save your organization thousands of dollars annually.

Key Topics Covered:
• What AWS Resource Explorer is and its benefits
• Setup and configuration with AWS CLI commands
• Three detailed hands-on scenarios with real examples
Hands-On Examples:
1. Finding Untagged Resources - Identify resources missing governance tags with automated tagging script
2. Cost Optimization Discovery - Find stopped instances, empty S3 buckets, unused EIPs, and unattached volumes
3. Security Compliance Audit - Audit IAM roles, KMS keys, secrets, and security groups
Practical Elements:
• Complete AWS CLI commands for each scenario
• Automated scripts for cost analysis and security auditing
• Advanced search techniques with complex queries
• CloudWatch integration for monitoring
• Lambda function example for automated reporting
• Troubleshooting guide and best practices
The blog provides actionable code that readers can immediately use to discover, analyze, and manage their AWS resources more effectively across multiple accounts and regions.
What Are Savings Plans?
Savings Plans are flexible pricing models that provide savings of up to 72% on AWS compute usage. You commit to a consistent amount of usage (measured in $/hour) for a 1 or 3-year term, and AWS automatically applies the discount to eligible services.
What Are Reserved Instances?
Reserved Instances provide up to 75% discount compared to On-Demand pricing. You reserve specific instance types in specific regions for 1 or 3-year terms, receiving a discount in exchange for this commitment.
Key Differences
Feature | Savings Plans | Reserved Instances |
|---|---|---|
Flexibility | High — applies across instance families, sizes, regions | Low — tied to a specific instance type and region |
Commitment | Spend per hour | Specific instance setup |
Coverage | EC2, Lambda, Fargate | EC2, RDS, ElastiCache, Redshift, and more |
Payment Options | All Upfront, Partial Upfront, No Upfront | All Upfront, Partial Upfront, No Upfront |
Convertibility | Not available (It is default flexible) | Convertible RIs can be exchanged |
Maximum Discount | Up to 72% | Up to 72% |
Flexibility Matrix (Green = High, Yellow = Medium, Red = Low)

Practical Example: E-commerce Application
Let's compare both options for a typical e-commerce workload:
Current Usage
Production: 10x m5.large instances (24/7)
Staging: 5x m5.xlarge instances (12 hours/day)
Development: 3x t3.medium instances (8 hours/day)
Region: us-east-1

On-Demand Costs (Monthly)
Production: 10 × $0.096/hour × 24 × 30 = $691.20
Staging: 5 × $0.192/hour × 12 × 30 = $345.60
Development: 3 × $0.0416/hour × 8 × 30 = $29.95
Total Monthly: $1,066.75
Annual Cost: $12,801
Option 1: Reserved Instances Approach
RI Purchase Strategy
# Purchase RIs for predictable workloads
aws ec2 purchase-reserved-instances-offering \
--reserved-instances-offering-id "ri-offering-12345" \
--instance-count 10 \
--limit-price 0.062
# Production: 10x m5.large Standard RIs (3-year, Partial Upfront)
# Cost: $0.062/hour (35% discount)
RI Cost Breakdown
Workload | Instance Type | Quantity | RI Rate | Monthly Cost | Annual Savings |
|---|---|---|---|---|---|
Production | m5.large | 10 | $0.062/hr | $446.40 | $2,937.60 |
Staging | m5.xlarge | 5 | On-Demand | $345.60 | $0 |
Development | t3.medium | 3 | On-Demand | $29.95 | $0 |
Total | | | | $821.95 | $2,937.60 |
Annual Cost with RIs $9,863.40
Total Savings: $2,937.60 (23%)
Option 2: Savings Plans Approach
Compute Savings Plan Purchase
# Purchase Compute Savings Plan
aws savingsplans create-savings-plan \
--savings-plan-type "Compute" \
--term-duration-in-years 3 \
--payment-option "PartialUpfront" \
--commitment 0.50 \
--upfront-payment-amount 5400 \
--tags Key=Purpose,Value=CostOptimization
Savings Plan Cost Analysis
- Commitment: $0.50/hour ($4,380/year)
- Discount Rate: 66% for m5.large, 64% for m5.xlarge, 45% for t3.medium
- Flexibility: Covers all instance types and sizes
Item | Usage | Price/hr | Monthly | Annual |
|---|---|---|---|---|
Production | 240 hrs | $0.033 | $237.60 | $5,443.20 |
Staging | 180 hrs | $0.069 | $372.60 | $876.00 |
Development | 72 hrs | $0.023 | $49.68 | $242.16 |
Total | | | $659.88 | $6,561.36 |
Annual Cost with Savings Plan: $7,918.56
Total Savings: $4,882.44 (38%)
Detailed Comparison Table
Aspect | RIs | Savings Plans |
|---|---|---|
Best For | Predictable, steady workloads | Variable, flexible workloads |
Commitment | Specific instance setup | Spend per hour |
Regional | Tied to region/AZ | Works across regions |
Family | None (Standard RIs) | Full flexibility |
Size | Limited within family | Full flexibility |
OS | Limited | Full flexibility |
Tenancy | Limited | Full flexibility |
Coverage | EC2, RDS, ElastiCache, etc. | EC2, Lambda, Fargate |
Marketplace | Sell unused RIs | No transfers |
Changes | Limited changes | No changes needed |
When to Use Reserved Instances

Ideal Scenarios
1. Predictable Workloads
# Database servers running 24/7
aws rds purchase-reserved-db-instances-offering \
--reserved-db-instances-offering-id "rds-offering-67890" \
--db-instance-count 2
2. Specific Database Requirements
- RDS instances with consistent usage
- ElastiCache clusters
- Redshift data warehouses
3. Maximum Discount Priority
- When you need the highest possible discount (up to 72%)
- Long-term stable architecture
RI Management Example
# Monitor RI utilization
aws ce get-reservation-utilization \
--time-period Start=2024-01-01,End=2024-01-31 \
--group-by Type=DIMENSION,Key=SERVICE
# Modify RI attributes
aws ec2 modify-reserved-instances \
--reserved-instances-ids r-1234567890abcdef0 \
--target-configurations AvailabilityZone=us-east-1b,InstanceCount=5,InstanceType=m5.xlarge
When to Use Savings Plans
Ideal Scenarios
1. Dynamic Workloads
# Auto-scaling applications
aws application-autoscaling register-scalable-target \
--service-namespace ecs \
--scalable-dimension ecs:service:DesiredCount \
--resource-id service/my-cluster/my-service \
--min-capacity 2 \
--max-capacity 20
2. Multi-Region Deployments
- Applications spanning multiple regions
- Disaster recovery scenarios
- Global content delivery
3. Containerized Workloads
- ECS with Fargate
- Lambda functions
- Mixed compute environments
Savings Plan Monitoring
# Check Savings Plan utilization
aws savingsplans describe-savings-plans-utilization \
--time-period Start=2024-01-01,End=2024-01-31
# Get coverage report
aws ce get-savings-plans-coverage \
--time-period Start=2024-01-01,End=2024-01-31 \
--group-by Type=DIMENSION,Key=SERVICE
Real-World Scenarios
Scenario 1: Startup with Growth Plans
Challenge: Unpredictable scaling, multiple instance types
Solution: Compute Savings Plan
# Start with modest commitment, scale as needed
aws savingsplans create-savings-plan \
--savings-plan-type "Compute" \
--term-duration-in-years 1 \
--commitment 0.25 \
--payment-option "NoUpfront"
Scenario 2: Enterprise Database Workload
Challenge: Stable RDS instances, predictable usage
Solution: RDS Reserved Instances
# Purchase RDS RIs for production databases
aws rds purchase-reserved-db-instances-offering \
--reserved-db-instances-offering-id "rds-mysql-offering" \
--db-instance-count 3 \
--tags Key=Environment,Value=Production
Scenario 3: Hybrid Architecture
Challenge: Mix of stable and variable workloads
Solution: Combination approach
- RIs for stable database tier
- Savings Plans for variable compute tier
Cost Optimization Strategy
Step 1: Analyze Usage Patterns
# Get cost and usage data
aws ce get-cost-and-usage \
--time-period Start=2024-01-01,End=2024-03-31 \
--granularity MONTHLY \
--metrics BlendedCost,UsageQuantity \
--group-by Type=DIMENSION,Key=SERVICE
# Analyze instance usage
aws ce get-rightsizing-recommendation \
--service EC2-Instance \
--page-size 100
Step 2: Calculate Potential Savings
# Python script to calculate savings potential
import boto3
def calculate_savings_potential():
ce_client = boto3.client('ce')
# Get RI recommendations
ri_recommendations = ce_client.get_reservation_purchase_recommendation(
Service='Amazon Elastic Compute Cloud - Compute',
LookbackPeriodInDays=60,
TermInYears='THREE_YEARS',
PaymentOption='PARTIAL_UPFRONT'
)
# Get Savings Plan recommendations
sp_recommendations = ce_client.get_savings_plans_purchase_recommendation(
SavingsPlansType='COMPUTE_SP',
TermInYears='THREE_YEARS',
PaymentOption='PARTIAL_UPFRONT',
LookbackPeriodInDays=60
)
return ri_recommendations, sp_recommendations
Step 3: Implementation Plan
1. Month 1: Purchase Savings Plans for 60% of baseline usage
2. Month 2: Buy RIs for predictable database workloads
3. Month 3: Monitor and adjust based on utilization
4. Quarterly: Review and optimize commitments
Best Practices
For Reserved Instances
- Start with Standard RIs for maximum discount
- Use Convertible RIs if architecture might change
- Monitor utilization monthly
- Consider RI marketplace for unused capacity
For Savings Plans
- Begin with conservative commitment (50-60% of usage)
- Monitor coverage and utilization
- Increase commitment as usage patterns stabilize
- Use Cost Explorer for ongoing optimization
Monitoring and Alerts
# Set up cost anomaly detection
aws ce create-anomaly-detector \
--anomaly-detector '{
"DetectorName": "SavingsPlanAnomalyDetector",
"MonitorType": "DIMENSIONAL",
"DimensionKey": "SERVICE",
"MatchOptions": ["EQUALS"],
"MatchValues": ["Amazon Elastic Compute Cloud - Compute"]
}'
# Create budget for commitment tracking
aws budgets create-budget \
--account-id 123456789012 \
--budget '{
"BudgetName": "SavingsPlansCommitment",
"BudgetLimit": {"Amount": "5000", "Unit": "USD"},
"TimeUnit": "MONTHLY",
"BudgetType": "COST"
}'
Conclusion
When to pick RI | When to pick Savings Plans |
|---|---|
Workloads are predictable and stable | Workloads are variable or growing |
You need maximum discount (up to 72%) | You need flexibility across regions/types |
Great for RDS/ElastiCache/Redshift | Great for EC2/Lambda/Fargate |
Architecture is unlikely to change | Architecture evolves frequently |
You can commit to specific configurations | You prefer dollar-based commitment |
Recommendation: For most organizations, start with Savings Plans for their flexibility, then add Reserved Instances for specific predictable workloads like databases. This hybrid approach typically delivers 30-50% cost savings while maintaining operational flexibility.

The key to success is continuous monitoring and adjustment based on actual usage patterns and business requirements.
Enjoyed reading this content? Let the author know!
Your likes, comments, shares, and saves help creators reach more builders.
Loading recommendations
Loading article