FinOps and Cost Automation
Making cloud spend visible, attributable, and self-correcting — tagging enforcement, automated rightsizing, and cost as a pipeline signal.
Cloud cost is the one operational metric that engineers can change dramatically and usually cannot see. The gap between the person making the decision and the person receiving the bill is where waste accumulates — typically in the range of a third of spend in estates that have never addressed it.
Cost automation closes that gap: make spend visible to the people who cause it, and automate the corrections that do not need a decision.
Attribution is the foundation
Nothing else works without it. If you cannot say which team, service, and environment a dollar belongs to, every conversation about cost is a negotiation about guesses.
flowchart TD
A[Mandatory tags enforced at creation<br/>owner · service · environment · cost-centre] --> B[Cost allocation by tag]
B --> C[Per-team and per-service<br/>cost dashboards]
C --> D[Teams see their own spend<br/>next to their own traffic]
D --> E[Decisions get made by<br/>the people who cause the cost]
A -.->|"policy blocks untagged<br/>resource creation"| F[No untagged resources<br/>enter the estate]
Enforcement must be at creation time, through policy as code. Retroactive tagging projects are a recurring, never-finished form of toil — the estate grows untagged faster than anyone can label it.
Shared costs — networking, shared clusters, observability platforms — need an agreed allocation method rather than a rounding error. Allocating by usage where measurable, and by an agreed proportional key where not, is better than leaving a large unallocated bucket that nobody owns.
Automated waste elimination
A large share of cloud waste is mechanical and can be removed without a decision.
| Waste | Automated response |
|---|---|
| Unattached storage volumes | Detect, notify the owner, delete after a grace period |
| Idle load balancers, unused IPs, orphaned snapshots | Scheduled sweep with owner notification |
| Non-production environments running overnight and at weekends | Scheduled shutdown; on-demand wake |
| Over-provisioned instances | Rightsizing recommendations from actual utilisation |
| Old snapshots and log data past retention | Lifecycle policies applied at creation |
| Forgotten test environments | Time-to-live at creation; auto-destroy on expiry |
| Development clusters at production scale | Environment-appropriate defaults in the module |
Non-production scheduling is usually the fastest large win available. Development and test environments typically need to exist for about 50 hours of a 168-hour week; shutting them down outside working hours removes roughly two-thirds of their cost with no impact on anyone, provided waking them is a single click and takes less than a couple of minutes.
Time-to-live on ephemeral environments is the structural version of the same idea: created with an expiry, extended deliberately if still needed, destroyed automatically otherwise. This eliminates the entire category of forgotten environments rather than sweeping them up afterward.
Rightsizing safely
Rightsizing recommendations are easy to generate and dangerous to apply blindly — an instance sized on 30 days of data will be undersized for the quarterly peak that falls outside the window.
flowchart TD
A[Utilisation data<br/>≥30 days, including peaks] --> B[Recommendation engine]
B --> C{Confidence and headroom check}
C -->|"Clear over-provisioning<br/>with peak headroom retained"| D[Automated PR against the IaC repo]
C -->|"Marginal, or peaky workload"| E[Recommendation only,<br/>owner decides]
D --> F[Team reviews and merges]
F --> G[Applied through the normal pipeline]
G --> H[Monitor for saturation<br/>after the change]
H -->|Regression| I[Revert]
Two rules keep this safe: retain headroom for observed peaks, not averages, and change infrastructure through the IaC repository, never directly. A cost tool that resizes resources outside the pipeline creates drift, and the next apply will undo it.
Cost as a pipeline signal
The most effective intervention is showing cost impact before a change is merged, while the author is still deciding.
Infrastructure cost impact of this pull request
+ RDS db.r6g.2xlarge (multi-AZ) + $1,240 / month
+ 2 × NAT gateway + $ 130 / month
− t3.large × 4 (removed) − $ 240 / month
─────────────────────────────────────────────────────────
Net change + $1,130 / month (+18% for this service)
⚠ Exceeds the team's per-change threshold of $500/month — requires approval.
This is a straightforward estimate from the plan output plus a price list, and it changes behaviour more reliably than a monthly report, because it arrives when the decision is being made rather than a month after.
Related signals worth automating:
- Anomaly alerts on unusual spend increases, routed to the owning team rather than to finance.
- Budget thresholds per team with automated notification, and — for non-production only — automated enforcement.
- Unit cost tracking: cost per request, per customer, or per transaction. Absolute spend rising alongside traffic is healthy; unit cost rising is not, and only the unit metric distinguishes them.
Commitment management
Reserved capacity and committed-use discounts offer substantial savings in exchange for a commitment, and managing them by hand is guesswork.
- Analyse the stable baseline, not peak or average. Commit to the floor of usage; leave variable demand on-demand pricing.
- Automate expiry alerting well in advance. Lapsed commitments quietly increase cost with no other symptom.
- Re-evaluate quarterly, because architecture changes shift the baseline.
- Model the flexibility trade-off honestly. A three-year commitment on an instance family you may migrate away from is a bet, and it should be a deliberate one.
Governance that does not become a tax
- Show, then act. Visibility alone typically removes a meaningful share of waste, because most of it is unintentional.
- Give teams budgets and autonomy rather than approval gates. Teams optimise their own spend well when they can see it and own it.
- Make the efficient option the default in platform modules. A team choosing from a catalogue of right-sized options does not need to be told about cost.
- Automate enforcement only where reversal is cheap — non-production shutdowns, TTL expiry, untagged resource blocking. Automated deletion in production is not worth the risk it introduces.
Adoption checklist
- Tagging is mandatory and enforced at resource creation by policy.
- Every team sees its own spend, with shared costs allocated by an agreed method.
- Orphaned resources are swept automatically with owner notification.
- Non-production environments shut down outside working hours.
- Ephemeral environments carry a TTL and self-destruct.
- Rightsizing recommendations retain peak headroom and are applied via the IaC repo.
- Cost impact is estimated on every infrastructure pull request.
- Unit cost is tracked alongside absolute spend.
- Commitment coverage and expiry are reviewed on a schedule.
Last updated 19 Aug 2026, 00:00 UTC.