AWS cost · EC2
Older EC2 generations cost more for the same specs
An instance type is chosen once, in a hurry, and then never looked at again. AWS keeps launching hardware that does the same work for less money, and it does not reprice what you are already running. So the box keeps costing what it cost on day one, while the catalogue lists the same specifications at a lower price.
An m4.xlarge in eu-central-1 is $175.20/month. An m6a.xlarge - the same 4 vCPU and 16 GiB - is $151.11. That is $24.09/month for a stop, a type change and a start. Measured against the live price list, not estimated.
Two swaps, priced today
| What | Cost | Note |
|---|---|---|
| m4.xlarge - 4 vCPU, 16 GiB | ~$175.20/month | $0.24/hour, eu-central-1 |
| m6a.xlarge - 4 vCPU, 16 GiB | ~$151.11/month | $0.207/hour - the same machine, 14% less |
| t2.micro - 1 vCPU, 1 GiB | ~$9.78/month | $0.0134/hour, eu-central-1 |
| t3a.micro - 2 vCPU, 1 GiB | ~$7.88/month | more CPU, 19% less money |
The t3a.micro is the more interesting row: cheaper and twice the vCPUs. The price falls while the machine gets better.
The family map does not work
The obvious way to hunt for this is a mental map: m4 becomes m5, t2 becomes t3, and so on. AWS contradicts that map at both ends. Ask the API which types are current generation and it says m5.xlarge is not, while t2.micro is.
So the useful question is not whether your family is old. It is whether AWS sells the same machine cheaper today - same memory, at least the vCPUs, lower price. That needs no lineage map and cannot go out of date.
One warning if you script it: the price list has its own attribute called current generation, and it answers Yes for m4.xlarge. The EC2 catalogue is the source that tells the truth.
How to check your own instances
Take the memory figure of what you are running, then ask the catalogue what else it sells at that size:
# what is running, and on what
aws ec2 describe-instances \
--query 'Reservations[].Instances[?State.Name==`running`].{Id:InstanceId,Type:InstanceType,Az:Placement.AvailabilityZone}' \
--output table
# current-generation types with the same 16 GiB and at least 4 vCPUs
aws ec2 describe-instance-types \
--filters Name=current-generation,Values=true Name=memory-info.size-in-mib,Values=16384 \
--query 'InstanceTypes[?VCpuInfo.DefaultVCpus>=`4`].{Type:InstanceType,VCpus:VCpuInfo.DefaultVCpus,Ena:NetworkInfo.EnaSupport}' \
--output tableMatch memory exactly rather than taking anything larger - loosening it turns a shortlist into hundreds. The cheapest type with more memory than you asked for is a different machine, not a better deal.
What the swap costs
It is a stop and a start, so there is downtime, anything on instance store is lost, and an auto-assigned public IP is replaced. That is the predictable part.
The unpredictable parts are worth checking first. An older instance may report ENA as unsupported - t2.micro does - and every current generation is Nitro, which needs the ENA and NVMe drivers present before the instance will start on the new type. A t-family target defaults to unlimited credit mode and bills surplus credits. And if the old family is covered by a Reserved Instance or an EC2 Instance Savings Plan, the commitment stays behind on a family you no longer run. That can turn a saving into a loss until it expires.
# MUTATING - the instance must be stopped first
aws ec2 stop-instances --instance-ids i-0123456789abcdef0
aws ec2 modify-instance-attribute \
--instance-id i-0123456789abcdef0 \
--instance-type Value=m6a.xlarge
aws ec2 start-instances --instance-ids i-0123456789abcdef0Two questions to ask in the same sitting: whether the instance should be smaller rather than newer, and whether the workload could move to Graviton, which saves more but is a port rather than a swap.
Want to know which of your instances AWS sells cheaper today? Connect your account read-only and see what it is wasting, in real dollars.
The role can only read - Get, Describe, List, nothing else. Read the exact permissions before you deploy it, and delete the stack whenever you want.
Frequently asked questions
Do older EC2 instance types cost more than newer ones?+
Usually, for the same specifications. In eu-central-1 an m4.xlarge is $0.24/hour and an m6a.xlarge with the same 4 vCPU and 16 GiB is $0.207 - about $24.09/month cheaper for identical capacity. AWS keeps selling old types at old prices rather than repricing them down.
How do I know which instance types are current generation?+
Ask the EC2 API, not a family naming convention. DescribeInstanceTypes returns a CurrentGeneration flag per type, and the answers surprise people: m4.xlarge is not current generation, while t2.micro is. The price list has a similarly named attribute that disagrees with the API, so use the EC2 catalogue.
What does switching instance type actually involve?+
Stopping the instance, changing the type, and starting it again. That means downtime measured in minutes, anything on instance store is lost, and an auto-assigned public IP changes. Elastic IPs and EBS volumes survive.
Is moving from Intel to AMD safe?+
For nearly all workloads, yes - an a-suffix type such as m6a or t3a is the same x86-64 architecture, just a different chip. It is not the same as moving to Graviton, which is a different architecture and needs your software rebuilt for ARM.
Why would a cheaper instance type not be worth taking?+
Three reasons come up repeatedly. An older instance without ENA support needs driver work before it can move to a Nitro type at all. A t-family target bills surplus CPU credits by default, so a burstable swap can cost more than it saves under sustained load. And a Reserved Instance or EC2 Instance Savings Plan locked to the old family gets stranded - you keep paying for the commitment on a family you no longer run.
What about flex instance types?+
Types such as m7i-flex are priced below their full-power sibling because they sustain a baseline rather than full CPU. AWS publishes no attribute that separates them, so the name is the only signal. Treat a flex type as a different product, not a free discount.
Related cost breakdowns
Why EKS is expensive: the $73/month control plane
Every EKS cluster bills $0.10/hour - about $73/month - for the control plane before a single node runs, and $0.60/hour once it falls out of standard support. Idle and forgotten clusters are pure waste.
Why your stopped EC2 instance is still being charged
A stopped EC2 instance keeps billing for its attached EBS disk and any Elastic IP. One 8 GB volume quietly cost me ~$70 over six years. Here is what still charges when an instance is off.
Spot instances: what is safe to run on them, and what is not
Spot instances are up to 90% cheaper than on-demand - I moved almost everything to spot. The catch is a 2-minute interruption notice. Here is what is safe to run on spot and what is not.
Graviton (ARM) is ~20% cheaper than x86 for the same work
AWS Graviton instances cost about 20% less than comparable x86 at equal or better performance, and arm64 Lambda is a one-dropdown switch. Here is how to find migration candidates.