---
title: Amazon EC2 Cost Optimization
description: Amazon EC2 cost optimization: Savings Plans and RI strategy, Spot fleets, Graviton migration, Compute Optimizer rightsizing, and gp2 to gp3 EBS migration.
url: https://www.joinhorizon.co/services/aws-ec2-cost-optimization/
category: cloud
updated: 2026-10-27
---

# Amazon EC2 Cost Optimization

> Most EC2 bills carry three kinds of waste: oversized instances, On-Demand rates on steady workloads, and commitments bought before rightsizing. We fix them in that order, so you never lock in a discount on capacity you do not need.

## Why EC2 Bills Stay High

EC2 is usually the largest line on an AWS bill, and the waste in it has a predictable shape. Instances are sized for a launch-day guess and never revisited. Steady workloads stay on On-Demand rates for years. Commitments get bought against the oversized fleet, which turns a temporary problem into a three-year contract. And EBS volumes created before gp3 existed are still paying gp2 rates.

We work the problem in a fixed order because each step changes the baseline for the next one.

## Who This Is For

This work is typically worth it when:

- EC2 and EBS together make up a large share of your AWS bill, and the fleet has not been resized since launch.
- Nearly everything runs On-Demand, or commitments were bought years ago and nobody has checked coverage and utilization since.
- You are about to renew or buy a Savings Plan and want it sized against a rightsized baseline.
- You run non-production environments around the clock.
- Your team knows the bill is high but has no time to work through the Cost and Usage Report.

It is a poor fit when your EC2 footprint is small enough that Compute Optimizer and a calculator will cover it, or when a migration is already about to replace the fleet. In both cases we will say so before you spend anything.

## Step 1: Measure and Rightsize

Rightsizing starts with [AWS Compute Optimizer](https://aws.amazon.com/compute-optimizer/) recommendations, but we do not apply them blind. Compute Optimizer needs the CloudWatch agent to see memory, and an instance that looks idle on CPU can be memory-bound. For each candidate we check:

- **p99 CPU and memory**, not averages, over at least 14 days
- **Burst patterns** such as nightly batch or month-end jobs that a short window misses
- **Instance generation**, since moving from m5 to m7g or m8g often beats a size change

Memory is the usual trap. EC2 does not publish memory utilization by default, and [Compute Optimizer only analyzes it](https://docs.aws.amazon.com/compute-optimizer/latest/ug/ec2-metrics-analyzed.html) when the CloudWatch agent (or a supported third-party tool) provides it. We confirm the agent is running on every candidate before trusting a recommendation. Databases, caches, and JVM services are where this matters most.

The [rightsizing playbook](https://www.joinhorizon.co/blog/aws-rightsizing-compute-optimizer-playbook-2026/) covers the method in detail, and the [rightsizing savings calculator](https://www.joinhorizon.co/tools/aws-rightsizing-savings-calculator/) gives a first estimate from your instance list.

## Step 2: Change the Architecture Where It Pays

**Graviton.** Arm64 instances list below their x86 equivalents: in our pricing data (us-east-1 list price, 2026-10-17) an m7g.large is $0.0816/hr against $0.1008/hr for an m7i.large. We rebuild container images as multi-arch, benchmark each service on Graviton, and move the ones that hold their throughput. See the [Graviton cost optimization guide](https://www.joinhorizon.co/blog/aws-graviton-cost-optimization-guide/).

Before a Graviton move, we assess each service for compatibility: whether the language runtime and base images have arm64 builds, whether native libraries and agents (APM, security, backup) ship arm64 packages, and whether the CI pipeline can build and test multi-arch images. Services that clear that check get a benchmark on your own load, and we compare throughput per dollar, not just hourly price.

**Spot.** For stateless and fault-tolerant capacity, Spot runs at up to 90% off On-Demand. Safe Spot use needs diversified instance types, the price-capacity-optimized allocation strategy, Capacity Rebalancing, and a shutdown handler for the two-minute notice. On EKS, Karpenter handles most of this. The [Spot selection guide](https://www.joinhorizon.co/blog/ec2-spot-instance-intelligent-selection-cost-optimization/) and the [Spot instance advisor](https://www.joinhorizon.co/tools/aws-spot-instance-advisor/) help pick pools.

**EBS gp2 to gp3.** gp3 is 20% cheaper per GiB-month than gp2. It includes a baseline of [3,000 IOPS and 125 MiB/s regardless of volume size](https://docs.aws.amazon.com/ebs/latest/userguide/general-purpose.html), and you can provision IOPS and throughput independently of capacity. gp2 gives 3 IOPS per GiB, so a volume over 1 TiB can have a higher baseline than gp3's default. We convert in place and set IOPS and throughput explicitly for any volume whose gp2 baseline was above 3,000 IOPS. See the [orphaned volumes and snapshots guide](https://www.joinhorizon.co/blog/amazon-ebs-pricing-orphaned-volumes-snapshots/) for the cleanup side.

**Idle, orphaned, and non-production resources.** Unattached EBS volumes, old snapshots, unassociated Elastic IPs, and idle load balancers cost money and carry no risk to remove once an owner confirms them. Dev, test, and staging fleets that run 24 hours a day can usually be scheduled to stop outside working hours. That cuts compute hours directly, and it should happen before commitments are sized so you do not commit to capacity you plan to switch off.

## Step 3: Commit Against the Smaller Baseline

Only after the fleet is rightsized and the architecture changes are in flight do we buy commitments:

| Commitment | Discount vs On-Demand | Flexibility | Best fit |
| --- | --- | --- | --- |
| Compute Savings Plans | Up to 66% | Any family, size, Region, OS; also Fargate and Lambda | Spend that will move, including Graviton migrations in progress |
| EC2 Instance Savings Plans | Up to 72% | Any size and OS within one family in one Region | Stable families you will not migrate |
| Standard Reserved Instances | Up to 72% | Fixed family; Regional RIs allow size flexibility | Existing RI processes, or capacity reservations in a zone |

Discount figures are AWS's published maximums. Your actual rate depends on the instance family, Region, term, and payment option. Savings Plans do not reserve capacity; if you need guaranteed capacity in a zone, that takes a zonal RI or an On-Demand Capacity Reservation. We usually cover a conservative floor first, because an over-sized commitment is paid for whether or not you use it. The [commitment level optimizer](https://www.joinhorizon.co/tools/aws-commitment-level-optimizer/) shows how coverage trades against utilization risk. The [RI vs Savings Plans decision guide](https://www.joinhorizon.co/blog/aws-reserved-instances-vs-savings-plans-decision-guide-2026/) walks through the trade-offs, and the [Savings Plans calculator](https://www.joinhorizon.co/tools/aws-savings-plans-calculator/) models coverage at your spend level.

## Step 4: Keep the Savings

Savings decay without guardrails. We set up AWS Budgets, Cost Anomaly Detection, and alerts on Savings Plans coverage and utilization, and hand over a monthly review checklist. For a full FinOps operating model beyond EC2, see [FinOps consulting](https://www.joinhorizon.co/services/finops-consulting/) and [AWS cost optimization services](https://www.joinhorizon.co/services/aws-cloud-cost-optimization-services/).

## What We Cannot Promise

Savings depend on the workload, how steady its utilization is, and the availability you need. We do not promise a percentage. Rightsizing carries performance risk, which is why we check p99 and memory first. Spot adds interruptions, so it only fits workloads that tolerate them. Commitments save money only if the covered usage keeps running for the full term. Graviton needs working arm64 builds and a benchmark before it pays off.

The only figures we cite are from our published [SaaS cost optimization case study](https://www.joinhorizon.co/case-study/saas-cost-optimization-30-percent-reduction/): a total AWS bill moving from $85k to $58k a month ($27k a month, or $324k a year, a 32% reduction) with p99 latency unchanged. It is a composite based on anonymized client work, it covered more than EC2 (database rightsizing and NAT Gateway data transfer included), and Reserved Instance coverage was one of three tracks. Treat it as an example of the process, not a benchmark for your fleet.

## Deliverables and Engagement Boundaries

**You get:**

- An assessment report covering fleet, commitment coverage and utilization, EBS, and idle resources.
- A prioritized backlog, with an estimated monthly dollar value per item calculated from your own Cost and Usage Report data, plus the risk and effort of each.
- Implementation of the items you approve, either as pull requests and runbooks for your team or hands-on changes under your change control.
- Governance: budgets, Cost Anomaly Detection, coverage and utilization alerts, and a monthly review checklist.

**Boundaries:**

- We do not buy a commitment without your written approval of the term, amount, and payment option.
- We do not resize or migrate a production workload without a rollback plan and your sign-off.
- Application code changes for arm64 compatibility are scoped separately.
- This page covers EC2 and EBS. For the whole bill, see [AWS cost optimization services](https://www.joinhorizon.co/services/aws-cloud-cost-optimization-services/), and for an ongoing operating model, [FinOps consulting](https://www.joinhorizon.co/services/finops-consulting/).

## Tools and Guides

Price it yourself first, then talk to us. If you want a quick look at the whole account, start with the free [AWS cost audit](https://www.joinhorizon.co/aws-cost-audit/).

**Calculators**

- [EC2 pricing calculator](https://www.joinhorizon.co/tools/aws-ec2-pricing-calculator/)
- [Rightsizing savings calculator](https://www.joinhorizon.co/tools/aws-rightsizing-savings-calculator/)
- [Graviton savings calculator](https://www.joinhorizon.co/tools/aws-graviton-savings-calculator/)
- [Savings Plans calculator](https://www.joinhorizon.co/tools/aws-savings-plans-calculator/)
- [Reserved Instance calculator](https://www.joinhorizon.co/tools/aws-reserved-instance-calculator/)
- [Commitment level optimizer](https://www.joinhorizon.co/tools/aws-commitment-level-optimizer/)
- [Spot instance advisor](https://www.joinhorizon.co/tools/aws-spot-instance-advisor/)
- [EBS pricing calculator](https://www.joinhorizon.co/tools/aws-ebs-pricing-calculator/)

**Guides**

- [Rightsizing with Compute Optimizer](https://www.joinhorizon.co/blog/aws-rightsizing-compute-optimizer-playbook-2026/)
- [Graviton cost optimization guide](https://www.joinhorizon.co/blog/aws-graviton-cost-optimization-guide/)
- [Reserved Instances vs Savings Plans](https://www.joinhorizon.co/blog/aws-reserved-instances-vs-savings-plans-decision-guide-2026/)
- [Orphaned EBS volumes and snapshots](https://www.joinhorizon.co/blog/amazon-ebs-pricing-orphaned-volumes-snapshots/)
- [Spot instance selection](https://www.joinhorizon.co/blog/ec2-spot-instance-intelligent-selection-cost-optimization/)
- [EC2 On-Demand pricing breakdown](https://www.joinhorizon.co/blog/amazon-ec2-on-demand-pricing-instance-families-2026/)

## Features

### Compute Optimizer Rightsizing
Instance-level recommendations from AWS Compute Optimizer, checked against CloudWatch memory and p99 CPU before anything is resized, so a cheaper instance does not become a latency incident.

### Savings Plans and RI Portfolio
A commitment mix sized to your post-rightsizing baseline: Compute Savings Plans where workloads move between families or to Fargate and Lambda, EC2 Instance Savings Plans or Standard RIs where a family is stable.

### Spot Fleets
Spot for stateless, fault-tolerant capacity with diversified instance pools, price-capacity-optimized allocation, Capacity Rebalancing, and two-minute interruption handling built into the deploy path.

### Graviton Migration
Arm64 builds, multi-arch container images, and a per-service benchmark so the Graviton move is measured on your workload, not on a vendor slide.

### EBS gp2 to gp3 Migration
In-place gp2 to gp3 volume modification with explicit IOPS and throughput settings, so volumes that relied on gp2 burst behavior keep their performance.

### Guardrails That Keep Savings
Budgets, Cost Anomaly Detection, and Savings Plans coverage and utilization alerts, so the bill does not drift back after the engagement ends.

## Why FactualMinds

### Rightsize Before You Commit
Commitments are bought against the fleet after rightsizing, not before. Reserving an oversized instance locks in waste for one to three years.

### Published Results
Compute is usually the largest line on an AWS bill. Our published SaaS case study shows a total bill moving from $85k to $58k a month (32%), with Reserved Instance coverage as the fastest single step. Your result depends on your fleet.

### AWS Select Tier Services Partner
AWS Select Tier Services Partner with 50+ AWS certifications on staff.

### Free Tools You Can Check Us With
Our EC2 pricing, Savings Plans, rightsizing, and Spot calculators are public. Run the numbers yourself before you talk to us.

## FAQ

### How does EC2 billing work? Is there a minimum billing time?
EC2 bills only while an instance is running. Amazon Linux, Windows, RHEL, Ubuntu, and Ubuntu Pro instances are billed per second with a 60-second minimum each time an instance starts. SUSE Linux Enterprise Server instances bill each partial hour as a full hour. Per-second billing applies across On-Demand, Spot, and Reserved purchase options.

### Should we buy Compute Savings Plans, EC2 Instance Savings Plans, or Reserved Instances?
Compute Savings Plans save up to 66% off On-Demand and apply across instance families, sizes, Regions, operating systems, Fargate, and Lambda. EC2 Instance Savings Plans and Standard RIs save up to 72% but are tied to one instance family in one Region. Use Compute Savings Plans for the share of spend you expect to move (for example a Graviton migration in progress) and Instance Savings Plans for families that will not change. Savings Plans do not reserve capacity; only zonal RIs or On-Demand Capacity Reservations do, so add one of those when you need guaranteed capacity.

### Which workloads are safe to run on Spot?
Spot Instances run at up to 90% off On-Demand, but EC2 can reclaim them with a two-minute notice. They suit stateless web tiers behind a load balancer, batch and CI jobs, containers on EKS or ECS with multiple instance types allowed, and big-data workers that checkpoint. Keep databases, single-instance stateful services, and anything without a graceful shutdown path on On-Demand or committed capacity.

### How much does a Graviton migration save?
On list price alone, an m7g.large (Graviton3) is $0.0816/hr (us-east-1 list price, 2026-10-17) against $0.1008/hr for an m7i.large with the same 2 vCPU and 8 GiB, about 19% lower per hour. Whether it saves more than that depends on your workload throughput per instance, which is why we benchmark each service before migrating it. Interpreted and JVM workloads usually move with a rebuild; native dependencies without arm64 builds are the usual blocker.

### Is gp2 to gp3 migration risky?
gp3 costs 20% less per GiB-month than gp2 and includes 3,000 IOPS and 125 MiB/s regardless of size. The change is an in-place volume modification with no detach. The risk is performance, not data: a large gp2 volume earns 3 IOPS per GiB, so a 2 TiB gp2 volume has 6,000 baseline IOPS and needs those IOPS provisioned explicitly on gp3 to stay equivalent.

### What could go wrong in an EC2 cost project?
The common failures are buying three-year commitments before rightsizing, resizing on average CPU while ignoring memory pressure and p99 latency, moving stateful services to Spot, and converting gp2 volumes without matching their burst IOPS. We sequence the work to avoid each one: measure, rightsize, migrate architecture, then commit.

### Is my EC2 spend big enough for an engagement to pay off?
There is no fixed cutoff. It is typically worth it when EC2 and EBS are a large share of your bill, when most instances have never been resized since launch, or when you are about to renew or buy a commitment. For smaller fleets, the free calculators and the Compute Optimizer console often cover most of it. We say so on the first call if a full engagement would not pay for itself.

### Why does Compute Optimizer need the CloudWatch agent?
EC2 does not publish memory utilization by default. Compute Optimizer analyzes memory only if the CloudWatch agent (or a supported third-party tool) publishes it, and it can take up to a day to appear in recommendations. Without it, a memory-bound instance can look oversized on CPU and get a recommendation that causes swapping or out-of-memory kills. Agent metrics are billed as custom CloudWatch metrics.

### Do you guarantee a savings percentage?
No. Savings depend on how oversized the fleet is, how steady the workloads are, and how much availability risk you will accept. Our published case study reports a 32% reduction on a total AWS bill, but that is one engagement and not a forecast. We estimate dollars per item from your own Cost and Usage Report data and let you decide which items to take.

### What do you need from us to start?
A Cost Explorer or Cost and Usage Report export and read-only access to Compute Optimizer, CloudWatch, and EC2 metadata. We do not need access to application data. Changes are made through your pipelines or by your team, or by us under change control you approve.

---

*Source: https://www.joinhorizon.co/services/aws-ec2-cost-optimization/*
