Back

AWS Cost Optimization: The 7-Steps to Keep Bills Predictable

I’ve spent a lot of time helping teams scale efficiently on AWS. And honestly, deploying resources is way more complex than managing costs.


But here’s the catch: while AWS cost optimization isn’t new or mysterious, it’s often neglected. Most builders are so focused on getting things running that by the time the first big bill hits, it’s already too late to wonder where the money went.


I decided to put together something simple, practical, AWS-native, 7-Step Cost Optimization System for people who are still building, scaling, or just want a quick reference to make sure they’re not overspending.


This isn’t a FinOps thesis or a “cut your bill by 90% overnight” story. It’s a straightforward simple guide for anyone who loves building on AWS but wants to do it a bit smarter.


Step 1: Gain Full Visibility: Know Where Your Money Goes

You cannot optimize what you cannot measure. Start by getting visibility across accounts, services, regions, teams.


  • Enable AWS Cost Explorer and Cost & Usage Reports (CUR).
  • Use AWS Billing Conductor for custom pricing or internal cost modeling in multi-tenant setups.
  • Create and enforce Tag Policies and Cost Categories in AWS Organizations to maintain consistent attribution across accounts.
  • Use AWS Cost Anomaly Detection (with Slack or Teams alerts) to flag unexpected spikes automatically.
  • Integrate CUR with Amazon Athena for SQL-based analysis and dashboard automation.

Example CLI:

aws ce get-cost-and-usage \
--time-period Start=2025-10-01,End=2025-11-01 \
--granularity MONTHLY \
--metrics "UnblendedCost" \
--group-by Type=TAG,Key=Project

This groups last month’s unblended cost by the Project tag. Use such queries to feed internal dashboards or FinOps tools.


Pro Tip: Use the new AI-powered query feature in Cost Explorer to ask questions like “Which service increased my bill 20% this month?” and get insights instantly.


Don’t forget sustainability:


The AWS Carbon Footprint Tool now integrates with Cost Explorer, helping you optimize not just for cost but also for carbon efficiency — increasingly relevant for compliance and reporting.


Best practices:


  • Use AWS Organizations with consolidated billing so spend is rolled up and you capture volume discounts.
  • Give product teams visibility into their own spend but keep central oversight via a management account.
  • Weekly or monthly cost dashboards help keep accountability high.

Step 2: Eliminate Waste, Kill the Idle & Under-Utilized Resources


Once you can see your spend, the next step is clearing the low-hanging fruit: idle resources, unattached volumes, unused capacity.


Compute Examples (CLI):


# List running EC2 instances
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" \
--query "Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,Tags]" \
--output table


# List unattached EBS volumes
aws ec2 describe-volumes \
--filters Name=status,Values=available \
--query "Volumes[*].[VolumeId,Size,AvailabilityZone]" \
--output table

Common issues:


  • EC2 instances that are rarely used (e.g., < 10% CPU)
  • Unattached EBS volumes still billed
  • Idle Load Balancers receiving no traffic
  • Elastic IPs not associated
  • Snapshots stored indefinitely

Automation-first cleanup:


# Find unattached EBS volumes
aws ec2 describe-volumes \
--filters Name=status,Values=available \
--query "Volumes[*].[VolumeId,Size]" \
--output table

You can also use AWS Compute Optimizer’s new “Idle Resource” dashboard, Trusted Advisor, and AWS Resource Explorer to audit unused assets organization-wide.


Pro Tip: Add AWS Backup Audit Manager to automatically detect orphaned EBS snapshots, these often account for 5–10% of wasted spend.


My own lesson:


I once found a development environment EC2 running at 2% utilisation 24×7. I shut it down and saved ~$180/month. It taught me: idle resources = guaranteed waste.


Action loop:


  • Identify idle/unused resources
  • Review with owners (ask: “Do you still need this?”)
  • Delete or shut down
  • Automate monitoring of idle resources (see Step 6 for automation)

Step 3: Rightsize Effectively, Match Resource to Demand


Having removed waste, now match your resource sizes and pricing models to real usage.


Key AWS Native Tools:


  • AWS Compute Optimizer: gives rightsizing recommendations for EC2, Auto Scaling Groups, Lambda, EBS volumes.
  • AWS Trusted Advisor (Cost Optimization checks): identifies low-utilization instances, idle load balancers, unattached EIPs and other cost risks.

Example CLI:


aws compute-optimizer get-ec2-instance-recommendations \
--instance-arns arn:aws:ec2:us-east-1:123456789012:instance/i-0abcdef1234567890

Compute Optimizer will tell you if the instance is over-provisioned and provide alternatives, including modern instance types (often cheaper and faster).


Strategy:


  • Downsize instances with low utilization.
  • Replace older generation instances with newer ones (e.g., migrate from M4 to M6i or Graviton2/3), price/performance improves significantly.
  • Use burstable instance types (T-family) for workloads with variable usage.
  • Review memory, network, I/O usage, don’t optimize for just CPU.


By rightsizing across your fleet, many organizations reduce compute costs by 10–30% without impacting performance.


Step 4: Pricing Model Optimization - Use Savings Plans, Reserved, Spot Where It Makes Sense


You’ve got the right size. Now optimise the pricing model.


Options:


  • On-Demand: flexible, no commitment
  • Savings Plans / Reserved Instances (RIs): commit 1- or 3-year for up to ~72% discount compared to On-Demand
  • EC2 Spot Instances: take advantage of AWS spare capacity — up to ~90% savings, but can be interrupted

CLI example: view Savings Plan recommendations:


aws ce get-savings-plans-purchase-recommendation \
--savings-plans-type COMPUTE_SP \
--term-in-years ONE_YEAR \
--payment-option NO_UPFRONT \
--lookback-period-in-days 30

Pro Tip: Combine Savings Plans for steady workloads + Spot for burst workloads = flexibility with maximum savings.


AWS now provides automated commitment forecasting in Cost Explorer, using ML to suggest the optimal coverage percentage and avoid overcommitting.


Best practices:


  • For steady-state workloads (e.g., core production services), use Savings Plans or RIs.
  • Monitor utilization of those commitments; under-utilisation means money lost.
  • For batch, test, or non-critical workloads: use Spot. Architect for interruption.
  • In multi-account setups under AWS Organizations, ensure commitments are shared across accounts (so you maximise savings across the org).

My story:


After purchasing a 1-year compute Savings Plan covering ~60% of my EC2 usage, I saw a 35% drop in compute spend overnight. But then I forgot to review utilization six months later and I was paying for capacity I didn’t need. Lesson: commitment without review is waste too.


Step 5: Storage & Data Transfer Efficiency: One Size Doesn’t Fit All


Storage and data transfer are often overlooked, but they’re sources of creeping spend and inefficiency.


Storage Optimisation:


  • Use the right Amazon S3 storage class: for long-lived but infrequently accessed data use S3 Standard-IA, S3 One-Zone-IA, S3 Intelligent-Tiering, or Glacier Deep Archive.
  • Set up S3 Lifecycle rules: transition or delete objects older than a certain age.
  • Manage EBS volumes: delete unattached volumes, switch to gp3 volumes (cost-efficient) if gp2 volumes are used with excessive IOPS.
  • Use EFS IA (infrequent access) mode for file systems with long-idle files.

Data Transfer Optimisation:


  • Keep EC2 instances, databases and services within the same region/AZ when possible to avoid inter-AZ or inter-region transfer costs.
  • Use Amazon CloudFront or edge-services to serve content, reducing origin egress costs.
  • Use VPC Endpoints or PrivateLink to access AWS services privately and avoid NAT gateway egress charges.
  • Monitor data transfer bills for “Data Transfer OUT” spikes in Cost Explorer.

Example scenario:


Switching a global web asset to CloudFront reduced egress cost by 60% for me, and improved latency for end users too.


Pro Tip: Use AWS Network Manager to visualize traffic paths and identify high-cost egress patterns.


Step 6: Automate & Enforce — Governance, Scheduling & Cleanup


One-time fixes are good, but true cost optimisation requires automation and governance so savings persist.


Key Actions:


  • Use AWS Config Rules or AWS Lambda to detect non-compliant resources (e.g., untagged resources, publicly exposed S3 buckets, idle instances).
  • Use AWS Budgets Actions: when spend or budget threshold is breached, you can trigger Lambda functions, send SNS alerts, or automate resource shutdowns.
  • Automate schedules: use EventBridge (formerly CloudWatch Events) or AWS Instance Scheduler to stop dev/test resources outside business hours.
  • Use Infrastructure as Code (IaC) to enforce cost-best-practices (tags required, allowed instance families, budget creation) from the start.

Example Lambda snippet (Python) to stop Dev instances nightly:


import boto3
ec2 = boto3.client('ec2', region_name='us-east-1')
def lambda_handler(event, context):
instances = ec2.describe_instances(
Filters=[{'Name':'tag:Environment','Values':['Dev']}]
)
instance_ids = [i['InstanceId']
for r in instances['Reservations']
for i in r['Instances']]
if instance_ids:
ec2.stop_instances(InstanceIds=instance_ids)
print(f"Stopped instances: {instance_ids}")

By automating shutdowns and enforcing policies, you eliminate human error and “drift” (resources left running that shouldn’t be), which is a major cost leak.


Pro Tip: Integrate AWS Control Tower guardrails and Service Control Policies (SCPs) to enforce budgets and tagging at scale.


Step 7: Build a Cost-Aware Culture — Processes, Accountability & Continuous Improvement


Cost optimisation isn’t a tool issue, it’s a process and cultural issue. Without mindset and governance, optimisation efforts won’t last.


Process and Culture Elements:


  • Embed cost discussions into architecture design reviews: ask “What’s the cheapest way to run this with acceptable risk/performance?”
  • Showback/Chargeback: allocate spend back to teams or business units using tags and cost categories. Let teams own their spend.
  • Regular Cost Reviews: hold monthly or quarterly FinOps meetings. Review budgets, savings-plan utilisation, anomaly alerts, rightsizing opportunities.
  • KPIs and Metrics: track cost per unit (e.g., cost per transaction, cost per API call, cost per user) not just absolute cost. Focus on efficiency.
  • Continuous Learning: stay updated with AWS announcements (new instance types, new storage classes, new pricing models). What was optimal last year may no longer be so tomorrow.

Closing strategy:


Building cheap infrastructure is only half the battle, keeping it cheap was the other half. Set up a “Cost Friday” every month: the cloud team, product owners, and finance all gather for 30 minutes, review cost graphs, identify any budget spikes, and decide on next optimisation steps. The first month itself you will see drastic savings. Six months later even more savings. Because now the team thinks cost rather than just build.


Final Thoughts


Here’s the truth: AWS won’t send you a bill that says “You are paying too much.” They’ll just keep charging you.


It’s on you to build:


  • Visibility
  • Discipline
  • The right pricing models
  • Efficient architecture
  • Automation & governance
  • A cost-aware organization

Start today: open Cost Explorer, tag your resources, identify one idle instance, shut it down.


That’s step one.


Your future self and your CFO will thank you.


Quick Reference



Cloudshim AWS FinOps


If you liked this article, be sure to check out lightweight FinOps quick guide we’re building at aws.cloudshim.com, where we dive into strategies for optimizing AWS’s top services. Think of it as your end-to-end playbook for running smarter and leaner on AWS.

Share

This may also interest you

A simple serverless app with HTTP API Gateway, Lambda and S3

A simple serverless app with HTTP API Gateway, Lambda and S3

When coming up with architectures for an application, wha…

AWS Cost & Usage Report (CUR) as a service (CURAAS?)

AWS Cost & Usage Report (CUR) as a service (CURAAS?)

For those of you who've ever tried to decode how AWS bi…

Making the most of AWS EC2 Savings Plan

Making the most of AWS EC2 Savings Plan

AWS introduced Savings plan (SP) a year ago, for customers…

Cost Impact of the Great Cloud Wars

Cost Impact of the Great Cloud Wars

With the break-through of cloud computing, major cloud pr…

How managing EC2 usage cut this startups AWS Bill by 60%

How managing EC2 usage cut this startups AWS Bill by 60%

Challenge Prasad Purandare is building an AI startup for im…

GPT Pricing Breakdown: OpenAI vs Azure vs AWS vs GCP

GPT Pricing Breakdown: OpenAI vs Azure vs AWS vs GCP

The era of picking an AI model is no longer just about raw …

AWS Bedrock AgentCore and the Future of Serverless AI Agents

AWS Bedrock AgentCore and the Future of Serverless AI Agents

AWS quietly dropped something powerful recently —  AgentCor…

Cutting Through AWS Networking Bills: From NAT to Direct Connect

Cutting Through AWS Networking Bills: From NAT to Direct Connect

AWS bills are sneaky. You log in, see EC2, S3, Lambda costs…

EBS vs EFS vs S3 — A Practical Take on AWS Storage

EBS vs EFS vs S3 — A Practical Take on AWS Storage

If you’ve ever stared at an AWS pricing page wondering whet…