Reserved Instances, Savings Plans, and On‑Demand: Which Saves More?
Understand the Three Pricing Models
- On‑Demand – Pay per second (or hour) with no long‑term commitment. Ideal for short‑lived or unpredictable workloads.
- Reserved Instances (RIs) – Commit to a specific instance type, region, and tenancy for 1 or 3 years. You receive a usage discount but the reservation is tied to the exact instance family (e.g.,
m5.large). - Savings Plans (SPs) – Commit to a dollar amount of compute usage (measured in $/hour) for 1 or 3 years. The discount applies across instance families, OS, and even to Fargate and Lambda, giving more flexibility than RIs.
Both RIs and SPs require an upfront or partial‑upfront payment option. The key decision point is how predictable your usage is and how much flexibility you need.
Step 1: Gather Your Current On‑Demand Consumption
- Open AWS Cost Explorer → Usage Reports → select EC2 – Instance Usage.
- Filter by Service = Amazon EC2, Usage Type = BoxUsage, and the last 30 days.
- Export the CSV and note the columns
UsageQuantity(hours) andBlendedCost. - Alternatively, use the CLI to pull the same data:
bash aws ce get-cost-and-usage \ --time-period Start=$(date -d '-30 days' +%Y-%m-%d),End=$(date +%Y-%m-%d) \ --granularity DAILY \ --filter '{"Dimensions":{"Key":"SERVICE","Values":["Amazon Elastic Compute Cloud - Compute"]}}' \ --metrics "BlendedCost" "UsageQuantity" \ --group-by Type=DIMENSION,Key=INSTANCE_TYPE - Sum the
UsageQuantityfor each instance type. This gives you the baseline On‑Demand hours you need to cover.
Step 2: Model a Reserved Instance Purchase
- In Cost Explorer, switch to the Reserved Instance Recommendations tab. AWS automatically suggests RIs that would cover at least 70 % of your historical usage.
- For each recommendation, note:
* Instance family (
m5,c5, etc.) * Size (large,xlarge, …) * Region * Term (1 yr vs 3 yr) * Payment option (All Up‑Front, Partial Up‑Front, No Up‑Front) - Calculate the break‑even point manually:
bash # Example: 1‑yr No Up‑Front m5.large in us-east-1 ON_DEMAND_RATE=$(aws pricing get-products --service-code AmazonEC2 \ --filters Type=TERM_MATCH,Field=instanceType,Value=m5.large \ Type=TERM_MATCH,Field=location,Value="US East (N. Virginia)" \ Type=TERM_MATCH,Field=preInstalledSw,Value=NA \ Type=TERM_MATCH,Field=operatingSystem,Value=Linux \ Type=TERM_MATCH,Field=capacitystatus,Value=Used \ Type=TERM_MATCH,Field=tenancy,Value=Shared \ Type=TERM_MATCH,Field=licenseModel,Value=BringYourOwnLicense \ Type=TERM_MATCH,Field=preInstalledSw,Value=NA \ Type=TERM_MATCH,Field=operation,Value=RunInstances \ Type=TERM_MATCH,Field=productFamily,Value=Compute Instance \ --query "PriceList[0]" --output text) # Parse the JSON to extract the price per hour (omitted for brevity) - Multiply the on‑demand rate by the total hours you used the instance in the last 30 days. Compare that cost to the total RI cost (up‑front + any monthly fees). If the RI total is lower, the RI saves money for that workload.
- Repeat for each instance family you run. Remember that RIs do not apply if you change the instance size or move to a different AZ.
Step 3: Model a Savings Plan Purchase
- In Cost Explorer, go to Savings Plans Recommendations. AWS groups recommendations by Compute Savings Plans (most flexible) and EC2 Instance Savings Plans (similar to RIs but with less flexibility).
- Note the recommended hourly commitment (e.g.,
$0.12 per hour). This is the amount you must pledge for the term. - To test the impact, use the Savings Plans Calculator (available in the console) or run a quick script:
bash # Assume a 1‑yr Compute Savings Plan at 30% discount TOTAL_ON_DEMAND=$(awk -F, '{sum+=$2*$3} END {print sum}' usage.csv) # $hours*$rate SP_DISCOUNT=0.30 SP_COST=$(echo "$TOTAL_ON_DEMAND * (1 - $SP_DISCOUNT)" | bc -l) echo "Projected cost with Savings Plan: $SP_COST" - Unlike RIs, the Savings Plan discount automatically applies to any qualifying usage (EC2, Fargate, Lambda). This means you can mix instance families without buying separate reservations.
- Verify that your commitment level does not exceed your average hourly usage; otherwise you will pay for unused commitment.
Step 4: Compare the Three Options Side‑by‑Side
Create a simple table (CSV or spreadsheet) with the following columns:
| Option | Total Cost (30 days) | Break‑Even Hours | Flexibility |
|---|---|---|---|
| On‑Demand | $X (from step 1) |
N/A | Highest |
| Reserved Instance | $Y (up‑front + any monthly) |
Y / on‑demand‑rate |
Low – fixed family/size |
| Savings Plan | $Z (projected) |
Z / on‑demand‑rate |
High – applies across families |
If Y or Z is lower than $X, that option saves money.
Decision rules
* Choose RIs when you have a stable, homogeneous workload (e.g., a fleet of c5.large web servers) and you can lock to a specific AZ.
* Choose Compute Savings Plans when you have a mix of instance families, use Fargate or Lambda, or expect to shift workloads between sizes.
* Stay On‑Demand for short‑lived spikes, experimental workloads, or when you cannot predict usage for a year.
Step 5: Implement the Chosen Option
- Purchase via the console or CLI:
```bash
# Example: 1‑yr No Up‑Front m5.large RI
aws ec2 purchase-reserved-instances-offering \
--instance-count 2 \
--reserved-instances-offering-id
# Example: 1‑yr Compute Savings Plan
aws savingsplans create-savings-plan \
--savings-plan-type ComputeSavingsPlans \
--commitment "0.12" \
--term "1-year" \
--payment-option NoUpfront
``
2. Tag the purchased resources withCostCenterorEnvironment` tags so you can track usage against the commitment.
3. Set up Cost Explorer alerts:
* Alert when On‑Demand spend exceeds 10 % of the committed amount.
* Alert when RI utilization falls below 80 % (indicating over‑provisioning).
4. Review the usage monthly. If utilization drifts, consider modifying a Convertible RI or exchanging a Savings Plan commitment via the AWS Savings Plans Marketplace.
Step 6: Automate Ongoing Optimization
Even after you lock in a discount, workloads evolve. To keep the savings optimal: * Run a weekly script that pulls the last 7 days of EC2 usage and compares it to the committed hours. * If utilization drops below a threshold, trigger a Slack notification with a link to the Cost Explorer recommendation page. * Use AWS Instance Scheduler to shut down non‑production instances during off‑hours, further reducing the hours you need to cover.
How CloudBudgetMaster Helps
CloudBudgetMaster continuously scans your AWS account, matches current EC2 usage against your Reserved Instances and Savings Plans, and surfaces the exact dollar impact of under‑utilized reservations. The platform alerts you the moment a more cost‑effective option becomes available, turning manual calculations into an automated, real‑time FinOps workflow.
CloudBudgetMaster