The AWS cost optimization checklist: 9 fixes that actually move the bill
Short version: most AWS waste is not a pricing negotiation, it is a pile of specific resources nobody turned off. This is the checklist we use: find the waste, rank it by dollars, fix the top items, and stop it from coming back. Each item below has a concrete number and a step-by-step guide.
How to approach it
AWS Cost Explorer tells you what you spent. It does not walk your account and hand you a list of things to delete. So the loop that actually lowers the bill is:
- Find the idle, orphaned, and over-provisioned resources across every service.
- Rank them by monthly savings, not by how interesting they are to fix.
- Fix the top of the list first - the boring $32/month items add up faster than one heroic re-architecture.
- Prevent regressions by re-scanning on a schedule or in CI, so the same waste does not silently rebuild next quarter.
The checklist below is grouped by service area. Every item is a real, repeatable fix with a linked deep-dive.
Compute
- Migrate x86 instances to Graviton (ARM). Graviton families cost up to ~20% less than the equivalent x86 for the same vCPU/memory, and often run faster per dollar. For most modern workloads it is a one-line instance-type swap. Deep dive: Graviton migration guide
Storage
- Migrate EBS gp2 volumes to gp3. gp3 is ~20% cheaper than gp2 and usually faster, with an online migration and zero downtime. Deep dive: gp2 to gp3 migration
- Delete old EBS snapshots. Snapshots cost $0.05/GB-month and accumulate forever - especially orphaned ones from deleted volumes and deregistered AMIs. Deep dive: Clean up old EBS snapshots
Networking
- Delete idle NAT Gateways. An idle NAT Gateway bills ~$32/month plus data charges for doing nothing. Many can be replaced with free VPC endpoints. Deep dive: Find and delete idle NAT Gateways
- Delete idle load balancers. An ALB or NLB with no traffic still bills its ~$16/month base rate. Look for near-zero requests and empty target groups. Deep dive: Delete idle load balancers
- Release unattached Elastic IPs. Since 2024 every public IPv4 address costs money, so an unattached Elastic IP bills ~$3.60/month for nothing. Deep dive: Stop paying for unattached Elastic IPs
Databases and analytics
- Right-size over-provisioned DynamoDB. Provisioned capacity bills whether you use it or not. Single-digit utilization means you are overpaying - right-size, auto-scale, or switch to on-demand. Deep dive: Right-size over-provisioned DynamoDB
- Pause idle Redshift clusters. A cluster charges per node-hour regardless of query activity. Idle clusters from old analytics projects are pure waste - pause, snapshot, or move to Serverless. Deep dive: Idle Redshift clusters bill by the hour
Observability
- Set CloudWatch Logs retention. Log groups default to infinite retention, so logs pile up forever at $0.03/GB-month. Set a sane policy on never-expiring groups. Deep dive: Your CloudWatch Logs never expire
What this checklist does not cover
To keep it honest: this list is about waste you can delete or right-size today, which is where the fastest, lowest-risk savings live. It does not cover:
- Commitments - Reserved Instances and Savings Plans, which are a separate exercise once your steady-state usage is clean (buy commitments after you delete waste, not before, or you will commit to paying for waste).
- Architecture - moving to spot, serverless, or cheaper data-transfer paths, which are higher-effort structural changes.
Clean up the list above first. It is the cheapest money you will ever save.
Automate the whole loop
Doing this by hand once is worth it. Doing it by hand every quarter is not. Cloud Cost Analyzer runs all of these checks (and 80+ more) as a single read-only CLI scan - it finds every item on this list across your account, ranks them by savings, and you can wire it into CI so new waste fails a build instead of quietly showing up on next month's invoice. Your credentials never leave your environment, with an air-gapped option for regulated teams.