Skip to main content

New: AI-powered cost optimization recommendations.

Learn more
AWSCost OptimizationFinOps

The Engineer's Guide to AWS Cost Optimization: 30+ Strategies to Cut Your Cloud Bill by 15-60%

You know that feeling when you open the AWS billing console and think, "Wait, we're spending how much?" You're not alone. I've seen it countless times—teams building incredible products while their...

Nishant Thorat

Nishant Thorat

Founder

11 min read

You know that feeling when you open the AWS billing console and think, "Wait, we're spending how much?" You're not alone. I've seen it countless times—teams building incredible products while their cloud costs quietly spiral out of control in the background.

Here's the thing: AWS cost optimization isn't about penny-pinching or sacrificing performance. It's about eliminating waste. And as engineers, we're uniquely positioned to find and fix that waste because we understand what the infrastructure is actually doing.

Based on analyzing over $250 million in cloud spend, here are the optimizations that consistently deliver the biggest returns.

What is AWS Cost Optimization?

AWS cost optimization is the process of reducing your Amazon Web Services spending without sacrificing performance, reliability, or security. It involves right-sizing resources, eliminating waste, leveraging pricing models like Reserved Instances and Savings Plans, and continuously monitoring your cloud infrastructure for cost-saving opportunities.

The goal isn't to spend less on cloud—it's to spend smarter on cloud.

Why Engineers Should Lead Cost Optimization

Finance teams can read a bill, but they can't tell you whether that m5.4xlarge is actually needed or if a t3.medium would do the job. Only engineers can make those calls because we understand:

  • What the application actually requires
  • Which resources are genuinely critical vs. "we set it up once and forgot about it"
  • The technical trade-offs of each optimization
  • How to implement changes safely

That's why the most successful FinOps programs are engineering-led. Finance provides the data; engineering provides the solutions.

Quick Wins: AWS Cost Optimizations You Can Do Today

These optimizations take less than an hour and deliver immediate savings. If you're looking for fast results to show your leadership team, start here.

OptimizationTypical SavingsEffort Level
GP2 → GP3 EBS migration~20%Low
io1/io2 → GP3 migration60-87%Low
S3 Intelligent-TieringUp to 65%Low
DynamoDB Standard-IA~60%Low
CloudFront compression65-80%Low
Delete orphaned EBS volumes100%Low
Stop dev instances off-hours~65%Medium
Delete duplicate CloudTrail trails100%Low
Delete idle NAT Gateways100%Low
Disable unused Fast Snapshot Restore100%Low

How to Optimize AWS EBS Costs

Elastic Block Store is often the first place I look for savings because the opportunities are so predictable. While you're optimizing EBS, don't forget security—check out our guide on finding unencrypted AWS EBS volumes at scale to ensure you're not leaving data exposed.

Migrate GP2 Volumes to GP3

Savings: ~20% per volume

GP3 is simply better than GP2—same reliability, baseline 3,000 IOPS included, and 20% cheaper. There's no technical reason to stay on GP2 anymore.

How to find GP2 volumes:

aws ec2 describe-volumes --filters Name=volume-type,Values=gp2 --query 'Volumes[*].[VolumeId,Size]' --output table

Any results from this command represent immediate savings opportunities.

Migrate Provisioned IOPS Volumes (io1/io2) to GP3

Savings: 60-87% per volume

Most io1/io2 volumes are massively over-provisioned. Teams set them up years ago "just to be safe" and never revisited the decision.

How to spot this opportunity:

Check your actual IOPS usage in CloudWatch. If peak IOPS is below 16,000, GP3 can handle it—often at 60-87% less cost.

Delete Unattached EBS Volumes

Savings: 100% of orphaned volume costs

When you terminate an EC2 instance, the root volume gets deleted—but additional volumes often don't. They just sit there, running up charges every month.

How to find orphaned volumes:

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

Delete Old EBS Snapshots

Savings: $0.05 per GB-month

EBS snapshots accumulate silently. Most organizations have snapshots from years ago that serve no purpose except running up the bill.

Sort your snapshots by creation date. Anything older than your retention policy (usually 90 days) is a deletion candidate.

Disable Unused Fast Snapshot Restore (FSR)

Savings: Eliminates hidden hourly charges

FSR charges hourly fees for every AZ where it's enabled. If you're not actively using instant restores, you're paying for nothing.

How to Reduce S3 Storage Costs

S3 looks cheap per-GB, but those GBs add up fast—especially with versioning enabled.

Enable S3 Intelligent-Tiering

Savings: Up to 65% on infrequently accessed data

For buckets where you're not sure of access patterns, Intelligent-Tiering automatically moves objects between access tiers. No retrieval fees, no operational overhead.

Use S3 Storage Lens to identify buckets with declining or unpredictable access patterns—those are your best candidates.

Set Lifecycle Policies for Old Object Versions

Savings: Varies (often substantial)

I've seen buckets where old versions were 10x the size of current objects. Versioning is great for recovery, but without lifecycle policies, you're storing every version forever.

Here's an example lifecycle policy configuration:

{
  "Rules": [
    {
      "ID": "ExpireOldVersions",
      "Status": "Enabled",
      "Filter": {},
      "NoncurrentVersionExpiration": {
        "NoncurrentDays": 30
      }
    }
  ]
}

Delete Incomplete Multipart Uploads

Savings: 100% of partial upload costs

Failed or abandoned multipart uploads sit in your bucket invisibly, consuming storage. Set a lifecycle rule to auto-expire them after 7 days.

How to Optimize EC2 Instance Costs

EC2 is typically the largest line item on AWS bills. Even small optimizations here have big impact.

Right-Size Underutilized Instances

Savings: 20-50%

Check CloudWatch for CPU and memory utilization. If an instance is consistently running below 40% utilization, it's oversized.

AWS Compute Optimizer can generate rightsizing recommendations automatically—it's a good starting point.

Use Graviton (ARM) Instances

Savings: Up to 40% better price-performance

Graviton instances offer the same performance at 20% lower cost—or 40% more performance at the same cost. Either way, you win.

Any Linux workload without x86-specific dependencies is a candidate. Start with non-production environments to validate compatibility. For a deeper dive into the performance and cost benefits, read our guide on AWS Graviton: Unlocking Performance and Cost Efficiency in the Cloud.

Migrate to Current-Generation Instance Types

Savings: 10-30% better performance per dollar

Still running m4, c4, r4, or t2 instances? Current-generation instances (m6i, c6i, r6i, t3) deliver better performance at lower cost. It's free money.

Stop Dev/Test Instances Off-Hours

Savings: ~65%

Development and test instances don't need to run 24/7. If they're idle evenings and weekends, automate stop/start schedules.

Tag your instances by environment, then create Lambda functions or use AWS Instance Scheduler to automate the process.

Here's a simple Python Lambda function to stop instances:

import boto3

def lambda_handler(event, context):
    ec2 = boto3.client('ec2')

    # Find instances with Environment=dev tag
    instances = ec2.describe_instances(
        Filters=[
            {'Name': 'tag:Environment', 'Values': ['dev', 'test']},
            {'Name': 'instance-state-name', 'Values': ['running']}
        ]
    )

    instance_ids = []
    for reservation in instances['Reservations']:
        for instance in reservation['Instances']:
            instance_ids.append(instance['InstanceId'])

    if instance_ids:
        ec2.stop_instances(InstanceIds=instance_ids)
        print(f"Stopped instances: {instance_ids}")

    return {'stopped': instance_ids}

How to Reduce AWS Networking Costs

Data transfer costs are the silent budget killer on AWS. They're often the second or third largest line item.

Enable CloudFront Compression

Savings: 65-80% bandwidth reduction

Check your CloudFront distribution settings. If "Compress Objects Automatically" is off, you're paying to transfer bloated files.

Set Up VPC Endpoints for AWS Service Traffic

Savings: Eliminates NAT Gateway data processing fees

S3 and DynamoDB gateway endpoints are free. If you're routing that traffic through NAT Gateways, you're paying processing fees for no reason.

Remove Idle NAT Gateways

Savings: 100% of idle NAT costs

Check NAT Gateway metrics for BytesOutToDestination. Near-zero traffic over 30+ days means it's unused. For a comprehensive guide on reducing data transfer expenses, see our deep dive on AWS NAT Gateway Costs: How to Reduce Data Transfer Expenses.

Delete Unused Elastic IPs

Savings: $3.60 per month per idle EIP

Unassociated Elastic IPs cost money. Filter by association status and delete anything unattached.

Delete Idle Load Balancers

Savings: $16-22 per month base cost per ALB/NLB

Check RequestCount and ActiveConnectionCount metrics. Zero traffic for 30+ days means the load balancer should be deleted.

How to Optimize AWS Database Costs

Databases are expensive, and teams tend to over-provision "just in case." If you're running Redis workloads, consider Amazon ElastiCache for Valkey which can save up to 33% with zero-downtime migration.

Migrate RDS io1/io2 Storage to GP3

Savings: 60-87%

Same principle as EBS—check actual IOPS usage vs. provisioned. Most RDS io1/io2 volumes are wildly over-provisioned.

Right-Size RDS Instances

Savings: 20-50%

Check CPU and FreeableMemory metrics. Consistent low utilization means you're paying for unused capacity.

Delete Idle RDS/Aurora Clusters

Savings: 100% of cluster costs

Check the DatabaseConnections metric. Zero connections over weeks means a forgotten database burning money.

Enable DynamoDB Standard-IA

Savings: ~60% on storage

Tables accessed less than 20% of the time are candidates for Standard-IA storage class.

Switch to Aurora I/O-Optimized

Savings: 30-40%

If I/O charges exceed 25% of your Aurora bill, I/O-Optimized pricing probably saves money.

How to Reduce AWS Lambda Costs

Serverless doesn't mean free. Lambda costs can add up quickly at scale. For a comprehensive breakdown of all Lambda optimization strategies, check out The Ultimate Guide to AWS Lambda Cost Optimization.

Right-Size Lambda Memory

Savings: 15-40%

Use the AWS Lambda Power Tuning tool. Many functions run faster AND cheaper with different memory settings.

For more on Lambda costs, read our guide on AWS Lambda's new tiered logging pricing.

Use Graviton for Lambda

Savings: Up to 34% better price-performance

Functions without x86-specific dependencies can run on ARM. It's a one-setting change.

Remove Unused Provisioned Concurrency

Savings: $0.015 per GB-hour when idle

Check ProvisionedConcurrencyUtilization. Low utilization means you're paying for warm capacity you don't use.

Also see: AWS Lambda cold starts now cost money.

How to Reduce CloudWatch and Monitoring Costs

Monitoring costs creep up slowly but can become significant. This is one area where native tools often fall short—consider dedicated FinOps tooling for better visibility.

Delete Duplicate CloudTrail Trails

Savings: 100% of duplicate costs

Multiple trails logging the same events to different buckets is surprisingly common—and wasteful.

Optimize CloudWatch Log Retention

Savings: Varies by volume

The default retention is "never expire." Most logs lose value after 30-90 days. Set appropriate retention policies.

# Set 30-day retention on all log groups
aws logs describe-log-groups --query 'logGroups[*].logGroupName' --output text | \
  xargs -I {} aws logs put-retention-policy --log-group-name {} --retention-in-days 30

Delete Unused CloudWatch Alarms

Savings: $0.10 per alarm per month

Alarms that haven't changed state in months are monitoring nothing useful.

Commonly Overlooked AWS Cost Savings

These services fly under the radar but can generate significant waste.

Delete Idle OpenSearch Clusters

Check indexing and search rate metrics. Near-zero activity over weeks means an unused cluster.

Stop Idle SageMaker Notebooks

Notebooks running for days with no kernel activity are often forgotten after experiments.

Delete Inactive QuickSight Users

Savings: $18-24 per user per month

Users who haven't logged in for 30+ days are wasting licenses.

Track AI and ML Costs

If you're using Amazon Bedrock or other AI services, costs can spiral quickly. Learn about Amazon Bedrock pricing and cost optimization strategies, or use CloudYali's AI Cost Tracking for full visibility.

AWS Cost Optimization Implementation Strategy

  1. Start with quick wins — GP2 to GP3, enable compression, delete orphaned resources
  2. Set up monitoring — Deploy CloudYali Budget Alerts to catch cost anomalies before they become problems
  3. Tag everything — Good tagging enables accurate cost allocation and easier optimization. See our guide on AWS Cost Allocation Tags: Best Practices, Challenges and Tools for implementation strategies
  4. Automate where possible — Scheduled instance stops, lifecycle policies, automated rightsizing
  5. Review regularly — Cloud environments change; make cost review a monthly habit

For a deeper understanding of how tagging has evolved and why it matters, read AWS Tagging evolution: From simple labels to cost allocation and standardization.

FAQ: AWS Cost Optimization

How much can I save on AWS costs?

Most organizations save 15-60% on their AWS bill through optimization, with 20-30% being the typical first-year result. Quick wins like GP2 to GP3 migration deliver 20% savings immediately, while comprehensive programs including rightsizing and Reserved Instances can achieve 40-60% reductions.

What's the fastest way to reduce my AWS bill?

The fastest wins are: migrating GP2 volumes to GP3 (20% savings, takes minutes), deleting orphaned EBS volumes and snapshots (100% savings on those resources), and enabling CloudFront compression (65-80% bandwidth reduction). These can be done in under an hour.

Should I use Reserved Instances or Savings Plans?

Savings Plans are generally more flexible and recommended for most organizations. Compute Savings Plans cover EC2, Lambda, and Fargate with flexibility to change instance types. Reserved Instances offer slightly deeper discounts but require more commitment to specific configurations.

How often should I review AWS costs?

Monthly reviews are the minimum. Set up automated alerts for budget thresholds and anomalies. The most effective FinOps teams review costs weekly and have automated monitoring for real-time visibility.

What tools help with AWS cost optimization?

Start with AWS-native tools: Cost Explorer, Compute Optimizer, and Trusted Advisor. For comprehensive visibility and automated recommendations, CloudYali provides cost reports, anomaly detection, and optimization tracking across all your AWS accounts.

Start Optimizing Your AWS Costs Today

These 30+ optimizations represent real savings opportunities in most AWS environments. You don't need to tackle everything at once—start with the quick wins, document your savings, and build momentum.

Download the complete checklist: AWS Cost Optimization Checklist (PDF)

Want deeper visibility into your cloud costs? Try CloudYali free and see where your AWS dollars are actually going.

Ready to optimize your cloud costs?cloud costs

Start your free trial today and see how CloudYali can help you save.