Reserved instances get all the attention in AWS cost optimization content. They're also the last thing you should think about. Before you commit to three years of anything, there are simpler wins that don't require forecasting your usage a year out.

These are the eight habits that cut the Eventsmo AWS bill by about half over twelve months. Most of them took an hour or less. None of them required a dedicated "cloud cost" initiative.

1. Turn on S3 Intelligent-Tiering for everything old

S3 stores data indefinitely at Standard pricing unless you tell it not to. Intelligent-Tiering automatically moves objects that haven't been accessed in 30 days to a cheaper storage tier, and moves them back instantly when accessed.

It costs a small monitoring fee per object, which makes it unsuitable for buckets with millions of tiny files. For large media files (video segments, recordings, exports) it's almost always a win.

One lifecycle rule, five minutes, done.

2. Delete unattached EBS volumes

When you terminate an EC2 instance, the root volume is usually deleted automatically. Volumes you attached manually are not. They keep billing you at full price indefinitely.

aws ec2 describe-volumes \
  --filters Name=status,Values=available \
  --query 'Volumes[*].[VolumeId,Size,CreateTime]' \
  --output table

Run this. You will find volumes. Delete them or snapshot them.

3. Right-size RDS before touching instances

RDS Multi-AZ deployments are expensive. Before upgrading an instance type, check whether you're actually using the resources you have.

Enhanced Monitoring and Performance Insights (both free or nearly free) will show you CPU, memory, and IOPS utilization. We had an r5.xlarge running at 15% CPU and 30% memory. Downsized to r5.large, saved $180/month, nothing broke.

Do this before committing to reserved instances. The reservation buys you nothing if you're paying for capacity you don't need.

4. Use CloudFront in front of S3, not S3 presigned URLs

If you're serving media files directly from S3 presigned URLs, you're paying S3 data transfer rates for every byte served. S3 egress is $0.09/GB in us-east-1.

CloudFront's data transfer to the internet is $0.085/GB — roughly the same — but CloudFront caches popular content. For media files that many users access, the effective cost drops dramatically. For our HLS segments, CloudFront cache hit rate was ~85%, meaning we were paying S3 for 15% of the traffic we'd previously been paying for 100%.

CloudFront also gives you a free SSL certificate, edge locations, and WAF integration. There's no good reason not to use it.

5. Set Lambda concurrency limits

Lambda scales to meet demand automatically, which is great until something goes wrong upstream and ten thousand Lambda invocations pile up in a queue. We had a bad deploy that caused a retry loop and ran up $600 in Lambda costs in forty minutes before anyone noticed.

Reserved concurrency caps the maximum number of simultaneous executions per function. For functions that call downstream services with rate limits (payment APIs, third-party webhooks), this is also a correctness concern, not just a cost concern.

Set it once, forget it.

6. Move CloudWatch logs to S3 after 7 days

CloudWatch Logs is convenient for recent data. It's expensive for retention. The default retention is "never delete," which means every log line you've ever written is sitting in CloudWatch at $0.03/GB/month.

Set a 7-day retention on high-volume log groups. Export older logs to S3 with a lifecycle policy that moves them to Glacier after 90 days. You'll still be able to query them via Athena if you ever need to — which you almost never will.

7. Tag everything before you need to

Cost allocation tags let you break your bill down by team, service, environment, or whatever dimension matters to you. They're useless if you enable them after you've already incurred the costs you're trying to understand.

Enable the tags you want in the billing console, then enforce them in your infrastructure-as-code. An untagged resource in a pull request should be a pipeline failure.

The payoff is that when your bill spikes, you can identify the source in two minutes instead of two hours.

8. Review the Trusted Advisor cost checks weekly

AWS Trusted Advisor has a free tier that checks for idle load balancers, underutilized EC2 instances, unassociated Elastic IPs, and a handful of other common waste categories.

It's not comprehensive and it generates false positives. But spending fifteen minutes on it every week catches things that would otherwise run for months unnoticed. Idle load balancers are $16/month each. Elastic IPs not attached to running instances are $3.60/month each. Small numbers, but they add up.

What this doesn't cover

None of this addresses Reserved Instances, Savings Plans, Spot Instances, or architectural changes. Those are bigger levers with bigger payoffs, but they require more context about your specific usage patterns.

Start here. Get the low-hanging fruit. Then look at the bill and ask whether the remaining costs are actually necessary — which is a different question than how to discount them.

The most expensive AWS cost is the thing you're paying for that you don't need. Reserved instances just help you pay less for things you're going to keep needing. Order matters.