Compute is visible; storage and network accumulate. Every month more objects, more snapshots, more logs and more traffic — and nobody deletes anything.
flowchart TB HOT["Hot storage: frequent access"] -->|"lifecycle after 30 days"| IA["Infrequent access tier"] IA -->|"after 90 days"| ARC["Archive tier"] ARC -->|"after retention"| DEL["Delete"] APP["App in private subnet"] -->|"NAT: per-GB processing"| NAT["NAT gateway"] APP -->|"Gateway endpoint: no NAT charge"| EP["VPC endpoint to S3"] %% step HOT: New data usually sits in the most expensive, fastest tier. %% step IA: Lifecycle rules move data that is rarely read to cheaper tiers automatically. %% step ARC: Archive tiers are very cheap to store but slow and costly to retrieve. %% step DEL: Data past its retention period should be deleted, by policy, not by memory. %% step NAT: Traffic to cloud services through a NAT gateway pays a per-GB processing charge. %% step EP: A gateway VPC endpoint sends S3 and DynamoDB traffic privately without that charge.
Storage levers
| Lever | Example |
|---|---|
| Storage classes and lifecycle | S3 Standard → Standard-IA → Glacier; Intelligent-Tiering when access is unknown |
| Disk type | EBS gp2 → gp3 is usually cheaper with the same or better baseline performance |
| Snapshots and backups | Retention policies in AWS Backup / Data Lifecycle Manager instead of manual snapshots |
| Logs | Shorter retention for debug logs, archive to object storage, sample noisy logs |
| Incomplete uploads and old versions | Lifecycle rules to abort multipart uploads and expire noncurrent versions |
Watch retrieval fees and minimum storage durations in infrequent and archive tiers: moving data that is read every day makes it more expensive.
Data transfer levers
| Cost | Lever |
|---|---|
| Internet egress | CDN (CloudFront, Azure Front Door, Cloud CDN) caches content closer to users |
| NAT gateway processing | Gateway endpoints for S3/DynamoDB, interface endpoints for busy services |
| Cross-AZ traffic | Keep chatty services in the same zone where resilience allows; topology-aware routing in Kubernetes |
| Cross-region replication | Replicate only what disaster recovery needs |
Use the usage type dimension (e.g. DataTransfer-Regional-Bytes, NatGateway-Bytes) to find these costs — they are often hidden in "EC2 - Other".
Traps: putting frequently read data into an archive tier; keeping every log forever "just in case"; and adding a NAT gateway per AZ for resilience without checking what traffic goes through it.