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:
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 -tAPS1-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.