Cloud cost used to be a finance problem. Engineering teams built features; finance teams paid the bills; the two rarely talked. That model breaks down at scale. A single misconfigured autoscaling policy, an unindexed database query running at high frequency, or a forgotten development cluster can generate thousands of dollars of unexpected spend before anyone notices. When a misconfiguration silently accrues cost, the organization loses money without a trace, and the root cause becomes buried in production code.
FinOps, the practice of bringing financial accountability to cloud spending, is increasingly an engineering discipline, not just a procurement one. The most mature organizations treat cost as a firstâclass engineering metric alongside latency, error rate, and availability.
Why Cost Belongs in Engineering
The argument is straightforward: engineers make the decisions that determine cloud cost. Which instance type to use, whether to cache a result, how long to retain logs, whether to use a managed service or run your own, these are engineering decisions with direct cost consequences. If engineers do not see cost signals, they cannot make costâaware decisions.
The traditional model, engineers build, finance reviews the bill at month end, has a feedback loop measured in weeks. By the time a cost anomaly appears in a monthly report, the code that caused it has been in production for weeks and may be deeply embedded in the system. This delay can lead to significant financial losses because the offending component continues to run unchecked, and it makes pinpointing the root cause difficult since the original change may be obscured by subsequent deployments.
The FinOps model closes that loop: cost data flows into engineering dashboards, CI pipelines, and onâcall runbooks in near realâtime, so engineers can see the cost impact of their decisions and act on anomalies quickly. This immediate visibility allows teams to address issues promptly, reducing the overall cost of the project and improving the efficiency of the engineering process.
Cost Attribution: Knowing What Costs What
The prerequisite for costâaware engineering is attribution, knowing which service, team, or feature is responsible for which spend. Without attribution, cost data is an aggregate number that no one can act on.
Attribution is implemented through tagging. Every cloud resource, EC2 instance, RDS database, S3 bucket, Lambda function, should carry tags that identify the owning team, the service, the environment, and the cost center.
# Terraform: enforce cost attribution tags on all resources
resource "aws_instance" "api_server" {
ami = var.ami_id
instance_type = "t3.medium"
tags = {
Team = "commerce"
Service = "order-api"
Environment = "production"
CostCenter = "eng-commerce"
ManagedBy = "terraform"
}
}
Tagging discipline is harder than it sounds. Resources created manually, resources created by thirdâparty tools, and resources created by autoâscaling policies often lack tags. Tools such as AWS Tag Editor, Azure Policy, and GCP Resource Manager can enforce tagging at the policy level, rejecting resource creation if required tags are missing. This enforcement guarantees that every resource is properly labeled and that cost data can be accurately attributed to its owner.
Cost SLOs: Treating Spend Like a Service Level
A Service Level Objective (SLO) defines an acceptable range for a service metric. Error rate SLOs say âwe will have fewer than 0.1âŻ% errors.â Latency SLOs say â99th percentile latency will be under 500âŻms.â Cost SLOs apply the same discipline to spending: âthis service will cost less than $X per 1,000 requests.â
Cost SLOs are most useful when normalized to a business metric, cost per request, cost per user, cost per transaction, rather than expressed as an absolute dollar amount. An absolute budget does not distinguish between âwe spent more because traffic grewâ and âwe spent more because something is inefficient.â Normalization lets us see whether the price per unit of work is drifting upward, which signals an inefficiency that needs correction.
Cost SLO example:
Service: order-api
Metric: cost per 1,000 orders processed
Target: < $0.85 per 1,000 orders
Alert threshold: > $1.10 per 1,000 orders (30% above target)
Breach response: engineering investigation within 24 hours
When a cost SLO is breached, the response is the same as for a latency or error SLO: investigate, identify the cause, and fix it. Common causes include:
- a new feature that makes more API calls than expected;
- a query that became unindexed after a schema change;
- a caching layer that stopped working;
- an autoscaling policy that is not scaling down correctly; or
- a data transfer pattern that is generating unexpected egress costs.
Cost in CI/CD: Shifting Left
Cost signals can be integrated into the CI/CD pipeline to catch expensive changes before they reach production. Two approaches are practical today:
Infrastructure cost estimation. Tools such as Infracost analyze Terraform plans and estimate the monthly cost of the proposed infrastructure change. This can be posted as a PR comment, making cost visible at review time.
# GitHub Actions: post cost estimate on every Terraform PR
- name: Run Infracost
uses: infracost/actions/setup@v2
with:
api-key: ${{ secrets.INFRACOST_API_KEY }}
- name: Generate cost estimate
run: infracost diff --path=. --format=json --out-file=/tmp/infracost.json
- name: Post PR comment
uses: infracost/actions/comment@v2
with:
path: /tmp/infracost.json
behavior: update
Load test cost profiling. Running a load test against a staging environment and measuring the cost per request gives a baseline that can be compared against previous releases. A release that doubles cost per request is a signal worth investigating before it reaches production.
OpenCost and Kubernetes Cost Visibility
In Kubernetes environments, cost attribution is harder because multiple services share nodes. OpenCost is a CNCF project that provides realâtime cost allocation for Kubernetes workloads, breaking down spend by namespace, deployment, pod, and label.
# Query OpenCost API for cost by namespace
curl http://localhost:9003/allocation/compute \
-G \
--data-urlencode 'window=7d' \
--data-urlencode 'aggregate=namespace' \
--data-urlencode 'accumulate=true'
OpenCost integrates with Grafana, allowing cost dashboards to sit alongside latency and error dashboards, making cost a firstâclass signal in the same observability stack.
The FinOps Maturity Model
The FinOps Foundation defines three maturity stages:
Crawl: basic cost visibility. Teams can see their cloud bill broken down by service and account. Tagging is inconsistent. Cost reviews happen monthly.
Walk: cost attribution by team and service. Anomaly alerts exist. Engineers have access to cost dashboards. Cost is discussed in sprint reviews.
Run: cost SLOs defined and monitored. Cost signals in CI/CD. Cost per business metric tracked. Engineers treat cost optimization as a normal part of their work, not a special project.
Most organizations are at the crawl or early walk stage. The jump to walk, consistent tagging, teamâlevel attribution, nearârealâtime dashboards, is the highestâleverage investment because it creates the data foundation that every later optimization depends on. With clear, timely cost signals in hand, teams can shift from reacting to cost spikes to proactively shaping their architecture for efficiency.
What Not to Do
Optimize prematurely. Cost optimization that makes code harder to understand or maintain is usually not worth it. The right time to optimize is when a cost SLO is breached or when a specific component is identified as disproportionately expensive.
Treat cost as a constraint, not a signal. A hard budget cap that blocks deployments is a blunt instrument. Cost signals that inform engineering decisions are more useful than limits that simply stop work.
Ignore egress costs. Data transfer between cloud regions, between availability zones, and out to the internet is often the largest unexpected cost in distributed systems. Egress costs are invisible until they appear on the bill, making them a priority for attribution and monitoring.
The Connection Between Cost Visibility and Engineering Culture
Cost SLOs and dashboards are tools, but the underlying shift is cultural. Engineers who never see cost data cannot develop cost intuition. They make reasonableâseeming decisions, choosing a managed service for convenience, retaining logs indefinitely, running dev environments around the clock, without knowing the cost consequences. Over time, this leads to a culture where cost awareness is an afterthought rather than an integral part of the engineering process.
The goal of FinOps in engineering is not to make engineers into accountants. It is to give them enough signal that cost becomes a natural consideration alongside performance and reliability. A team that has seen a cost SLO breach, investigated it, and fixed it has internalized something that no amount of documentation can teach: infrastructure choices have financial consequences, and those consequences are their responsibility to understand.
This is why the maturity model matters. The crawl stage (basic visibility) is not just a stepping stone to the run stage (cost SLOs, CI integration). It is the stage where engineers first encounter cost as a signal rather than a bill. That encounter changes how they think about the decisions they make every day, fostering a more costâconscious and efficient engineering culture.

Comments (0)
Please sign in to leave a comment