Where Small-Business Cloud Spend Actually Leaks

Six places money quietly drains from AWS, Azure and Google Cloud bills.

A cloud bill at a 40-person company usually grows a few percent a month without anyone deciding to spend more. No new customers, no new features, and the invoice is meaningfully higher than it was in the spring. When we go looking, the money is almost never where people expect. The web servers everyone worries about are usually fine. The leaks are in storage that can only grow, test environments running all night, traffic billed twice on its way out, and a reservation that expired quietly in March. Here is where to look, roughly in the order that pays back fastest.

Where Small-Business Cloud Spend Actually Leaks

1. Oversized Compute And The CPU Trap

Rightsizing is the least glamorous item on this list and it usually returns the most money per hour of effort. Every cloud has a recommender: AWS Compute Optimizer, Azure Advisor, and Google Cloud's rightsizing recommendations in Active Assist. All of them are worth reading. None should be applied blindly. On EC2, memory usage is not collected by default, so unless the CloudWatch agent is installed, recommendations are built from CPU, network and disk alone. A machine sitting at 4% CPU with 90% of its RAM in use is not a downsizing candidate, and acting on that advice will page someone at three in the morning.

The other half of compute waste is resources that exist without doing anything useful. These rarely appear as one alarming line item. They appear as forty small ones. Open Cost Explorer or Azure Cost Analysis, group a single month by usage type, and most of them surface within ten minutes.

  • Stopped is not free. A stopped EC2 or Azure VM releases the compute charge, but the attached disk keeps billing at full rate every hour. Ten stopped dev boxes with 200 GB volumes are still a real monthly number.
  • Unattached public IPv4 addresses. AWS now charges roughly $0.005 per hour for every public IPv4 address, in use or not — about $3.65 a month each. Twenty leftover Elastic IPs from a decommissioned project is real money for nothing.
  • gp2 to gp3. gp3 volumes are around 20% cheaper per GB than gp2 and include 3,000 IOPS and 125 MB/s of baseline throughput. The type change is an online operation with no downtime.
  • Old instance generations. Moving m5 to m6i, or to Graviton where your stack supports ARM, is usually cheaper per hour and faster at the same time. Containerised and managed-runtime workloads move easily; anything with compiled native dependencies needs testing.
  • Load balancers with no healthy targets. An idle Application Load Balancer costs roughly $16 a month before it carries a single request. Test environments accumulate them quietly.

2. Databases And The Storage Ratchet

The largest single surprise on most SMB bills is a database. Amazon RDS allocated storage can be increased and can never be decreased. If a runaway job filled the disk once last year and storage autoscaling pushed a 100 GB instance to 600 GB, you are paying for 600 GB today and will keep paying until someone dumps and restores into a fresh instance. Cloud SQL and Azure SQL have their own versions of the same ratchet. Compare allocated storage against actual used storage on every database you run. The gap is frequently hundreds of gigabytes.

Then look at the options bolted onto those instances. Multi-AZ roughly doubles the instance cost and is often switched on for staging because someone copied production's settings. Provisioned IOPS (io1 or io2) bills per IOPS per month on top of storage, and most workloads under a few hundred gigabytes do not need it — gp3 is enough. If you run Aurora and I/O requests exceed roughly a quarter of your Aurora spend, Aurora I/O-Optimized trades a higher instance and storage rate for zero per-request charges and usually wins. On Azure, check whether Hybrid Benefit applies to your SQL Server and Windows licences before paying licence-included rates.

3. Non-Production Runs 168 Hours A Week

A week has 168 hours. A development team actively uses its test environment for about 50 of them. You pay for the other 118. Shutting non-production down on evenings and weekends removes roughly 70% of that environment's compute cost, and every cloud ships the scheduling natively. Azure VMs have auto-shutdown directly on the VM blade plus Start/Stop VMs v2 in Automation. Google Compute Engine has instance schedules as a resource policy. AWS has EventBridge Scheduler with a small Lambda, or the packaged Instance Scheduler solution. None of this requires buying a third-party tool.

Two things stop people, and both are worth naming. First, restarts expose fragility: a service that was only ever started by hand, a hardcoded private IP that changes, a licence check that objects to new hardware. Finding that on a Tuesday morning in dev is far better than finding it during a real incident. Second, RDS and Aurora instances that you stop are automatically restarted by AWS after seven days, so a database schedule has to stop them on a recurring basis rather than once. For genuinely intermittent dev databases, Aurora Serverless v2 can now scale down to zero capacity, which is a cleaner answer than scheduling at all.

4. Traffic You Pay For Twice

Data transfer is the line item people understand least, because it does not map to anything visible in a console. The most common leak works like this: instances in private subnets reach the outside world through a NAT Gateway, which in US regions costs roughly $0.045 an hour simply to exist, plus roughly the same again per gigabyte processed. Traffic to an S3 bucket in the same region still routes through it and gets metered. Adding a gateway VPC endpoint for S3 and DynamoDB keeps that traffic inside the VPC and costs nothing at all. It is a ten-minute change and one of the most common things we find missing.

Interface endpoints for other services are a different story, at roughly $0.01 per hour per availability zone each plus a per-GB charge, so enabling thirty of them because endpoints sound like good practice makes the bill worse. Elsewhere: cross-AZ traffic in AWS is $0.01 per GB in each direction, which adds up fast when chatty services or a Kafka cluster spread across three zones. Do not fix that by collapsing into a single AZ — use topology-aware routing and keep the resilience. And serving static assets through CloudFront is often cheaper than serving from S3 directly, because S3-to-CloudFront transfer is free and CloudFront's per-GB rate falls with volume.

  • CloudWatch Logs retention defaults to Never Expire. Ingestion runs around $0.50 per GB and storage keeps billing indefinitely. Setting 30 or 90 day retention on chatty log groups is a single setting per group.
  • Debug logging left switched on. One service logging every request at debug level after a troubleshooting session can quietly become your largest observability line item.
  • High-cardinality custom metrics. Per-metric pricing in CloudWatch, and per-custom-metric pricing in tools like Datadog, punishes tagging metrics with user IDs, request IDs or pod names.
  • Cross-region backup copies. Replicating snapshots to a second region is sensible for DR and charges both transfer and duplicate storage. Make sure it is a decision rather than a default someone ticked.

5. Commitments: Coverage Versus Utilization

Reserved capacity is where companies lose money in both directions. Two different numbers matter and they get conflated constantly. Utilization tells you whether you are using what you already bought — 100% looks reassuring and says nothing about whether you bought enough. Coverage tells you what share of eligible on-demand usage sits under a commitment. A business showing 100% utilization and 35% coverage is paying full retail for two-thirds of its steady-state compute. Both figures are available in AWS Cost Explorer, Azure Cost Management, and Google Cloud's commitment analysis reports, and both deserve a quarterly look.

One-year commitments expire without ceremony. The notification goes to whichever address configured it, and the bill simply steps up the following month. Put every expiry date in a shared calendar. On what to buy: AWS Compute Savings Plans flex across instance family, size, region, and even Fargate and Lambda, at a smaller discount than EC2 Instance Savings Plans, which lock you to a family and region. Savings Plans do not cover RDS, ElastiCache, OpenSearch or Redshift. Those still need Reserved Instances, and databases are precisely the workload that stays where it is for three years.

The guiding rule is to cover the floor rather than the peak. Commit to the baseline you would still be running if you lost your largest customer, and leave everything above that on demand. While the business is still changing shape, one-year terms at a smaller discount are usually the better risk position than three-year terms you may have to work around. A commitment you regret is more expensive than a discount you skipped.

6. Making The Savings Stay Saved

None of this holds unless someone owns the number. Start with cost allocation tags, and know that they must be activated in the billing console before they appear in Cost Explorer, and that activation is not retroactive — tags applied today will not label last quarter's spend. Three tags are plenty: environment, owner, and service. Enforce them with AWS Organizations tag policies, Azure Policy, or organisation policy constraints in GCP, so untagged resources become the exception rather than the majority.

Then switch on the free alarms. AWS Cost Anomaly Detection, anomaly alerts in Azure Cost Management, and GCP budget alerts wired to a Pub/Sub topic all catch the forgotten GPU instance or the accidental cross-region replication within a day or two, rather than at the end of the month. Finally, book thirty minutes a month for one person to review the top ten line items and the month-over-month delta. Do not chase everything: an engineer's hour costs more than most eight-dollar-a-month savings, and cost work that is not worth doing gets abandoned.

Where This Leaves You

Most of what is above is a few hours of work rather than a project, and it does not require re-architecting anything. We look at these items first when we take over managed services for a new client, because the architecture that got a business onto the cloud is rarely the one it should still be paying for a year later. If your bill has been drifting upward and nobody can say exactly why, that is a solvable problem, and the answer is usually four or five specific line items rather than a rebuild.

Cloudology helps small and mid-sized teams with cloud migration, managed operations, and platform engineering. If any of the above sounds like your week, get in touch.