Invisible on the Console, Only on the Invoice — AWS's Hidden Costs

Invisible on the Console, Only on the Invoice — AWS's Hidden Costs

In the bill-shock article I wrote that cloud cost comes in two flavors: the sudden kind, like a hack, and the quiet kind that leaks every month. This is the quiet kind. A hack stands out because it costs ₩100M a day. Invisible costs leak for years. The architecture works, the graphs look calm, and the invoice just gets a little heavier each month.

This article covers six. Fix complexity and payback depend on traffic volume, AZ count, and the change procedure.

1. Missing VPC endpoints — S3/ECR traffic leaks through NAT

The most common and most invisible case. If a private subnet's default route points to a NAT Gateway and it has no S3 or ECR endpoints, traffic to those services also traverses the NAT gateway. NAT charges an hourly fee plus a per-GB data processing charge on everything that passes through — in Seoul, $0.059 per hour and $0.059 per GB.1 The catch: much of this traffic is headed inside AWS, not to the internet.

VPC endpoints send that traffic straight to the AWS backbone, no NAT. There are two kinds, and they behave differently.

S3 has a free gateway endpoint. You add one route to the route table; the cost is zero.2 It bypasses NAT and the data processing charge disappears. The reason a free thing goes unbuilt is simple: the console VPC wizard doesn't attach it automatically. So log archiving, backups, and data pipelines — anything chatty with S3 — get billed wholesale through NAT.

ECR takes a little more. EKS/ECS nodes download image layers on every pull, and autoscaling or CI deploys repeat that traffic. Running ECR privately needs three endpoints:3

  • ecr.api — auth and describe APIs (interface, paid)
  • ecr.dkr — Docker registry API, push/pull (interface, paid)
  • s3required because the layers themselves live in S3 (gateway, free)

Image layers come from S3, so in workloads where image pulls dominate traffic, the free S3 gateway endpoint can remove a large share of ECR-related NAT bytes. The two interface endpoints put authentication and metadata traffic on a separate path.

CI image builds and ECS pull frequency determine ECR traffic. Our GitHub Actions and Blacksmith comparison with measured ECR image sizes examines the cache boundary and four compressed final images.

Moving 1 TB (1,000 GB) of S3 traffic off a Seoul-region NAT gateway and onto a gateway endpoint avoids about $59 in NAT processing charges. NAT hourly fees and cross-AZ transfer are separate; actual savings depend on the route and AZ topology.12

Traffic from a private subnet to S3 and ECR routing through a paid NAT Gateway versus bypassing it through a free S3 gateway endpoint and ECR interface endpoints
The default path runs through the NAT Gateway, billed per GB. Gateway and interface endpoints divert the same traffic onto the AWS backbone.

S3 and DynamoDB gateway endpoints have no hourly or data-processing charge, so they are worth evaluating when private traffic reaches those services. Interface endpoints cost $0.013 per AZ-hour plus $0.010 per GB for the first PB.4 Against NAT processing alone, one endpoint in one AZ recovers its fixed cost at about 194 GB per month. ECR needs both ecr.api and ecr.dkr in every participating AZ, so calculate the full topology.

Working on something similar?Request a technical review

2. Cross-AZ data transfer — the charge that isn't on the diagram

For common paths between EC2 instances and NLBs or ENIs, 1 GB crossing an AZ boundary once incurs $0.010 on the sending side and $0.010 on the receiving side, or $0.020 total. A same-size 1 GB response crossing back adds another $0.020. RDS, ELB, and other services have pricing exceptions, so verify their pricing pages.5 It does not appear on an architecture diagram. Application servers spread across AZs talking constantly to a database, cache, or each other cross the boundary again and again; the traffic is normal, the charge accrues anyway. Keep data-intensive components in the same AZ, or route with AZ-awareness to cut boundary crossings.

3. Public IPv4, always billed — you pay for idle IPs too

Since 2024, AWS-provided public IPv4 addresses associated with VPC resources or idle in the account cost $0.005 per hour.6 It used to be only unattached Elastic IPs; now an address attached to a running instance is billed too. The usual leaks are unused EIPs and public IPs left on forgotten experiments. One address is about $3.60 a month — small alone, but dozens or hundreds left lying around is real fixed cost. Keep only what you need and move the rest behind private subnets and endpoints.

4. CloudWatch Logs kept forever — never deleted, so never expires

If a log group has no retention set, the default is "never expire."7 Debug and access logs pile up forever and the storage bill runs forever with them. You already paid to ingest them; now you pay every month to store logs you'll never read again. Set a retention period on every log group, and export to cheaper S3 tiers when long-term retention is genuinely required.

5. Orphaned storage — the things you thought you deleted

  • Orphaned EBS snapshots: the instance and volume are gone, but the separately managed snapshot remains and bills storage.8
  • Incomplete multipart uploads: parts from failed S3 uploads remain billable until the upload completes or is aborted. Clean them with a lifecycle rule.9
  • gp2 not moved to gp3: gp3 has a 20% lower base price per GiB than gp2 and lets you provision performance independently of capacity. Compare any additional IOPS and throughput charges before migrating.10

6. Non-prod running 24/7 — the nights and weekends nobody uses

Dev and staging environments run through nights and weekends. Running schedulable compute only for the 8 hours a day and 5 days a week it is needed can theoretically cut uptime by about 76%. Costs that remain while stopped, such as EBS and some managed databases, need a separate calculation.

How to find it

  • Cost Explorer, grouped by Usage Type. A large NatGateway-Bytes or intra-region transfer (DataTransfer-Regional-Bytes) is a signal to inspect network costs. EC2-Other mixes NAT, EBS, and other charges, so break it down again by Usage Type.
  • VPC Flow Logs to break down where NAT-bound traffic is headed. If the destinations cluster on S3, ECR, and other AWS services, those are your endpoint candidates.
  • Tagging discipline first. Without tags you can't attribute spend to a team or service.

Visibility comes first. The bill-shock article uses runtime metrics and cost controls for sudden abuse; structural waste likewise requires visibility into Usage Types and traffic paths.


Many invisible costs can be reduced through configuration changes, but payback must include traffic volume and change risk. Browse related diagnostics in Cloud / AWS in practice, or see our network and storage cost work at Cloud & Infrastructure.

References

Sources & notes10ExpandCollapse

Footnotes

  1. AWS Docs, Pricing for NAT gateways · Amazon VPC Pricing — Seoul region (ap-northeast-2) NAT Gateway: $0.059/hour, $0.059/GB processed (AWS Price List API, verified 2026-07). 2

  2. AWS Architecture Blog, Choosing Your VPC Endpoint Strategy for Amazon S3 — gateway endpoints free; interface endpoints billed per AZ-hour and per GB. 2

  3. AWS Docs, Amazon ECR interface VPC endpoints (AWS PrivateLink) — ECR needs the ecr.api and ecr.dkr interface endpoints plus an S3 gateway endpoint.

  4. Seoul-region interface (PrivateLink) endpoint: $0.013 per AZ-hour, $0.010 per GB (AWS Price List API, verified 2026-07). See AWS PrivateLink Pricing.

  5. AWS, Optimizing data transfer costs when using AWS Network Load Balancer · Amazon EC2 On-Demand Pricing — Data Transfer · Amazon RDS Pricing — charges on both sides of common EC2 and NLB cross-AZ paths, plus service-specific exceptions such as RDS.

  6. AWS, New — AWS Public IPv4 Address Charge — $0.005/hour per public IPv4 address since Feb 2024 (same in Seoul, Price List API verified).

  7. AWS Docs, Working with log groups — retention — log groups default to "Never expire" until a retention period is set.

  8. AWS Docs, Amazon EBS snapshots — snapshots are incremental backups managed separately from their source volumes.

  9. AWS Docs, Aborting incomplete multipart uploads — uploaded parts incur storage charges until completion or abort.

  10. AWS Docs, General Purpose SSD volumes — gp3 base storage pricing and independently provisioned IOPS and throughput.

Explore the delivery service behind this topic.

Cloud & Infrastructure

Put this work into practice.

An engineer reviews your environment and constraints first, then uses a 30-minute technical conversation when it helps define the execution scope.

Already trusted by teams across finance · healthcare · media · public
Request a technical review