This note is not a FinOps-platform pitch. It is the arithmetic we do when someone forwards last month’s Cost Explorer and asks whether they should panic. Sometimes the answer is no: the bill is the product. That has to be a possible ending; if it is not, the rest of this is an advertorial.
Finance searched “why is my AWS bill so high” and landed on a dashboard vendor. The screenshot has thirty lines and no owners. The 29% they keep quoting is real. It is also not a line item. You cannot delete “waste”. You can delete a NAT, a log group, a cluster that should have been one.
The 29% is a survey, not your invoice
The Flexera 2026 State of the Cloud Report, fifteenth edition, surveys 753 cloud decision-makers. Estimated wasted IaaS and PaaS spend ticks up to 29%, the first rise in five years, after falling from a high of 32%. Flexera blames AI cost complexity and new IaaS/PaaS services. Wasted cloud software spend inches up one point. Fewer than half of organisations use any one commitment discount per provider: 45% take AWS Reserved Instances.
That is a survey mean. It is not a diagnosis of your account. Large enterprises in the same report spend more than $5 million a month; SMBs concentrate below $50,000. If you run a 15–60 person product company, your invoice is not that. The percentages can be borrowed. The millions cannot.
Three working bills, Europe, eu-west-1 (Ireland) unless noted. AWS list prices in USD, converted at $1 = €0.92, September 2026, 730 hours a month. Spanish VAT (21%) sits on top and does not move the ratios. If your account invoices in dollars, use the dollars; the question does not change.
| Working bill | Per month, ex-VAT | 29% | Per year |
|---|---|---|---|
| Small SaaS, one serious environment | €4,000 | €1,160 | €13,900 |
| Product company, 20–40 people, EKS | €8,500 | €2,465 | €29,600 |
| Several clusters, paid observability | €18,000 | €5,220 | €62,600 |
€29,600 a year, on the middle row, is more than a third of year-2 loaded cost of a senior platform engineer in Spain — the arithmetic for that hire is in hire a platform engineer, or outsource it. It is not an argument for posting a job. It is the size of the hole you are calling “the cloud”.
Azure and GCP move the percentages by a few points. The lines do not: idle nodes, forgotten disks, the NAT equivalent, logs with no retention. Substitute the SKU names. Do not substitute the question.
Why the bill jumped
Nobody approves 40%. They approve a staging cluster “like production”, a NAT per AZ because the tutorial had one, a log group with no retention because the default is infinite, and an EKS version nobody upgraded. Twelve months later finance asks. The honest answer — “it has no owner” — does not fit in a committee.
Flexera’s rise this year is not magic. Generative AI is the third most-used public cloud service in that survey, at 58%. A Bedrock line, a GPU line or a warehouse that feeds a model is not waste because it is large. It is waste if nobody can say which product produces it. Telling those two apart is the job. A dashboard that paints both orange does not do it.
The seven lines that exist at zero traffic
Before you “rightsize instances”, name what bills even if nobody uses the product. That is the part of the invoice you can count from list prices, with no telemetry, on a Tuesday afternoon.
NAT Gateway
AWS charges for every hour the NAT is provisioned, plus per-GB processing, plus standard transfer. The published example on VPC pricing is $0.045/hour and $0.045/GB in us-east-1. Ireland list is typically $0.048/hour. At 730 hours: about €32 a month per gateway before a single byte. The three-AZ pattern — the “high availability” tutorial — is about €96 a month of existence. The gigabyte that goes to S3 or ECR through that NAT is charged again; a gateway-type VPC endpoint for S3 and DynamoDB has no hourly or processing charge.
The EKS control plane
Per EKS pricing, standard version support is $0.10 per cluster per hour: about €67 a month. Extended support — once the Kubernetes version has left the 14-month standard window — is $0.60/hour: about €403 a month per cluster, six times more, without anybody adding a pod. Three clusters (prod, staging, dev) on standard are €201 a month of control plane before a node. The one that stayed on 1.28 and nobody touched is a silent mortgage.
| EKS control plane, 730 h | AWS list | ≈ € / month |
|---|---|---|
| Standard support ($0.10/h) | $73 | €67 |
| Extended support ($0.60/h) | $438 | €403 |
| Three clusters on standard | $219 | €201 |
Load balancers with no targets
An ALB bills by the hour even if the target group is empty. US list is $0.0225/hour, about €16 a month, plus LCU; Ireland a little more, we round to €17. The service died in March. The balancer did not. Multiply by the ones the pipeline creates and nobody deletes.
Public IPv4
Since February 2024 AWS charges $0.005/hour for a public IPv4 address, in-use or idle: about €3.40 a month per address. The NAT has one. The ALB has another. The Elastic IPs nobody associated do too. It is not the bill. It is the noise that stops the bill being readable.
Unattached EBS and old snapshots
The volume survives terminate if DeleteOnTermination was false — the default on many old modules. gp3 bills by provisioned GiB; AWS’s example uses $0.08/GB-month. Ireland is typically near $0.088. gp2 is still dearer, and you do not need it. A forgotten terabyte is on the order of €80–100 a month, every month, quietly. Snapshots are not the volume size; they are the written blocks, and they accumulate because the lifecycle was never written.
CloudWatch logs with no retention
The default for a log group is keep forever. Ingest is billed per GB; storage, every month, on what you already ingested. In accounts that have never been audited this line reaches 10–15% of the bill, and nobody reads it in an incident. Fourteen or thirty days is a number. Infinite is not.
RDS Multi-AZ on what is not production
Multi-AZ is, roughly, twice a single instance. In production, if the RPO demands it, that is correct and it is not waste. In staging, copied “just in case” because Terraform had no conditional, it is a second database invoice for an environment that can stand being lost on Friday.
An €8,500 bill, line by line
A composite, not a client invoice. It is the shape we see most often at a 20–40 person product company with EKS in Ireland, a production RDS, staging that mirrors prod, and native observability plus some transfer. The 29% is not forced: it is what you get by deleting what has no owner and leaving what does.
| Line | € / month | No owner | What it is |
|---|---|---|---|
| EKS nodes, production | €2,800 | €1,120 | Requests ~40% above p95. You pay the request. |
| Staging + dev nodes, 24/7 | €1,350 | €1,100 | Nobody deploys at 03:00 on Saturday. Turning them off is not a project. |
| RDS prod, Multi-AZ | €1,400 | €0 | The RPO asks for it. Leave it. |
| RDS staging, Multi-AZ | €380 | €380 | A prod copy in Terraform. Single-AZ is enough. |
| NAT × 3 AZ + processing | €280 | €120 | A third AZ too many; S3/ECR through the NAT. |
| EKS control planes × 3 | €201 | €134 | Staging and dev do not need an eternal cluster. |
| ALB × 4 | €70 | €17 | One with no targets since March. |
| EBS + snapshots | €360 | €140 | available volumes, and lifecycles that do not exist. |
| CloudWatch Logs | €320 | €160 | Infinite retention. Nobody opens them. |
| Transfer, S3, cache, IPv4, rest | €1,339 | €94 | Some old S3, orphan IPs. The rest is traffic. |
| Total | €8,500 | €3,265 | 38% has a disputable owner. Flexera’s 29% fits inside; we do not use it as a ceiling. |
If you only count the lines you can delete on a Tuesday without touching production — staging Multi-AZ, extra NAT, extra clusters, dead ALB, orphan EBS, infinite logs, IPs — that is about €1,045. The rest of the hole is compute: inflated requests and pre-production left on. That is not a FinOps ticket. It is the conversation in the cluster you can explain: in most clusters we audit, wasted requested capacity sits between 40% and 70%. The AWS bill is that reservation, not the usage.
A warning on the €3,265 row: it is not a target. If you cut requests blind, the first real spike will give the money back in incidents. 29% is a survey average. Your figure is the sum of ownerless lines you can name.
Two numbers that look like savings and are not
Reserved Instances and Savings Plans. Flexera says 45% use AWS RIs; fewer than half use any commitment per provider. On an €8,500 bill, a one-year Compute Savings Plan on the stable baseline can take 20–30% off compute. That is not recovered waste. It is a purchasing decision on capacity you have already decided to have. Signing a commitment on nodes nobody uses is how waste becomes a twelve-month contract.
The FinOps platform. A seat at €30,000–80,000 a year, on an €8,500 bill, is buying a dashboard for a problem that is twelve lines in a CSV. Tools win from about €100,000 a month up, when the problem is attribution across fifty teams. Before that: Cost Explorer grouped by service, tags owner/env/service, and somebody allowed to delete. AWS Cost Optimization Hub and Compute Optimizer are free in the account and already tell you what is idle.
A dashboard that cannot delete is not FinOps. It is a monthly report.
When the bill is correct
Honesty has to run the other way too. Not everything large is waste, and cutting what makes money is how expensive post-mortems get signed.
- You have traffic, and transfer and ALB LCUs move with it. That is not “optimised” without a CDN and a product conversation.
- The large line is inference, GPU, or a warehouse that feeds a model with a product owner. Flexera’s waste rose this year because of AI. Do not donate that rise to a cut.
- Production RDS Multi-AZ, with a written RPO, and you have actually restored in the last ninety days.
- The NAT processes real internet egress, not S3, and a single AZ would leave you with no egress the day that AZ dies.
- Observability was used in the last incident. Cardinality that was not used is a different conversation — it is in alerts that earn the page.
If you are in those five, the bill hurts because the product is alive. Do not call us to make it smaller. Call if you cannot point at which line is which.
The fourteen-day cut, and the one that comes back
Week one does not touch production. Export Cost Explorer. Count NATs, clusters, ALBs, available volumes, log groups with no retention, RDS that is not prod. Delete what has no owner, with a written rollback: snapshot, previous instance type, recreate command. Week two is pre-production compute and requests from two weeks of p95, not a recommender in automatic mode on a Friday.
The cut is a number in Cost Explorer the following week, not a standup comment. If by week three the bill is back, you did not cut waste. You turned something off with no owner, and the pipeline created it again. Then the work is not FinOps. It is Terraform: the resource that is not in state is the one the console will resurrect.
An apply only one person dares to run will give you the NATs back. The long version of that is in Terraform without heroes.
Where this breaks in practice
- Treating 29% as a KPI. It is a mean of 753 people. Your figure is the sum of ownerless lines. If after naming them you land at 12%, you are under the survey, not “behind”. If you land at 45%, you are not broken: you had never looked.
- Buying Reserved Instances the same week you discover the idle nodes. The commitment turns the mistake into a year.
- Turning staging off with no schedule in code. A human who turns it off on Friday and a pipeline that turns it on on Monday is not a cut. It is a ritual.
- Cutting CPU requests on Friday because Compute Optimizer painted a row orange. The first real spike on Monday costs more than the €1,120.
- Commissioning a “FinOps report” that does not include a delete. You will have paid for a slide that says NAT Gateway.
Do not hire us if
The list is explicit. If you are on it, the email is surplus. Delete it yourselves, or do nothing; do not put us in the middle.
- The bill is €400 a month. A senior platform engineer is idle on that. A backend can set log retention. This note is not for you.
- You want a dashboard, not a delete. We bill for leaving a path and a state. Not for a Looker that explains the same CSV.
- You want us to “negotiate with AWS”. That is a TAM and a commitment. We are neither.
- The large line is GPU or a model, and the cut you want is that line. An AI gateway with quotas is models that stay inside ; the arithmetic of a node versus the API is in self-host LLM cost. We will not save you from the product.
If you already have tags, an owner per service and Cost Explorer reads in ten minutes, do not call us to confirm it. If the screenshot finance forwarded has no owners, that is a conversation.
Send us last month’s Cost Explorer CSV, grouped by service. Within 24h you get back the three lines that actually move the number, and which ones you should not touch. Sometimes the answer is: the bill is the product, and do not call us. hola@pikas.systems