Cost Traps

Cost Traps: Idle Elastic IPs, Orphaned Volumes, Egress and NAT Gateways

Here is one real month (August 2026) of a single t2.micro web server in Singapore under a three-year Compute Savings Plan of $0.01 an hour, read with the read-only Cost Explorer API:

Last month's EC2-related charges, by usage typeShell
aws ce get-cost-and-usage --time-period Start=2026-08-01,End=2026-09-01 \
  --granularity MONTHLY --metrics UnblendedCost UsageQuantity \
  --group-by Type=DIMENSION,Key=USAGE_TYPE --output text --query 'ResultsByTime[0].Groups[?
    contains(Keys[0], `BoxUsage`) || contains(Keys[0], `EBS`) || contains(Keys[0], `IPv4`)
    || contains(Keys[0], `SP:`)].[Keys[0], Metrics.UsageQuantity.Amount,
    Metrics.UnblendedCost.Amount]' | column -t
Output
APS1-BoxUsage:t2.micro        744           0
APS1-EBS:SnapshotUsage        8.0361328117  0.4018066395
APS1-EBS:VolumeUsage.gp2      8.0000000208  0.9600000144
APS1-PublicIPv4:InUseAddress  744           3.72
ComputeSP:3yrNoUpfront        0             7.44

The plan paid for the 744 instance hours ($7.44); the public IPv4 address added $3.72, half as much as the compute. Since 1 February 2024 every public IPv4 address costs $0.005 an hour ($3.65 a month), attached or idle, so an Elastic IP left after termination keeps billing.

At us-east-1 list prices, a gp3 volume that outlives its instance costs $0.08 per GB-month and snapshots $0.05; data transfer out costs $0.09/GB after the first 100 GB a month (inbound is free); and a NAT gateway costs $0.045 an hour plus $0.045/GB, $32.85 a month before any traffic, more than two t4g.small instances. A lone web server in a public subnet needs no NAT gateway.

Monthly, in each Region you use, count idle addresses (aws ec2 describe-addresses --query 'length(Addresses[?AssociationId==null])'), unattached volumes (describe-volumes --filters Name=status,Values=available) and snapshots (describe-snapshots --owner-ids self); here only two snapshots, the $0.40 line, remained. Add an AWS 24 Budgets alert too.