DEV Community

Cover image for FinOps for Startups: How to Stop Bleeding Money on Cloud Without Hiring a Team
Germán Neironi
Germán Neironi

Posted on

FinOps for Startups: How to Stop Bleeding Money on Cloud Without Hiring a Team

Let me share a number that should make every startup founder uncomfortable:

27% of cloud spend is wasted.

That's not my opinion. That's Flexera's 2025 State of the Cloud Report. And it's actually improved from previous years (it was 32% in 2022).

If your startup spends $10K/month on AWS, around $2,700 is probably going to resources you don't need.

The problem? Most FinOps advice assumes you have:

  • A dedicated FinOps team
  • Enterprise tools with $45K+ annual contracts
  • Time to build dashboards and review reports

Startups have none of that. You have a Slack channel where someone occasionally posts "why is our AWS bill so high?" and everyone shrugs.

Let me show you how to do FinOps without the overhead.

What is FinOps (In Startup Terms)

FinOps is just "don't waste money on cloud." That's it.

The fancy definition involves "cloud financial management" and "cross-functional collaboration." But for a 10-person startup, it means:

  1. Know what you're spending
  2. Understand why
  3. Fix the obvious waste
  4. Don't let it creep back

No team required. No enterprise tools. Just discipline.

The 80/20 of Cloud Waste

After analyzing dozens of AWS accounts, I've found that 80% of waste comes from 5 sources:

1. Zombie Resources (30% of waste)

Resources that were created and forgotten:

  • EC2 instances from that "quick test" 6 months ago
  • Load balancers pointing to nothing
  • EBS volumes from terminated instances
  • Unattached Elastic IPs ($3.60/month each - sounds small until you have 20)

Quick fix:

# Find unattached EBS volumes
aws ec2 describe-volumes \
  --filters Name=status,Values=available \
  --query 'Volumes[*].[VolumeId,Size,CreateTime]' \
  --output table
Enter fullscreen mode Exit fullscreen mode

2. Oversized Instances (25% of waste)

That m5.xlarge "because we might need it" running at 8% CPU.

This is the most common waste in startups. Someone provisions a big instance "to be safe," and no one ever checks if it's actually needed.

Quick fix:

# Check CPU utilization (last 7 days)
aws cloudwatch get-metric-statistics \
  --namespace AWS/EC2 \
  --metric-name CPUUtilization \
  --dimensions Name=InstanceId,Value=i-YOUR_INSTANCE_ID \
  --start-time $(date -d '7 days ago' -u +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
  --period 3600 \
  --statistics Average
Enter fullscreen mode Exit fullscreen mode

If average CPU is under 20%, you're probably oversized.

3. Logs Growing Forever (20% of waste)

CloudWatch Logs have no default retention. Your logs from 2022 are still there, and you're still paying for them.

I've heard of companies paying $40K+/month just for log storage.

Quick fix:

# Find log groups without retention
aws logs describe-log-groups \
  --query 'logGroups[?retentionInDays==`null`].[logGroupName,storedBytes]' \
  --output table
Enter fullscreen mode Exit fullscreen mode

Set retention to 14 or 30 days for most logs. You probably don't need 3-year-old debug logs.

4. Wrong Storage Classes (15% of waste)

Data that's accessed once a year sitting in S3 Standard instead of Glacier.

Or worse: gp2 EBS volumes instead of gp3 (gp3 is 20% cheaper with better performance).

Quick fix:

# Find gp2 volumes (should be gp3)
aws ec2 describe-volumes \
  --filters Name=volume-type,Values=gp2 \
  --query 'Volumes[*].[VolumeId,Size,VolumeType]' \
  --output table
Enter fullscreen mode Exit fullscreen mode

5. Idle RDS Instances (10% of waste)

Development databases running 24/7 when they're only used during work hours.

Quick fix: Aurora Serverless v2 for dev/staging, or at minimum, stop instances outside work hours.

The 15-Minute Weekly Audit

You don't need a FinOps platform. You need 15 minutes every Monday.

Week 1: Check the Bill

Go to AWS Cost Explorer. Look at:

  • Top 5 services by cost
  • Any spikes vs last month
  • Cost by tag (if you're tagging... you are tagging, right?)

Week 2: Hunt Zombies

Run the commands above. Delete what you don't need.

Week 3: Check Utilization

Look at your biggest EC2 instances and RDS databases. Are they actually busy?

Week 4: Review Reservations

Are you running anything consistently 24/7 for 6+ months? Consider Reserved Instances or Savings Plans.

Rotate through these. Takes 15 minutes if you're focused.

Automation That Actually Helps

Some things should be automated from day one:

1. Budget Alerts

aws budgets create-budget \
  --account-id YOUR_ACCOUNT_ID \
  --budget '{
    "BudgetName": "Monthly-Limit",
    "BudgetLimit": {"Amount": "1000", "Unit": "USD"},
    "TimeUnit": "MONTHLY",
    "BudgetType": "COST"
  }' \
  --notifications-with-subscribers '[{
    "Notification": {
      "NotificationType": "ACTUAL",
      "ComparisonOperator": "GREATER_THAN",
      "Threshold": 80
    },
    "Subscribers": [{
      "SubscriptionType": "EMAIL",
      "Address": "your@email.com"
    }]
  }]'
Enter fullscreen mode Exit fullscreen mode

Get alerted at 80% of budget. Not at 150%.

2. Auto-Stop Dev Environments

Use AWS Instance Scheduler or a simple Lambda:

import boto3

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

    # Stop instances tagged with AutoStop=true
    instances = ec2.describe_instances(
        Filters=[
            {'Name': 'tag:AutoStop', 'Values': ['true']},
            {'Name': 'instance-state-name', 'Values': ['running']}
        ]
    )

    for reservation in instances['Reservations']:
        for instance in reservation['Instances']:
            ec2.stop_instances(InstanceIds=[instance['InstanceId']])
Enter fullscreen mode Exit fullscreen mode

Run it at 8pm, start instances at 8am. Save 50%+ on dev instances.

3. Lifecycle Policies

Always set these on S3 buckets:

{
  "Rules": [{
    "ID": "TransitionToIA",
    "Status": "Enabled",
    "Transitions": [{
      "Days": 30,
      "StorageClass": "STANDARD_IA"
    }],
    "Expiration": {
      "Days": 365
    }
  }]
}
Enter fullscreen mode Exit fullscreen mode

Data older than 30 days moves to cheaper storage. Data older than a year gets deleted.

When to Use Tools

DIY works until ~$20K/month. After that, the time spent manually auditing exceeds the cost of tools.

But here's my advice: don't buy dashboards, buy action.

Most FinOps tools tell you what's wrong. Few tell you how to fix it. Even fewer give you the actual code to implement fixes.

That's why we built CloudPruneAI - scan your AWS, get deployable CDK code, not a 50-page PDF.

The Mindset Shift

FinOps isn't a one-time cleanup. It's a habit.

Every time you create a resource, ask:

  • Does this need to run 24/7?
  • What's the right size?
  • When should this be deleted?
  • Is it tagged so we know who owns it?

Build this into your engineering culture, and you'll never need a dedicated FinOps team.

Key Takeaways

  1. 27% of cloud spend is waste - yours is probably similar
  2. 80% of waste is 5 things: zombies, oversizing, logs, storage class, idle DBs
  3. 15 minutes/week is enough for most startups
  4. Automate the basics: budgets, auto-stop, lifecycle policies
  5. Tools should give you action, not just dashboards

Quick Reference

Problem Quick Command
Unattached EBS aws ec2 describe-volumes --filters Name=status,Values=available
Unattached EIPs aws ec2 describe-addresses --query 'Addresses[?AssociationId==null]'
No log retention aws logs describe-log-groups --query 'logGroups[?retentionInDays==null]'
gp2 volumes aws ec2 describe-volumes --filters Name=volume-type,Values=gp2
Stopped instances aws ec2 describe-instances --filters Name=instance-state-name,Values=stopped

What's your biggest cloud cost pain point? Let me know in the comments - I might cover it in a future post.

Top comments (0)