Slavik Shynkarenko

notebook № 145 plates · 14 min to read, longer to play ·

A name on every dollar

On names, tags and fair shares

part 3 of 7 in What the cloud costs · by

A bill nobody owns is a bill nobody fixes. Allocation is the unglamorous work of putting a team’s name on every line: tags, accounts, rules for the costs everyone shares, and a decision about whether the result is a report or a charge. This notebook lets you try each piece and see where the arguments start.

I

plate I · tags and accounts

The unlabelled pile

Every resource on a cloud bill has to belong to someone. Clouds give you two ways to say who. The hierarchy: accounts on AWS, subscriptions and resource groups on Azure, projects on Google Cloud. And tags (labels on Google Cloud): key-value pairs like team=search stuck on each resource.

The hierarchy is the stronger of the two, because a resource can’t exist outside an account, while a tag can be forgotten. Give each team its own accounts and most of the bill allocates itself. Tags then do the finer work: product, environment, cost centre, and everything in the accounts teams share.

What’s left after both is the pile. Rules at ingestion time can clear part of it, mapping names like search-* to a team. The honest measure is coverage by cost, not by count: ninety percent of resources tagged can still leave half the money unexplained, if the untagged ones are the big databases.

Switch the measure from “count” to “cost” with tags only. Then add the account structure.

fig. 14.1~/coveragemethod · measure
Sixty resources of four teams and a shared platform, with made-up costs. A simulation, not a measurement.
II

plate II · governance

Tags that stay put

Tagging campaigns all follow the same curve. Someone sends a spreadsheet of untagged resources, coverage jumps, and six months later it has drifted back, because new resources keep arriving without tags. Coverage is a flow problem, not a cleanup problem.

The fixes that last move the tag to the moment a resource is born. A tag policy rejects deployments without the required tags (AWS tag policies and service control policies, Azure Policy, organisation policies on Google Cloud). Infrastructure as code sets default tags once per module. Inheritance copies a team’s tags from its account or resource group to everything inside.

None of this is a FinOps team’s job alone. It’s a platform decision: the paved road should make the tagged path the easy one, and the reports should point at the few teams still off it.

Run the monthly report alone, then add the deploy gate. Which one is still climbing after a year?

fig. 14.2~/driftinterventions
A simulation of cost-weighted allocation over eighteen months, starting at 58% with 8% of resources replaced each month. The crawl, walk and run lines are the FinOps Foundation’s example targets of 70%, 85% and 90%.
III

plate III · shared costs

Splitting what everyone shares

Some costs have no single owner: the shared Kubernetes platform, the enterprise support fee, the observability stack, the network that connects everything. No tag can fix that. You need a split rule, and every rule has a team that hates it.

An even split is simple and punishes the smallest team. Proportional to direct spend is what most support fees deserve, since the provider prices them as a share of spend anyway. A usage driver, like CPU requested or requests served, is the fairest for a platform, if you can measure the driver. And keeping it central hides the cost from the people who could reduce it.

The rule matters less than two habits: write it down, and apply it the same way every month. Teams accept almost any split they can predict. They fight every split that surprises them.

Try the even split, then look at the web team’s bar. Now switch to the usage driver.

fig. 14.3~/fair-sharesplit rule
Four teams with $100k of direct spend and $30k of shared costs a month: platform cluster $20k, support $6k, observability $4k. Numbers are illustrative.
IV

plate IV · containers

Inside the cluster

A Kubernetes cluster is a shared cost with its own internal economy. The bill shows machines. The teams run pods on them. Tools like OpenCost and Kubecost close the gap by pricing each pod’s slice of the nodes it runs on.

Which slice is the question. A pod requests CPU and memory, which the scheduler reserves whether it’s used or not, and then uses some amount of it. Charging by usage rewards teams that over-request: they reserve the capacity and someone else pays for the idle part. Charging by requests, or by whichever is higher, makes the reservation itself the cost, and that’s what moves teams to rightsize.

Then there’s the capacity nobody requested: spare nodes, headroom, fragmentation. Spread it across teams and they’ll never see it. Leave it with the platform team and idle becomes a number someone owns, and usually shrinks. GPU clusters serving models raise the same question with higher stakes, which notebook 18 picks up.

Allocate by usage and look at the data team. Then switch to requests and keep idle with the platform.

fig. 14.4~/namespacesbasis · idle
One cluster of 100 CPU cores at $10,000 a month, CPU only for simplicity. Real tools weigh CPU, memory, GPU and storage. Numbers are illustrative.
V

plate V · showback and chargeback

A report or a charge

Allocation produces a number per team. What happens next is a choice. Showback sends it to the team as information: here’s what you spent, here’s how it changed. Chargeback books it against the team’s budget, so the money really moves between cost centres.

Chargeback gets attention fast, because a budget line is harder to ignore than a dashboard. It also turns every allocation error into a dispute. A team charged for costs it can’t trace will spend its energy arguing, not optimising.

So the order matters. Showback first, while coverage climbs and the shared rules settle. Chargeback once allocation is high and stable enough that the unexplained part is smaller than anyone’s rounding error. Plenty of mature organisations never switch at all: a trusted showback, read every week, does most of the job.

Set allocation to 70% and switch to chargeback. Then raise it to 95%.

fig. 14.5~/the-bill-landsmodel · accuracy
One team’s monthly statement under each model. Under chargeback the unallocated remainder is spread in proportion to direct spend, a common default. A simulation with illustrative numbers.

Questions people ask

What is a good tag coverage for cloud cost allocation?

Measure coverage by cost, not by resource count, because a few large resources matter more than many small ones. The FinOps Foundation’s maturity examples put allocation at around 70% for a practice starting out, 85% for a developing one and 90% or more for a mature one. The rest is usually shared or untaggable cost handled by split rules.

How do you allocate shared cloud costs?

Pick a rule per shared cost and publish it. Common choices are an even split, a split proportional to each team’s direct spend, a split by a usage driver such as CPU requested or requests served, or keeping the cost central. Usage drivers are the fairest but need data. Proportional splits are simple and good enough for support fees and taxes.

What is the difference between showback and chargeback?

Showback reports each team’s allocated cost without moving money: it informs and builds accountability. Chargeback books the cost against the team’s budget, so it changes behaviour faster but needs accurate, trusted allocation, or every invoice turns into a dispute. Most organisations start with showback and move to chargeback once allocation is high and stable.

Related material

elsewhere in the notebooks

further reading

← the Cloud FinOps series · all notebooks