WRTeam Logo
Let's Chat
WRTEAM
Loading your experience... 0%
24/7 Support Hub
Blog Details

Cloud Cost Optimisation: Why Your AWS or GCP Bill Is Too High



Published on

Category
Documentation
Cloud Cost Optimisation: Why Your AWS or GCP Bill Is Too High

Almost every engineering team has had the same moment: the monthly AWS or GCP invoice arrives, it's higher than last month again, and nobody can point to a single reason why. Usage hasn't doubled. No major new features shipped. Yet the bill keeps climbing.

Cloud cost overrun is rarely caused by one big mistake. It's usually the accumulation of small decisions, each reasonable at the time, that nobody ever revisits. This post covers where that money actually goes, and the specific, practical steps to bring it back down without disrupting your infrastructure.

Why Cloud Costs Creep Up Without Anyone Noticing

Cloud billing has a structural quirk that makes overspend easy: it's usage-based, but "usage" includes resources that are provisioned and idle, not just resources that are actively doing work. A server that's running but receiving no traffic still costs the same as one handling real load.

Combine this with how teams typically operate, provisioning resources is fast and easy, while decommissioning them requires someone to notice, decide it's safe, and take action, and you get a system that's biased toward growth. Nothing actively removes unused resources; someone has to choose to.

Where the Money Actually Goes: 6 Common Sources of Overspend

1. Oversized Instances

The Problem

Instances are often sized based on anticipated peak load, sometimes peak load that was estimated early on and never revisited. If actual usage runs well below that estimate, you're paying for capacity that's rarely, if ever, used.

How to Find It

Both AWS (via Cost Explorer and Compute Optimizer) and GCP (via Recommender) provide built-in tools that compare provisioned resources against actual utilization and flag oversized instances directly. Look specifically at CPU and memory utilization over a 2-4 week window, instances consistently running below 20-30% utilization are strong candidates for downsizing.

The Fix

Downsize incrementally, one tier at a time, and monitor for impact. Most workloads can be right-sized without any noticeable performance change, since the original sizing included generous headroom that was never needed.

2. Idle Non-Production Environments

The Problem

Staging, QA, demo, and development environments often run 24/7, even though they're only used during business hours, and sometimes only a few days a week.

How to Find It

Check the usage patterns of non-production environments specifically. If a staging environment shows near-zero traffic outside 9am-6pm on weekdays, it's running unused roughly 75% of the time.

The Fix

Schedule non-production environments to shut down outside business hours using automation (most cloud providers support scheduled start/stop, or this can be handled with a simple scheduled script). For environments used infrequently, consider spinning them up on-demand rather than running continuously. This single change often produces some of the largest percentage savings of any optimization, because the waste is so consistently 100% during off-hours.

3. Unattached Storage and Orphaned Resources

The Problem

When instances are terminated, their attached storage volumes (EBS volumes on AWS, persistent disks on GCP) often aren't automatically deleted. Over time, these orphaned volumes accumulate, each one billed continuously despite being attached to nothing.

How to Find It

Both platforms allow filtering storage volumes by attachment status. Look for volumes with no attached instance, especially ones that have been unattached for more than a few weeks.

The Fix

Before deleting, snapshot any orphaned volumes that might contain useful data, then delete the volumes themselves. Going forward, configure instance termination settings to automatically delete attached volumes (where appropriate), or set up a recurring audit to catch orphaned resources before they accumulate.

4. Inefficient Data Transfer

The Problem

Data transfer costs, particularly between regions, between cloud providers, or out to the public internet, are often overlooked because they're billed separately from compute and storage, and the per-GB cost looks small until volume scales up.

How to Find It

Review the network/data transfer line items on your bill specifically. Cross-region transfer between services that don't need to be in different regions, or frequent large transfers to external services, are common culprits.

The Fix

Where possible, co-locate services that communicate frequently in the same region. For data that needs to be served externally (e.g., to users), use a CDN, which is typically far cheaper than serving directly from compute instances for high-volume content.

5. Build and CI/CD Infrastructure Costs

The Problem

CI/CD runners, build caches, and artifact storage are easy to overlook in cost reviews because they're "developer tooling" rather than "production infrastructure," but they can represent a significant portion of spend, especially for teams running frequent builds.

How to Find It

Check whether CI/CD runners are sized appropriately for the jobs they run, and whether build artifacts and caches are being cleaned up on a schedule or accumulating indefinitely in storage.

The Fix

Right-size CI/CD runners the same way you would production instances. Set retention policies on build artifacts and caches so old, unused data doesn't accumulate in storage indefinitely. If build volume varies significantly by time of day or week, consider runners that scale down to zero when not in use rather than running continuously.

6. Reserved Capacity Mismatches

The Problem

Reserved instances or committed use discounts (savings plans on AWS, committed use discounts on GCP) offer significant discounts in exchange for committing to usage levels. But if actual usage has changed since the commitment was made, either growing past it or shrinking below it, you can end up paying for commitments that no longer match reality.

How to Find It

Compare your current reserved/committed capacity against actual current usage. Both AWS and GCP provide utilization reports for reserved capacity specifically.

The Fix

If usage has grown past commitments, you're paying on-demand rates for the excess, adjusting commitments upward typically captures additional discount. If usage has shrunk, commitments often can't be canceled but can sometimes be modified or resold (on AWS, via the Reserved Instance Marketplace). Either way, this is worth reviewing whenever usage patterns shift significantly, not just when commitments are first made.

A Practical Approach: The 80/20 of Cloud Cost Review

You don't need to review every line item to make meaningful progress. In most cases, the largest savings come from a small number of areas:

Start with non-production environment scheduling (item 2), since it's typically the fastest to implement and produces immediate, measurable savings. Then move to oversized instances (item 1) using your cloud provider's built-in recommendations, these are designed specifically to surface this issue with minimal manual analysis. Finally, do a one-time sweep for orphaned resources (item 3), which tends to accumulate "free money" that's just sitting on the bill.

These three areas alone often account for the majority of recoverable spend, and none of them require architectural changes or carry meaningful risk to production systems.

Cost Optimization as an Ongoing Process, Not a One-Time Project

The reason cloud costs creep up gradually is the same reason a one-time cleanup doesn't permanently fix the problem: new resources get provisioned, new environments get created, and without ongoing attention, the same patterns re-emerge over months.

The most effective long-term approach is a lightweight recurring review, monthly or quarterly, that checks for the same patterns: new oversized instances, newly idle environments, newly orphaned storage. This doesn't need to be a large effort; often it's a 30-minute review of the same cost reports each month.

Where Cloud Costs Fit Into the Bigger Picture

Cloud cost overrun is often a symptom rather than an isolated issue. Teams with unmanaged cloud costs frequently also show some of the other signs covered in our post on signs your DevOps setup is costing you more than it should, since both tend to stem from the same root cause: nobody owning operational efficiency as an ongoing responsibility.

If you're seeing cost issues alongside other friction, slow pipelines, environment drift, frequent incidents, a broader DevOps audit will likely surface the connections between them, and often reveal that fixing one improves the others.

WRTeam's DevOps Services Banner Image

Share :
✦YOUR QUESTION, ANSWERED✦

Clear, Honest Answers for Your Peace of Mind

Cloud costs rise gradually because usage-based billing charges for provisioned resources, not just active ones. An idle server costs the same as one under full load.

The most common compounding factors include:

  • Instances sized for peak loads that never materialised

  • Non-production environments running 24/7 when only used during business hours

  • Orphaned storage volumes left behind after instance termination

  • Data transfer costs accumulating at scale across regions

  • CI/CD build artifacts and caches growing without retention policies

  • Reserved capacity commitments that no longer match actual usage

Each of these is a small, reasonable decision at the time. None gets revisited unless someone actively looks for it.

Oversized instances are virtual machines provisioned for anticipated peak load but running well below that capacity in practice. You pay for compute resources that are rarely or never fully used.

To identify them, use built-in cloud tooling:

  • AWS: Cost Explorer and Compute Optimizer

  • GCP: Recommender

Review CPU and memory utilisation over a 2 to 4 week window. Instances consistently running below 20 to 30% utilisation are strong candidates for downsizing. The original sizing typically included generous headroom that real workloads never required, making downsizing safe in most cases.

Non-production environments (staging, QA, demo, dev) typically run 24/7 but are only used during business hours, meaning they sit idle for approximately 75% of the time. Scheduling automated shutdowns outside 9am to 6pm on weekdays eliminates that waste entirely.

This is one of the highest-percentage savings available because the waste during off-hours is essentially 100%. Most cloud providers support scheduled start/stop natively, or it can be handled with a lightweight scheduled script. For environments used only occasionally, spinning them up on demand rather than running continuously produces additional savings with no workflow disruption.

Orphaned resources are provisioned assets (most commonly storage volumes) that remain active and billable after the instances they were attached to have been terminated. On AWS these are EBS volumes; on GCP they are persistent disks.

They accumulate because cloud platforms do not automatically delete attached storage when an instance is terminated. Provisioning is fast and easy; decommissioning requires someone to notice the problem and take deliberate action. Without a recurring audit or automated deletion policy, orphaned volumes build up quietly on the invoice month after month.

To address them, filter storage by attachment status, snapshot anything that might contain useful data, then delete. Configure termination settings to auto-delete volumes going forward where appropriate.

Data transfer costs are billed separately from compute and storage, and the per-GB rate looks negligible until traffic volume scales. Teams reviewing compute and storage line items often miss data transfer entirely because it appears in a different section of the invoice.

Costs become significant when:

  • Services communicate frequently across regions that don't require regional separation

  • Large datasets are transferred regularly to external services

  • High-volume content is served directly from compute instances rather than a CDN

The practical fix is to co-locate services that communicate frequently within the same region, and use a CDN for external content delivery, which is substantially cheaper than compute-served responses at scale.

CI/CD infrastructure is often treated as developer tooling rather than production infrastructure, so it receives less cost scrutiny. However, build runners, caches, and artifact storage can represent a significant share of total cloud spend, particularly for teams running frequent or parallel builds.

Common issues include:

  • Runners sized larger than the jobs they execute require

  • Build artifacts and caches accumulating in storage without expiry policies

  • Runners running continuously rather than scaling to zero during idle periods

Right-sizing runners follow the same logic as right-sizing production instances. Setting retention policies on artifacts and caches prevents indefinite storage growth. Where build volume is uneven across the day or week, runners that scale to zero during inactivity eliminate continuous idle spend.

Reserved instances (AWS) and committed use discounts (GCP) are pre-purchase arrangements where you commit to a usage level in exchange for a significant discount over on-demand rates. The risk is that the commitment becomes misaligned with actual usage over time.

Two failure modes are common:

  • Usage grows past the committed level, so the excess is charged at full on-demand rates and the additional discount opportunity is missed

  • Usage shrinks below the committed level, so you pay for capacity you are no longer using

Both platforms provide utilisation reports specifically for reserved capacity. If usage has grown, increasing commitments captures additional savings. If usage has shrunk, commitments often cannot be cancelled but may be modified or resold (AWS offers a Reserved Instance Marketplace for this). This should be reviewed whenever usage patterns shift, not only at commitment renewal.

The 80/20 principle applies clearly to cloud cost reduction. Three areas account for the majority of recoverable spend and carry minimal risk to production systems.

Start with:

  1. Non-production environment scheduling: fastest to implement, produces immediate measurable savings, no production impact

  2. Oversized instance right-sizing: use cloud provider recommendations (Compute Optimizer on AWS, Recommender on GCP) to surface candidates with minimal manual analysis

  3. Orphaned resource cleanup: a one-time sweep for unattached volumes and unused assets that have been silently accumulating

These three actions do not require architectural changes, do not affect production stability, and together typically address the majority of avoidable overspend.

A one-time cleanup does not permanently resolve cloud cost creep because the conditions that caused it continue to exist. New resources get provisioned, new environments get created, and without recurring attention the same patterns re-emerge within months.

The most effective approach is a lightweight recurring review, monthly or quarterly, that checks for the same patterns each cycle:

  • Newly oversized instances

  • Newly idle or always-on non-production environments

  • Newly orphaned storage volumes

This does not need to be a significant time investment. A 30-minute review of the same cost reports each month is sufficient to catch issues before they compound. The key is that someone owns this as an ongoing operational responsibility rather than a project with a completion date.

Cloud cost overrun is frequently a symptom of a wider operational gap: no single person or team owns infrastructure efficiency as an ongoing responsibility.

Teams with unmanaged cloud costs tend to show related signs in other areas, including slow CI/CD pipelines, environment drift between staging and production, and recurring incidents that could be prevented. These issues share the same root cause: operational hygiene is treated as a project to complete rather than a discipline to maintain.

If cost problems appear alongside other infrastructure friction, a broader DevOps audit will often surface how these issues are connected. Addressing the underlying ownership and process gaps typically improves cost, reliability, and delivery speed together rather than in isolation.

✦RELATED BLOGS✦

Explore More Insights on Technology, Design & AI Trends