Cloud infrastructure cost optimization: AWS, GCP, Azure

The cloud bill grows faster than the workload: some resources sit idle, and no one knows exactly where the budget is going. We set up cost management turnkey — audit, blueprint, policies, and results validation. After setup, redundant resources are reduced, and costs stop growing along with traffic.

Our competencies:

Frequently Asked Questions

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1365
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1330
  • B2B Advance company logo design
    B2B Advance company logo design
    776
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1077
  • AIDER company logo development
    AIDER company logo development
    1022
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1113

Why cloud cost optimization produces no effect

The cloud bill grows faster than the workload—this is the first sign that cloud cost optimization was driven by reports rather than by the infrastructure.

Idle resources are almost invisible in the console: disks from deleted environments, snapshots from six months ago, test clusters for tasks that were closed a month ago.

Overgrown infrastructure is usually older than its documentation. Environment copies multiply for every revision, they have no owner or unified tags, so the question “who pays and for what” is answered not by architecture but by the bill.

Changes are made by hand directly in the AWS console or through personal access—the description diverges from the actual state, and the configuration can be returned to its original state only by remembering what exactly was changed.

Cost growth without load growth is masked as normal operation: autoscaling keeps redundant copies, traffic between availability zones is billed separately, and no one reviews reserved capacity.

Bottlenecks in the cloud rarely lie in one place—they are distributed across environments, and each one individually looks justified.

So we break down how this is closed: resource inventory by tags, an owner for each environment, changes only through infrastructure description in the repository.

Measurable effect: deployment speed, failures, downtime

The effect of optimization is visible not in the monthly bill but in engineering metrics. We take them before and after the work—on the same set of services, using the same methodology and over the same period: otherwise a seasonal decline is easy to mistake for a result.

  • Release deployment time. The artifact cache persists between runs, unchanged layers are not rebuilt, and services are deployed in parallel. Deployment drops from tens of minutes to single digits, and a release stops being a half-day event.
  • Failure rate and recovery time. Checks at the deployment stage catch incompatible changes before production, and the infrastructure description in Terraform provides reproducible rollback: failed deployments are several times fewer, and return to a working version takes minutes, not a rebuild from scratch.
  • Share of idle resources. Autoscaling based on actual load and schedules for test environments remove machines that are billed but do not serve requests. Usually this is half the fleet; after configuration, it is single-digit percentages.
  • Workload predictability. We set CPU and memory limits and requests based on the service’s real profile: it is clear which component will hit its limit first, and traffic growth stops being a surprise.
  • Peak resilience. Reserved capacity and a request queue absorb seasonal spikes without manual intervention: the peak passes on the standard configuration, and after the downturn resources return to the shared pool.

We confirm each item with a chart from monitoring systems—before and after, with a note of which configuration change produced the jump.

Cost management modes: comparison of approaches

Cloud cost management modes differ not by tools but by how predictable the workload is and who decides on capacity. Manual control leaves it to a person, autoscaling reacts to metrics, and capacity reservation locks in payment for a long-term commitment.

The choice comes down to how much of the workload can be predicted and how much will have to be covered on the fly.

Mode When it fits Limitations
Manual control Stable workload profile, small infrastructure, infrequent releases Slow response to growth, spare capacity sits idle during quiet hours, result depends on team discipline
Autoscaling Variable workload, services with queues, daily and weekly peaks Delay in reacting to a spike, extra nodes at threshold boundaries, a metric error causes overspend
Capacity reservation A stable core that does not change for months Payment commitment if workload drops, reduced flexibility when architecture changes
Hybrid mode A permanent core plus a variable part and non-production environments Requires resource tagging, regular coverage recalculation, and an owner for the budget model

A hybrid is assembled like this: the core is covered by reservation, peaks are given to autoscaling, and test and staging environments are shut down on a schedule.

There is one limitation here—without unified resource tagging and an owner responsible for reviewing coverage, the mode quickly slides back to manual.

Work sequence: audit, diagram, configuration, verification

Cloud cost optimization is not a one-time cleanup but a sequence: any change to a rate, limit, or scaling rule can bring down production. Therefore, we first record the actual state, then make changes—and confirm each step with metrics. The work sequence looks like this.

  1. Infrastructure audit — we build a resource map: machines, disks and snapshots, load balancers, image registries, databases and queues. We reconcile the list with consumption metrics over several months: this reveals idle nodes and resources forgotten after experiments.
  2. Infrastructure diagram — a dependency graph: who exchanges traffic with whom, where the shared cache and storage are, which services duplicate each other. Without this diagram, disabling “extra” components breaks the neighboring environment.
  3. Change plan — we rank changes by effect-to-risk ratio: first what delivers volume without affecting production, then everything that requires a maintenance window.
  4. Rate modes and storage — we move the stable base to reservation, leave the variable part on demand; cold data moves to cheaper storage classes.
  5. Limit configuration — quotas for teams and environments, autoscaling thresholds with protection against runaway scaling, lifecycle rules: the last N images and snapshots are kept, the rest is cleaned up.
  6. Load testing — a real traffic profile: scaling triggers on time, limits do not cut peaks, fault tolerance is preserved when a node goes down. Plus alerts for cost deviation from planned dynamics.
  7. Handover to support — dashboards, change procedures, documentation and team training. The customer sees what they are paying for and maintains the mode independently.

Access policies, diagrams and maintenance procedures

Infrastructure without documentation depends on the people who built it: an engineer leaves—and no one knows why a node is configured exactly that way.

Therefore, we hand over a set of artifacts that lets an environment be brought up from scratch, a new specialist gets up to speed in days, and a security review passes without hunting for answers in chat threads. Each document is tied to the actual state and updated along with it.

  • Access policies — roles and permission boundaries on the principle of least privilege, separation of human and service accounts, lifetimes of temporary accesses and key rotation.
  • Configuration description — declarative manifests for the entire infrastructure in a version control system: networks, load balancers, databases, storages, autoscaling rules. Changes go through review rather than being made by hand in the console.
  • Infrastructure diagrams — service connections, data flows, external dependencies, failure points and network segment boundaries. They are used to localize failures and assess the impact of changes.
  • Maintenance procedures — update windows, rollout and rollback procedures, backup policies, recovery testing, secret rotation, change accounting.
  • On-call instructions — step-by-step scenarios for each alert: what to check, which metrics to capture, which threshold to consider degradation, and when to escalate.
  • Tag map and reporting — rules for attributing resources to teams and products so that costs are allocated to owners and deviations are found before the end of the month.

The set remains with the customer along with accesses and rights to the repositories—it can be used without us. We hold a walkthrough with the team: we go through each item and answer questions while the context is fresh.

Case study: infrastructure analysis, metrics before and after

The client came with the task “add capacity”: a platform of 40+ services, three environments, and highly uneven daily traffic. Engineers were hitting limits on peaks and asked for a new pool of machines, although consumption measurements did not confirm this.

What the measurements showed

We captured metrics for 30 days: average CPU utilization stayed at 12–14% despite the stated shortage, the share of idle resources was 38%—test environments running around the clock, disk snapshots older than a year, detached volumes.

Autoscaling was configured based on the daily average, so it constantly kept a reserve for peak rather than for actual load.

What we changed and what the result was

Machine sizes were selected based on the 95th percentile of actual consumption instead of peak, autoscaling was switched to target utilization and request queue length, and the baseline part of the load was covered by reserved resources.

Lifecycle rules were enabled for images and snapshots, and all resources were tagged by teams and products—it became clear who exactly was creating new volumes.

Implementation result: idle share decreased from 38% to 9%, working machine utilization increased to 62–68%, release deployment was reduced from 40 to 9 minutes, and the deployment failure rate—from 6% to 0.3%. Product load grew 2.4 times with the same number of compute units.

Metrics before and after were calculated using the same methodology—utilization, idle share, and specific load per compute unit according to FinOps Foundation—so the comparison was fair.

What to do if the infrastructure is already deployed and growing

A deployed environment grows faster than its description: resources are created for a task and not deleted, tagging is lost, and some machines and volumes sit idle.

Therefore, we start not with shutdowns but with inventory—using cloud provider logs, consumption metrics, and access rights, we build a picture: what is running, by whom, why, and how long it has been unused. We do not stop anything at this stage.

Next, resources are tagged: owner, environment, service, lifetime. This is what makes costs manageable—it is clear which workload drives them and which machines are kept just in case. Idle volumes, old snapshots and images are handled by retention rules rather than manual checks.

Growing load hits account limits and quotas before it hits performance.

They are raised in advance: increases are requested based on growth forecasts, quotas are distributed between projects, and notifications are set for approaching the threshold—otherwise scaling fails at the moment of peak.

We build a migration without service downtime in stages: changes go through configuration rather than edits on live machines, are applied one service at a time, traffic is switched gradually, and rollback is a single operation. Business-sensitive operations are scheduled for low-load windows.

The cycle is closed by a process: tagging rules, resource owners, periodic review, and a report on deviations from the plan. Then costs grow together with the load, not faster than it.

Technical doubts: common engineer questions

Technical doubts at the start are almost always the same: will optimization coexist with the current stack, who is responsible for the data, what to do with infrastructure that we did not deploy, and how to roll back changes. Below are direct answers without generalities.

Will this work with our current stack?

We do not rewrite what already works. The first step is inventory: we reconcile the resource description with the actual state and import existing objects into the description without deleting them. Then changes proceed one module at a time, with a plan and verification in a test environment.

Who is responsible for our data?

At the start, access is granted only for reading metadata—we do not touch storage contents. Then come roles with least privilege, short-lived keys, and logging of all actions in cloud audit, so you retain a full trail. No export outside your environment is performed.

What if you did not deploy the infrastructure and there is no description?

The absence of a description is not a blocker. We reconstruct it from the actual state: we mark unaccounted resources, separate working ones from abandoned ones, and record dependencies.

Before deletion, we take a backup or volume snapshot, and questionable objects are first moved to observation mode.

How long does it take and can it be rolled back?

The first measurable results—a picture of costs by teams and projects, shutdown of idle resources—are visible in the first weeks. Every change goes through review and has a rollback plan: returning to the previous description takes minutes, not hours.

Let’s discuss the task and come back with an estimate and plan

To discuss a cloud cost optimization task concretely, there is no need to prepare years of exports or grant full access to accounts.

An assessment of the infrastructure state at the level where the bill structure and load distribution are visible is enough—this is sufficient to understand which services are becoming more expensive without benefiting the product.

What is useful to send at the first step:

  • A list of accounts, projects and subscriptions mapped to teams or products—without it, costs cannot be allocated to owners.
  • An export of bills for the last complete periods broken down by service: compute, storage, network, managed databases.
  • A diagram of environments and connections between services: what exchanges data with what and where external channels run.

This is enough to come back with an estimate and plan: we will show where costs diverge from load and in what order to shut down idle resources. The scope and volume of work are determined individually for your infrastructure.