The surprise is rarely compute, which is the only line most people estimate.
Typical mid-size workload, monthly
Compute, on-demand $18,000 the line everyone plans for
Managed database $6,200 often oversized "for safety"
Data transfer out $4,800 egress, per gigabyte
Cross-AZ traffic $2,100 chatty services in different zones
Storage, snapshots $1,900 nobody deletes old snapshots
Load balancers, NAT gateways $1,400 per-hour plus per-gigabyte
Logs and metrics ingestion $3,600 verbose logging at debug level
Idle non-production $2,700 staging running at 3am
Egress is the one that changes designs. Inbound data is generally free and
outbound is charged per gigabyte, so a service that proxies large payloads
through itself pays for every byte twice. Cross-AZ traffic is also charged in
both directions, which is why two chatty services scattered across zones can cost
more in transfer than in compute.
Log ingestion is the fastest-growing surprise, because the volume scales with
traffic and with how much someone logged at debug level, and there is no natural
brake until an invoice arrives.
The cheapest three interventions are almost always the same. Turn non-production
off outside working hours, which is a scheduled job and roughly a two-thirds
saving on those environments. Set retention on logs and snapshots. And right-size
from actual utilisation rather than the number chosen at provisioning time, which
was picked under uncertainty and never revisited.