Cost is a lagging indicator of architecture. When a line item grows faster than usage, it is telling you something structural - usually that something is being done in the wrong place.
Data transfer is the quiet one
Compute is visible and easy to reason about. Bandwidth between zones, out to the internet, and through NAT is not, and it was a bigger share of our bill than we expected.
Storage grows and never shrinks
Nothing deletes itself. Logs, old builds, orphaned uploads, database snapshots from a migration two years ago. A lifecycle policy is ten minutes of work and permanent savings.
Idle is not free
- Environments nobody uses at the weekend
- Over-provisioned instances sized for a launch that already happened
- Load balancers in front of services with no traffic
Tag everything, from day one
An untagged bill is a bill you cannot act on. Being able to answer 'what does this product cost to run' changes the conversation from cutting costs to making decisions.