Skip to content

AWS cost-optimization checklist for startups

This is a "Friday afternoon" punch-list. Each item is a self-contained action a single engineer can ship in a day, ranked by typical dollar size for a Series-A SaaS spending $10k–$50k/month on AWS.

Estimate your aggregate waste first →

How to use this list

Don't try to do all twelve at once. Run the Cloud Waste Radar, find the top 3 items for your footprint, and ship those first. The rest is for the quarter after.


The twelve items

1. Add S3 + DynamoDB Gateway endpoints (Free, $100–$1,000/mo saved)

Both endpoints are free. They take traffic from private subnets to S3 / DynamoDB off the NAT Gateway data-processing toll ($0.045/GB) immediately. One Terraform PR per VPC.

Read “Reduce AWS NAT Gateway cost”

2. Migrate gp2 → gp3 ($20–$200/TB/yr saved)

gp3 is 20% cheaper per GB-month than gp2 with the same baseline IOPS most workloads need. The migration is online — aws ec2 modify-volume runs in the background. No downtime.

Run the gp2 → gp3 calculatorRead the deep guide

3. Delete unattached EBS volumes ($80/TB/mo recovered)

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

Snapshot first (snapshots are ~half the per-GB cost) if you're nervous, then delete. Schedule a monthly review.

4. Set CloudWatch Logs retention ($10–$500/mo saved)

The default retention is Never expire. Set it on every log group.

aws logs describe-log-groups --query 'logGroups[?retentionInDays==`null`].logGroupName' --output text \
  | xargs -n 1 -I {} aws logs put-retention-policy --log-group-name {} --retention-in-days 30

App logs: 30 days. Audit logs: 365 days. Anything older goes to S3 + Glacier via subscription filter if you need it long-term.

5. Stop idle EC2 instances (rate × $73/mo per t3.medium)

Compute Optimizer flags candidates; cross-reference with your own monitoring. The bias is to stop, not delete — stopped instances accrue no compute charges (but still EBS).

Run the Cloud Waste Radar

6. Consolidate EKS control planes ($73/mo per cluster removed)

If you have more than three EKS clusters that aren't separated for compliance / version-train reasons, consolidate using namespaces + RBAC.

Read “Why is EKS so expensive?”Run the EKS calculator

7. Move old S3 objects to Glacier / Deep Archive ($16/TB/mo saved per tier)

Lifecycle policy:

{
  "Rules": [{
    "Id": "archive-old",
    "Status": "Enabled",
    "Transitions": [
      { "Days": 30,  "StorageClass": "STANDARD_IA" },
      { "Days": 180, "StorageClass": "GLACIER" },
      { "Days": 365, "StorageClass": "DEEP_ARCHIVE" }
    ]
  }]
}

Deep Archive is ~$1/TB/month. Standard is ~$23/TB/month. The math gets large quickly on backup buckets.

8. Right-size RDS one tier down ($100–$500/mo per cluster)

Engineers consistently overestimate the RDS size they need. RDS lets you scale up in minutes if you misjudged — there is no penalty for trying. Start with non-production clusters, watch for a week.

9. Drop Multi-AZ on non-production RDS ($100–$300/mo per cluster)

Multi-AZ doubles the RDS cost. Staging / dev clusters don't need it. Take a snapshot before you change.

10. Add ECR + CloudWatch Logs interface endpoints ($20–$100/mo saved at scale)

Pays for itself above ~160 GB/mo of either kind of traffic. EKS clusters that scale frequently typically clear that threshold easily.

Read “Reduce AWS NAT Gateway cost”

11. Pin chatty services to a single AZ ($0.02/GB saved on cross-AZ traffic)

Kafka brokers + consumers, RDS read replicas + readers, Redis primary + clients — put them in the same AZ when you don't need cross-AZ HA on a hot path. Each cross-AZ byte is billed twice.

12. Buy Compute Savings Plans on your steady-state ($150–$600/mo saved per 10 vCPU)

1-year Compute Savings Plans, No Upfront, on the static minimum of your fleet. Don't try to cover 100% — you'll pay for capacity you don't use. Aim for ~70% coverage of the trailing-3-month average.


A sensible quarter plan

If you're starting from zero:

Week 1 (1 PR): S3 + DynamoDB endpoints (#1). Free, instant savings.

Week 2-3 (3 PRs): CloudWatch retention (#4), unattached EBS sweep (#3), gp2 → gp3 of staging (#2).

Month 2 (1 sprint): EKS consolidation (#6), Compute Optimizer pass (#5), RDS right-size of non-prod (#8) + drop Multi-AZ on non-prod (#9).

Month 3 (1 sprint): S3 lifecycle (#7), interface endpoints (#10), AZ-pinning audit (#11), Compute Savings Plans purchase (#12).

For a typical Series-A footprint this sequence is ~$1k-$5k/month back in your AWS budget by the end of the quarter, with no app changes and no downtime.


Where to go next

Want the prioritised list against your bill?

Book a free 30-minute audit and we'll come back with this checklist annotated with the exact $/month savings for each item on your AWS account, ranked, with the suggested PR sequence.

Book a free audit →