Skip to main content

EC2 Cost Optimization

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.

  1. The EC2 bill is broken down by family, purchase option, and owner.
  2. Rightsizing comes first, from Compute Optimizer data.
  3. Graviton, Spot, and gp3 cut the unit rate.
  4. Savings Plans or RIs cover the steady base that is left.
  5. Commitments wait until rightsizing has settled.
  6. The result is a lower run rate you can attribute.

Last updated:

Built forAWS Solutions for DevOps & Platform EngineersFor CTOs
Industries servedSaaSStartups
Ask AI:ChatGPTClaudePerplexityGemini

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 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 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 covers the method in detail, and the 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.

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 and the 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, 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 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:

CommitmentDiscount vs On-DemandFlexibilityBest fit
Compute Savings PlansUp to 66%Any family, size, Region, OS; also Fargate and LambdaSpend that will move, including Graviton migrations in progress
EC2 Instance Savings PlansUp to 72%Any size and OS within one family in one RegionStable families you will not migrate
Standard Reserved InstancesUp to 72%Fixed family; Regional RIs allow size flexibilityExisting 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 shows how coverage trades against utilization risk. The RI vs Savings Plans decision guide walks through the trade-offs, and the 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 and AWS 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: 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, and for an ongoing operating model, 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.

Calculators

Guides

Key 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 Choose 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.

Step-by-Step Guides

Implementation guides for this service from our team of AWS experts.

AWS Rightsizing with Compute Optimizer: 32-Day Lookback, Performance Risk, and the Order of Operations (2026)

Compute Optimizer added 32-day lookback for cyclic workloads in 2025, which matters for monthly batch jobs that looked oversized on 14-day windows. In a June 2026 audit of a $48k/mo account, rightsizing recommendations alone modeled $11k/mo savings at low performance risk.

Read guide

AWS Graviton: The Complete Cost Optimization Guide for Production Workloads

AWS Graviton processors deliver 20-40% cost savings and better performance-per-watt. Covers the migration path, performance benchmarks, and production deployment patterns.

Read guide

EC2 Spot Instance Selection: A Data-Driven Approach to 60–90% Cost Reduction

Cheapest Spot pool is often the unstable one. July 2026: price-capacity-optimized + attribute-based selection, stability scoring, and interruption handling, before you chase $/hr.

Read guide

Reserved Instances vs Savings Plans on AWS (2026): The Three-Way Choice, the 22-Month Break-Even, and When to Skip Commitment Entirely

Most "RI vs Savings Plan" content treats them as peers. In mid-2026 they are not. A 3-year All-Upfront Compute Savings Plan saves a composite ~$60k/mo SaaS roughly $864k over 3 years vs a 1-year No-Upfront plan, but breaks even at ~22 months and locks instance-family flexibility. Buy the wrong commitment and a Graviton migration strands the discount. This post gives the decision tree we use.

Read guide

Amazon EC2 On-Demand Pricing: Instance Families, Regional Multipliers, and the Graviton Crossover (2026)

EC2 On-Demand is a matrix of family, size, OS, tenancy, and region. In us-east-1 (June 2026) a m7g.large Linux runs $0.0816/hr vs a g5.xlarge GPU at $1.006/hr. Graviton5 M9g/C9g now GA for new fleets.

Read guide

From Our Blog

In-depth guides and best practices from our certified AWS architects.

Frequently Asked Questions

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.

Source: How are Amazon EC2 instance-hours billed?

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.

Source: Compute Savings Plans and Reserved Instances

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.

Source: Capacity-optimized allocation strategy for Spot Instances

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.

Source: Migrate Amazon EBS volumes from gp2 to gp3

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.

Source: EC2 instance metrics analyzed by Compute Optimizer

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.

Find Out What Your EC2 Fleet Should Cost

Share a Cost Explorer export or read-only access and we will map rightsizing, Graviton, Spot, and commitment opportunities with dollar estimates.