Your AWS bill is too high. Here is exactly what to do about it.
EC2:
- Right-size your instances. Check CPU and memory usage in AWS Compute Optimizer. If utilization is under 20%, then downgrade.
- Buy Reserved Instances or Savings Plans. If an instance runs 24/7, stop paying on-demand rates. A 1-year commitment can save upto 30 – 40% instantly.
- Auto-stop dev/staging instances after hours. Use EventBridge + Lambda to shut them down during nights and weekends. You can cut those bills by 70%+.
- Delete unattached EBS volumes and old snapshots to lower storage costs. They quietly charge you after instance termination. Audit monthly and set snapshot lifecycle policies.
S3:
- Enable Intelligent-Tiering for unpredictable access patterns. AWS automatically moves objects between tiers based on real usage. Set it and forget it.
- Set lifecycle policies on every bucket. Move data to Standard-IA after 30 days, Glacier after 90. Expire old logs automatically. Takes 10 minutes, saves money forever.
- Clean up incomplete multipart uploads. Failed uploads leave partial data that still costs money. Add a lifecycle rule to abort them after 7 days.
- Reduce unnecessary API requests. S3 charges per request. Batch your operations, use S3 Select to fetch only what you need and cache hot objects elsewhere.
- Audit your buckets with S3 Storage Lens. Find archived buckets, unused data and inefficient access patterns. The free tier is enough to get started.
CloudFront:
- Fix your cache hit ratio first. If it is below 80%, you are paying CloudFront prices to proxy traffic straight to your origin. Tighten your cache policies and stop forwarding unnecessary headers/query strings.
- Turn on compression. Enable Gzip or Brotli in your distribution settings. Smaller payloads = lower transfer costs + faster load times.
- Switch to the right price class. Default covers all global edge locations. If your users are in the US and Europe only, switch to Price Class 100 or 200. You will stop paying for coverage you don’t use.
- Set long TTLs on static assets. Images, fonts, JS files – cache them for 30 days or longer. Short TTLs force frequent origin fetches and drive up costs on both sides.
- Replace Lambda@Edge with CloudFront Functions where possible. CloudFront Functions are much cheaper for simple tasks like header manipulation or redirects. Audit what is running at the edge.
RDS:
- Right-size your database instances. Use Performance Insights to check real CPU and memory usage. Most RDS instances are over-provisioned and an easy downgrade opportunity.
- Buy Reserved Instances for production databases. Production DBs run 24/7. There is no reason to pay on-demand. Save upto 30 – 40% with a 1-year Reserved Instances.
- Stop dev/test databases when not in use. RDS instances can be stopped for up to 7 days at a time. Automate this for non-production environments. Huge savings for near-zero effort.
- Shorten backup retention on non-critical databases. 35 days of automated snapshots on a large DB costs real money. 7 days is enough for most workloads. Also, delete manual snapshots of terminated databases because they don’t go away on their own.
- Disable Multi-AZ on non-production environments. Multi-AZ doubles your instance cost. It is essential for production but unnecessary for dev and staging. Turn it off there.
Conclusion:
- Set up AWS Budgets. Get email alerts before you overspend. Takes 10 minutes. Do it now.
- Enable Cost Anomaly Detection. Free alerts when something suddenly costs 3x more than usual.
- Tag everything. Environment, team, project. If you can’t see where money is going, you can’t control it.
