▸ Guides / Compute

What does a stopped EC2 instance cost?

Updated · Prices checked against AWS pricing · 5 min read

Stopping an EC2 instance stops the compute charge, so a stopped instance looks free. It isn't: its EBS volumes are billed for every provisioned gigabyte, and any Elastic IP attached to it keeps costing $0.005 an hour.

For one instance that is a few dollars a month. For instances stopped “for now” months ago, across several accounts, it is storage nobody is using. This guide covers what a stopped instance still costs and how to find the long-stopped ones.

[ What you still pay ]

AWS doesn't charge usage or data transfer for a stopped instance. Everything the instance keeps while stopped is still billed:

  • ▸Stops: the instance's compute charge, and its automatically assigned public IPv4 address, which is released when it stops.
  • ▸Keeps billing: every attached EBS volume, at its provisioned size, and every Elastic IP associated with it.
  • ▸Keeps billing too: a Reserved Instance or Savings Plan covering it, which is a commitment paid whether the instance runs or not.

A typical stopped instance with a 100 GB gp3 root volume and an Elastic IP, at US East (N. Virginia) prices:

Monthly cost of one stopped instance
Compute (any instance type)$0
100 GB gp3 volume$8.00
Elastic IP$3.65
Total per month$11.65
Total per year$139.80

Bigger data volumes, provisioned IOPS and several Elastic IPs scale that up quickly. When a stopped instance is started again, it is billed for at least one minute.

[ Why instances stay stopped ]

  • ▸It was stopped “for now” during a migration, and the migration finished somewhere else.
  • ▸A proof of concept or load test ended, and stopping felt safer than deleting.
  • ▸It is kept as a backup of a server someone configured by hand.
  • ▸Nothing warns you: a stopped instance raises no alarm, and its cost shows up as EBS storage, not as EC2.

[ Find them ]

This lists the stopped instances in the region your CLI is set to. For an instance a user stopped, the last column includes when, for example User initiated (2026-03-02 14:05:11 GMT):

$ aws ec2 describe-instances --filters Name=instance-state-name,Values=stopped --query "Reservations[].Instances[].[InstanceId,InstanceType,Tags[?Key=='Name']|[0].Value,StateTransitionReason]" --output table

The volumes still attached to those instances, with their sizes:

$ ids=$(aws ec2 describe-instances --filters Name=instance-state-name,Values=stopped --query "Reservations[].Instances[].InstanceId" --output text | tr "\t" ","); aws ec2 describe-volumes --filters Name=attachment.instance-id,Values="$ids" --query "Volumes[].[Attachments[0].InstanceId,VolumeId,Size,VolumeType]" --output table

And the Elastic IPs associated with them, which AWS counts as idle while the instance is stopped:

$ ids=$(aws ec2 describe-instances --filters Name=instance-state-name,Values=stopped --query "Reservations[].Instances[].InstanceId" --output text | tr "\t" ","); aws ec2 describe-addresses --filters Name=instance-id,Values="$ids" --query "Addresses[].[InstanceId,PublicIp,AllocationId]" --output table

Instances are regional. This lists stopped instances in every region enabled for the account. In the console, EC2 Global View shows running and stopped instances across all regions on one page:

$ for region in $(aws ec2 describe-regions --query "Regions[].RegionName" --output text); do aws ec2 describe-instances --region "$region" --filters Name=instance-state-name,Values=stopped --query "Reservations[].Instances[].[InstanceId,InstanceType,StateTransitionReason]" --output text | sed "s/^/$region /"; done

[ Clean up ]

If nobody needs the instance, terminate it. If you might want it back, create an AMI first: its snapshots are billed only on the data they store, at $0.05 per GB-month, instead of every provisioned GB of the volumes. This creates an AMI, waits for it to be ready, then terminates the instance:

$ ami=$(aws ec2 create-image --instance-id i-0123456789abcdef0 --name "before-terminate-i-0123456789abcdef0" --query ImageId --output text) && aws ec2 wait image-available --image-ids "$ami" && aws ec2 terminate-instances --instance-ids i-0123456789abcdef0

Terminating can't be undone, and anything on instance store volumes is gone. Check the instance's tags and owner before you run it.

Terminating doesn't clean up everything. The root volume is deleted by default, but extra data volumes often stay behind as unattached volumes, and an Elastic IP stays allocated to the account. The EBS volumes guide and the Elastic IP guide cover finding and removing those.

[ Across many accounts ]

The commands above cover one account. Across ten or fifty, finding long-stopped instances means assuming a role in each, running the loop, and then matching each instance to the volumes and addresses it still holds.

Resource Atlas does that in one scan. It runs inside an AWS account you own, reads every connected account through a read-only role, and lists their EC2 instances in one table with state, type and attached storage, and the stopped ones counted at the top. It covers the region you deploy it to in each account; for other regions, the loop above or EC2 Global View still does the job. Community is free for up to 2 AWS accounts.

[ See it in the demo ]

The live demo scans a sample estate of three AWS accounts. Its EC2 page lists 25 instances and counts the 8 that are stopped, including ml-feature-builder, poc-elasticsearch and jenkins-legacy. Their volumes hold 970 GB of gp3 between them, about $78 a month for machines that aren't running.

Questions

Do you pay for a stopped EC2 instance?

Not for the instance itself: AWS does not charge usage or data transfer for a stopped instance. You keep paying for its EBS volumes and for any Elastic IP addresses associated with it.

Does a stopped EC2 instance keep its public IP address?

Not an automatically assigned one: it is released when the instance stops, and the instance gets a new one when it starts. An Elastic IP stays associated with the stopped instance and is charged $0.005 an hour while it does.

Is it cheaper to stop or terminate an EC2 instance?

If you don't need the instance, terminating it is cheaper. Create an AMI first if you might want it back: the AMI's snapshots are billed only on the data they store, at $0.05 per GB-month in US East (N. Virginia), instead of every provisioned GB of the volumes.

How can I tell how long an EC2 instance has been stopped?

For an instance a user stopped, the StateTransitionReason field in aws ec2 describe-instances includes the date and time of the stop. CloudTrail also records the StopInstances call.

Do Reserved Instances and Savings Plans still charge while an instance is stopped?

Yes. They are commitments billed for their term whether or not the instances they cover are running.