Contoso Airlines now has all the individual pieces: it knows how to estimate before deploying, it knows what it spent and whose it is, it knows which commitments to buy and it knows where the waste is. What it still does not have is the hardest part, and it is not technical: a way of working in which cost manages itself, without depending on somebody remembering. Because optimization done once undoes itself within six months. The orphaned disks come back, the environment left running at night comes back, the log ingestion nobody queries comes back, and next quarter Nuria asks the same question again.
This lesson closes the module with that leap: from tools to FinOps culture. You will see its three phases and the three roles that sustain it — Nuria, Marta and Diego — the complete catalog of optimization levers consolidating everything learned across the course, the conscious trade-off between cost and reliability, performance and security, with the cuts Contoso deliberately rejects, the prioritized plan with its before-and-after table, unit cost as the indicator that really matters, the monthly review as a governance process, cost inside the development lifecycle, and the anti-patterns that ruin any savings initiative.
Reminder: every euro figure is illustrative and fictitious. Real Azure prices change frequently and vary by region; always check them in the official calculator.
Contents
- What FinOps is and why it is culture, not tooling
- The three phases and the three roles
- The complete catalog of optimization levers
- The trade-off: cost versus reliability, performance and security
- The cuts Contoso rejects
- Contoso's optimization plan
- Before and after
- Unit cost: the indicator that matters
- The monthly cost review
- Policies that prevent spending
- Cost in the development lifecycle
- Optimization anti-patterns
- Common Mistakes and Tips
- Exercises
- Conclusion
- What FinOps is and why it is culture, not tooling
FinOps is an operating discipline for managing cloud spending: a set of practices that put economic accountability with the team that makes the technical decisions, using shared data in near real time. It is not a product, it is not a dashboard and you cannot buy it.
The reason it is needed is structural and it already appeared in 08-01: in the cloud, the person spending the money is the engineer, not the purchasing department. A control model in which finance approves and engineering then executes does not work when execution takes three seconds. That leaves only two options: block people with approval processes that destroy the very agility that justified the cloud, or give people the data and the accountability. FinOps is the second.
The three principles that sum it up:
- Visibility: every team sees what it spends, in enough detail to act, and without having to ask anybody.
- Accountability: the team that decides is the one answerable for its bill, and it has room to decide.
- Continuous optimization: it is not a quarterly project, it is a monthly routine with owners and dates.
And the reason people insist that it is culture: the three things that saved Contoso the most were not technical. They were a tagging scheme that lets you know whose every euro is, a one-hour monthly review where somebody has to explain their figures, and the habit of attaching an estimate to every architecture proposal. The tools execute; the culture is what makes somebody look at them.
- The three phases and the three roles
flowchart LR I["INFORM<br/>visibility, allocation,<br/>budgets, forecast"] --> O["OPTIMIZE<br/>right-size, switch off,<br/>commit, clean up"] O --> P["OPERATE<br/>governance, policies,<br/>monthly review, culture"] P --> I I -.->|"08-02"| I O -.->|"08-03 and 08-04"| O P -.->|"this lesson"| P
The cycle runs continuously and you cannot skip the first phase: optimizing without informing is guesswork. Contoso spent two months on the inform phase — tagging, the hereda-centro-coste policy, views, budgets, exports — before touching a single resource, and that is why the optimize phase took three weeks instead of six months.
The three roles, with names attached:
| Role | Who | Contributes | Needs | Risk if missing |
|---|---|---|---|---|
| Finance | Nuria Peña | Budget, forecast, economic context, the relationship with the committee | Data in her own language, not portal screenshots | Cost becomes an arbitrary ceiling with no technical judgment |
| Engineering | Marta Ríos and infrastructure | Knowledge of what can and cannot be touched; executes | To see the cost of what it builds, and room to decide | You optimize what you understand, not what costs money |
| Product / business | Diego Salas and the product owners | Prioritizes: what is worth it and what is not | Cost per feature and per transaction | You cut where it does not hurt instead of where it does not add value |
The classic dysfunction is only two of the three taking part. Without finance, the team optimizes without knowing whether it matters. Without engineering, ceilings get set that break production. And without the business — the most frequent case — you cut what is technically easy instead of what is economically irrelevant, and those two rarely coincide.
- The complete catalog of optimization levers
This is the table that consolidates the whole course. Each row is a lever seen in an earlier module, put here in its economic place.
| Resource type | Lever | How it is applied at Contoso | Typical saving | Risk |
|---|---|---|---|---|
| Everything | Switch off what is not used | The Detener-IniciarEntornosDev runbook over horario=laborable (07-04) |
Up to 75% of the affected compute | Very low |
| Everything | Delete orphans | Disks, IPs, snapshots, gateways (08-04) | Variable, always positive | Low, with a prior snapshot |
| VM / VMSS | Right-size | 95th percentile of CPU and memory in log-contoso-pro |
20-50% of the resource | Medium: requires a restart |
| VM / VMSS | Autoscale instead of oversizing | Autoscale 2-20 with the apertura-temporada-verano profile (02-02) |
30-60% against a fixed peak | Low if the threshold is tested |
| VM / VMSS / AKS | Spot instances | The lotes pool and the build agents (08-03) |
60-90% | High: eviction with 30 s notice |
| Stable compute | Reservations and savings plans | AKS, App Service, SQL, the VMSS baseline (08-03) | 11-45% | Medium: commitment |
| Windows / SQL Server | Azure Hybrid Benefit | db-reservas, validated by licensing (08-03) |
~30% of the vCore | Compliance, not technical |
| App Service | Consolidate applications on one plan | Several apps on plan-contoso-reservas-pro (02-03) |
One plan instead of N | Low: poor noise isolation |
| Databases | Serverless tier with auto-pause | sql-contoso-reservas-dev (03-02) |
70-90% in development | Resume latency |
| Databases | Stop the flexible server | Development MySQL and PostgreSQL (03-04, 03-05) | Compute to zero | Low |
| Cosmos DB | Autoscale and RU/s review | cosmos-contoso-tarifas-pro, 4,000 RU/s maximum (03-03) |
20-40% against fixed | Low |
| Synapse | Pause the dedicated pool; partition the lake | sqlpool-contoso paused; partitioned Parquet (03-06) |
Very high | Low |
| Storage | Access tiers and lifecycle rules | sttarjetascontosopro: Cool at 30 days, Cold at 90, Archive at 365 (02-04) |
40-80% of the GB-month | Retrieval and transaction cost |
| Storage | The right redundancy per piece of data | GZRS for boarding passes, LRS in development | 50% between tiers | High: this is reliability |
| Log Analytics | The three levers: what, on which plan, for how long | Ingestion cuts, ContainerLogV2 to Basic, per-table retention (07-02) |
30-60% | Low if you keep what you investigate |
| App Insights | Adaptive sampling | 25% with per-type sampling on ai-insights-contoso-pro (07-03) |
Proportional to the sampling | Medium: you lose detail |
| Networking | Cut data transfer out with caching and CDN | Caching static content and boarding passes on fd-contoso-global (02-06) |
30-60% of the egress | Low, with correct invalidation |
| Networking | Consolidate firewall, bastion and gateways | A single hub fw-contoso-hub-pro |
Removes entire duplicates | Medium |
| Functions / Logic Apps | The right hosting plan | Consumption for the sporadic, Premium only where needed (06-03) | Very high on sporadic workloads | Cold start |
| Architecture | Serverless and event-driven | evgt-contoso-reservas-pro instead of continuous polling (06-05) |
Removes idle compute | Redesign |
| AI | Token limits, context trimming and caching | oai-contoso-pro with a hard cap (06-06) |
20-50% | Response quality |
| Backups | Retention by criticality, not uniform | 30 days in production, less in development (07-05) | Proportional | High: this is recovery |
Two ways to read this table. Vertically, it is the list of everything you can touch. Horizontally, it is a warning: the risk column says the most profitable levers are not the safest, and there are three rows — redundancy, backup retention and sampling — where saving means accepting more risk, not removing waste. That distinction is the subject of the next section.
- The trade-off: cost versus reliability, performance and security
There are two classes of optimization, and confusing them is the origin of almost every disaster:
| Removing waste | Accepting a trade-off | |
|---|---|---|
| What it is | Stopping paying for something that adds nothing | Paying less in exchange for less |
| Example | An orphaned disk, an environment running at night | Dropping from GZRS to LRS, removing the WAF |
| Who decides | Engineering, on its own | The business, informed by engineering |
| Reversibility | Total | Sometimes none, and you find out on the bad day |
| When it is done | Always and immediately | Only with an explicit, documented decision |
The first column is executed without asking permission: nobody has to approve deleting a public IP that is not attached to anything. The second is never decided by engineering alone, because it is not a technical decision: it is an exchange of money for risk, and the risk is borne by the business.
The right way to put a trade-off to whoever has to decide it has three parts: how much is saved, what exactly is lost and what happens on the day that matters. Framed like that, most questionable cuts fall over on their own. Framed as "we can save €190 a month on storage", almost all of them get approved, and nobody remembers why on the day of the incident.
- The cuts Contoso rejects
These proposals came up in the review and were rejected in writing, which is as important as what was actually done:
| Proposal | Saving | What would be lost | Decision and reason |
|---|---|---|---|
Remove zone redundancy from db-reservas |
€370 | Tolerance to the loss of a West Europe zone | Rejected: without it no ticket gets sold for hours |
Remove the fg-contoso-reservas replica |
€1,180 | The 1-hour RTO from module 7 | Rejected: it is a commitment signed with the business |
Disable the wafcontosoglobal WAF |
€140 | Protection against injection and bots on the public front end | Rejected: a personal data breach costs orders of magnitude more |
| Disable Defender for Cloud on SQL and Key Vault | €310 | Detection of exfiltration and anomalous access to secrets | Rejected: these are the two resources holding sensitive data |
Drop sttarjetascontosopro from GZRS to LRS |
€190 | Recovery from a regional disaster | Rejected for boarding passes; accepted for sttarjetascontosodev |
| Reduce backup retention from 30 to 7 days | €160 | The clean point before ransomware detected late | Rejected: 07-05 explains it in detail |
Remove bastion-contoso-pro and open direct access |
€205 | Administrative access without exposing ports | Rejected: reopening RDP/SSH to the internet is indefensible |
| €2,555 | Deliberately left on the table |
Contoso could have cut another €2,555 a month off its bill by applying this list. It decided not to, and it wrote that down. That document is worth more than it looks: when somebody asks a year from now why GZRS is being paid for, the answer will be written with its date and its signature, and nobody will have to reconstruct the reasoning from scratch. A mature team is not the one that cuts the most: it is the one that knows what it does not cut, and why.
- Contoso's optimization plan
Starting from the analyzed July invoice — €17,800 — the team prioritized the actions by saving, risk and effort. Illustrative and fictitious figures:
| # | Action | Saving/month | Risk | Effort | Source |
|---|---|---|---|---|---|
| 1 | Reservations, savings plan and Hybrid Benefit | €2,900 | Medium (commitment) | Low | 08-03 |
| 2 | Ingestion cuts and table plans on log-contoso-pro (42 → 24 GB/day) |
€690 | Low | Medium | 07-02 |
| 3 | Waste from Advisor and Resource Graph | €457 | Low | Low | 08-04 |
| 4 | Caching static content and boarding passes on fd-contoso-global |
€340 | Low | Medium | 02-06 |
| 5 | More aggressive lifecycle rules on sttarjetascontosopro and cleanup of stlagocontosopro |
€215 | Low | Low | 02-04 |
| 6 | Extend Detener-IniciarEntornosDev to all of rg-contoso-reservas-dev |
€210 | Low | Low | 07-04 |
| 7 | Adaptive sampling at 25% on ai-insights-contoso-pro |
€180 | Medium | Low | 07-03 |
| 8 | Partition the lake in Parquet to cut the TB read in Synapse | €130 | Low | Medium | 03-06 |
| 9 | Development databases moved to serverless or stopped | €120 | Low | Low | 03-04, 03-05 |
| Total | ≈ €5,250/month |
The ordering criterion was not the absolute saving but the ratio of saving ÷ (risk × effort), and that is why action 3 — €457 of cleanup with no risk and no effort — was executed before action 1, despite saving six times less. There is also a hard dependency between the two: rule 3 from 08-03 demands optimizing before committing, so the cleanup and the right-sizing had to come first for the reservation to be bought over the already slimmed-down platform.
And a warning about the arithmetic that is always worth making: these savings are not perfectly additive. Action 2 reduces the ingestion and with it the base on which a future capacity commitment would be calculated; action 4 reduces egress but also Storage transactions, overlapping slightly with action 5. The honest estimate Contoso took to the committee was not a figure but a range: between €12,400 and €13,000 a month, and the new budget was set at €13,000 so as not to promise the best case.
- Before and after
| Item | July (before) | October (after) | Change | What produced it |
|---|---|---|---|---|
sql-contoso-reservas-pro + replica |
€2,660 | €1,535 | −42% | Reserved capacity + Hybrid Benefit |
aks-contoso-operaciones |
€1,980 | €1,150 | −42% | 3-year reservation + right-sizing of the aplicaciones pool |
log-contoso-pro + App Insights |
€1,640 | €770 | −53% | Ingestion cuts, table plans, retention and sampling |
vmss-api-disponibilidad-pro |
€1,320 | €1,188 | −10% | Reservation on the baseline of 2 instances |
fw-contoso-hub-pro |
€1,010 | €1,010 | 0% | Unchanged: egress control is mandatory |
| Data transfer out | €780 | €440 | −44% | Caching on fd-contoso-global |
| Rest of the platform | €8,410 | €6,457 | −23% | Cleanup, lifecycle rules, shutdowns, Synapse, plans |
| Total | €17,800 | €12,550 | −29% |
Three readings. No service was degraded: response times, availability and RPO/RTO are identical before and after, and that was verified with the module 7 dashboards over the following four weeks. More than half the saving came from two places — commitments and observability — consistent with the rule of optimizing from the top down. And fw-contoso-hub-pro still costs the same, because not everything expensive is optimizable, and acknowledging that is part of the job.
- Unit cost: the indicator that matters
An absolute total is a bad indicator, because it does not distinguish between spending more because you are growing and spending more because you are wasting. The indicator that does distinguish is unit cost: cost divided by a unit of business value. At an airline, cost per booking sold.
| Month | Invoice | Bookings sold | Cost per booking | Reading |
|---|---|---|---|---|
| July (before) | €17,800 | 92,000 | €0.193 | Baseline |
| October (after) | €12,550 | 92,500 | €0.136 | −30% at the same volume |
| The following August (peak season) | €19,600 | 148,000 | €0.132 | Invoice +10%, unit cost −3% |
The third row is what changes the conversation in the committee. August's invoice is 10% higher than July's and, looked at in absolute terms, it looks like a failure. Looked at in unit cost, it is the best news of the year: the platform absorbed 60% more bookings for 10% more spend, that is, it scales with increasing efficiency. A rising invoice can be excellent news, and without unit cost there is no way to prove it.
The indicator is calculated by joining the daily cost export from stlagocontosopro (08-02) with the bookings table, in syn-contoso-analitica-pro:
// Cost per booking sold, per day, over the workspace holding both datasets
let cost =
CosteDiario_CL
| where TimeGenerated > ago(90d)
| summarize eur = sum(CostInBillingCurrency_d) by day = bin(TimeGenerated, 1d);
let sales =
AppEvents
| where Name == "ReservaConfirmada"
| summarize bookings = count() by day = bin(TimeGenerated, 1d);
cost
| join kind=inner sales on day
| extend unitCost = round(eur / todouble(bookings), 4)
| project day, eur, bookings, unitCost
| order by day asc
| render timechartContoso publishes three unit indicators: cost per booking sold, cost per boarding pass issued and cost per million requests to the Availability API. Each one has an owner, and all three are reviewed monthly. The rule that governs them: the goal is not for the invoice to go down; it is for the unit cost to go down. If the business grows 40% and the invoice grows 15%, the team has done excellent work even though Nuria pays more than last month — and she knows it, because the indicator shows her.
- The monthly cost review
The process that sustains everything else fits into one hour a month:
| Element | Definition at Contoso |
|---|---|
| When | First Tuesday of the month, 60 minutes, permanently in the calendar |
| Who | Nuria (finance), Marta (infrastructure), Diego (backend), the product owner, the data lead |
| Input | The one-page report from 08-04, sent 48 hours in advance |
| What gets looked at | Invoice and variance; unit cost; variance against budget; top 10 items; the month's anomalies; waste detected; realized saving versus promised; commitment coverage and utilization; untagged resources |
| What gets decided | What gets applied this month and who does it; which commitments get bought; which cuts get rejected and why; which budgets get adjusted |
| Output | A list of actions with an owner and a date, and the decisions written down |
Four rules learned the hard way that make the difference between a useful meeting and a ceremony:
- The report goes out beforehand. A meeting that starts by reading data does not make decisions.
- Every action has a name and a date. "Somebody should look into the logging thing" is not an action.
- Promised saving is compared with realized saving. This is the point that builds credibility, and also the one that exposes optimistic estimates.
- You celebrate the unit cost, not the invoice. If you reward lowering the invoice, somebody will end up slowing down the growth of the business to achieve it.
- Policies that prevent spending
The cheapest optimization is the one that prevents the spend before it exists, and that is what the policies from module 4 are for, applied from the "Base de gobernanza de Contoso" initiative:
| Policy | Effect | What it prevents |
|---|---|---|
Allowed regions (westeurope, northeurope) |
Deny |
The VM on another continent that nobody monitors, and cross-region data transfer out |
| Allowed VM sizes | Deny |
The Standard_E64s_v5 created "for a test" |
| Allowed SKUs on data services | Deny |
A Synapse dedicated pool created by hand |
Mandatory tags (entorno, proyecto, centro-coste, propietario) |
Deny |
Spending that cannot be allocated to anybody |
hereda-centro-coste |
Modify |
A child resource losing the group's allocation |
| Prohibit public IPs on application subnets | Deny |
Cost and exposure surface at the same time |
| Audit resources with no diagnostic setting | AuditIfNotExists |
Operational blindness; with the caveat that deploying it generates ingestion |
That last caveat deserves attention because it is the module's full loop: a policy designed to improve observability creates spending in log-contoso-pro. That is not an argument for not having it; it is an argument for deploying it with the log categories chosen deliberately, instead of switching them all on.
And a warning about balance: an overly strict Deny policy turns into a queue of exceptions somebody has to approve, and that reintroduces exactly the friction the cloud was supposed to remove. Contoso keeps a short list of Deny policies — regions, disproportionate sizes, tags — and uses Audit for everything else, reviewing the result in the monthly meeting.
- Cost in the development lifecycle
For cost to be a design criterion rather than a subsequent audit, it has to be built into four points of the process, all of them already covered:
flowchart LR D["Design<br/>estimate with assumptions<br/>and compared alternatives"] --> R["Architecture review<br/>cost is a criterion alongside<br/>reliability and security"] R --> PR["Bicep pull request<br/>automatic comment with<br/>the SKU impact"] PR --> DE["Deployment<br/>mandatory tags<br/>and an environment budget"] DE --> M["Operation<br/>Cost Management, Advisor,<br/>monthly review"] M --> D
The piece with the greatest cultural effect is the third. When the pull request automatically shows that raising a database SKU costs €380 a month (08-01), the conversation about cost happens between two engineers, at the moment when changing it means editing one line, and without anybody having to play policeman. Cost stops being an audit and becomes design information, which is the whole point of FinOps.
- Optimization anti-patterns
| Anti-pattern | Why it fails | What to do instead |
|---|---|---|
| Optimizing without measuring | You optimize what you understand, not what costs money | Inform before optimizing: complete phase 1 |
| Cutting where the money is not | 80% of the spend is in 20% of the resources | Sort by cost and start at the top |
| Saving €50 with 20 hours of engineering | Engineering time costs far more than what is saved | Always calculate the cost of the action, not just the saving |
| Breaking production with a Friday resize | An incident costs more than a year of that saving | Windows, a staging environment, and never before a weekend |
| Cutting observability until you are blind | Without data you cannot optimize or operate | Cut what you do not query, keep what you investigate |
| Reserving before stabilizing | You pay three years for the wrong size | Optimize first, commit afterwards |
| Optimizing once | Waste regenerates on its own | A monthly routine with owners |
| Turning cost into a weapon | Blaming a team for its bill destroys collaboration | Showback before chargeback; data, not reproaches |
| Chasing a 100% score | It leads to applying recommendations that do not apply | Euros and risk as metrics, not the score |
The third one deserves a separate comment because it is the most common among motivated technical teams. A day of engineering costs something in the order of several hundred euros; spending twenty hours on a €50-a-month saving takes almost a year to pay back, and during that year those twenty hours could have been spent on something else. Before optimizing something, estimate how much optimizing it costs. It is the same discipline from 08-01 applied to your own work.
Common Mistakes and Tips
- Believing FinOps is a tool. You buy a dashboard and nothing changes; what changes things is the monthly review with owners.
- Confusing removing waste with accepting a trade-off. The first is executed; the second is decided with the business and written down.
- Optimizing without verifying afterwards. The change gets applied and nobody checks whether the saving showed up on the invoice.
- Measuring only the total invoice. Without unit cost you cannot tell growth from waste.
- Cutting observability blindly. It is the easiest item to touch and the one that leaves you with no instruments.
- Not writing down what gets rejected. A year from now nobody will remember why GZRS is being paid for.
- Automating shutdowns without tag-based safeguards. A badly filtered runbook switches production off on a Tuesday.
- Tip: put the monthly review in the calendar today, even if the first report is poor. The routine creates the data, not the other way round.
- Tip: publish the unit cost on the same dashboard where the team looks at latency. What gets seen gets managed.
- Tip: keep a log of cost decisions — applied and rejected — alongside the templates in
contoso-infra.
Exercises
Exercise 1. Contoso Miles' (centro-coste=CC-2077) invoice is €1,240/month: App Service Premium v3 (€420), PostgreSQL flexible with high availability (€390), Log Analytics (€180), receipt blobs on GZRS (€140) and Functions on consumption (€110). The project has 6,000 redemptions a month and a budget of €900. Propose a prioritized plan with saving, risk and effort, state what you would not cut and calculate the unit cost before and after.
Exercise 2. An engineer proposes reducing log-contoso-pro retention from 90 to 7 days, saving €480/month. Analyze the proposal: what gets lost, what alternatives exist with the same saving and less impact, and how you would put it to the committee if it had to be done anyway.
Exercise 3. Design the monthly cost meeting for a 40-person company with a single subscription and a €4,000/month invoice. Define the attendees, duration, agenda, indicators and what you would automate so that the report prepares itself.
Solutions
Solution 1: starting unit cost: €1,240 ÷ 6,000 redemptions = €0.207/redemption. Prioritized plan. (1) Log Analytics (€180): apply the three levers from 07-02 — review with Usage which tables are being ingested, move container or application logs that are never investigated to the Basic plan and adjust the per-table retention; estimated saving €90, low risk, medium effort; it is the item with the best saving/risk ratio. (2) PostgreSQL (€390): high availability with zone redundancy doubles the compute; this is a trade-off, not waste, so the business decides — if a loyalty program can tolerate a few hours of downtime, disabling it saves around €180; if not, it stays and you look elsewhere. In parallel, checking the sizing and reserving for 1 year if usage has been stable for three months is pure waste removal (around €60 more). (3) App Service (€420): check whether Premium v3 is required for zone redundancy and slots or whether it was chosen out of inertia; if the project can tolerate a lower tier the saving is large, but you lose slots and autoscale — again, a trade-off. (4) GZRS blobs (€140): moving to ZRS saves part of it, but redemption receipts may have evidentiary value; it does not get cut without consulting legal. (5) Functions on consumption (€110): already on the most efficient model; leave it alone. What is not cut under any circumstances: the minimum legal retention of the receipts, and the database backups. Plausible result: ~€330 of saving with no trade-offs (Log Analytics, the reservation and cleanup) → €910/month, unit cost €0.152/redemption, 27% lower, effectively within budget without degrading anything. If the business additionally accepts giving up high availability, you drop below €900 comfortably, but that decision is not signed off by engineering.
Solution 2: what you lose with 7 days of retention: the ability to investigate any incident older than a week, the comparison against last month's baseline, the trend analysis that underpins the optimization exercise itself, and — critically — compliance, because AzureActivity and access logs usually have retention requirements measured in months or years; cutting indiscriminately to 7 days may be a straightforward breach. On top of that, security incidents and ransomware are detected late (07-05): without logs there is no way to reconstruct what happened. Alternatives with comparable saving and far less impact, in order: (1) reduce the ingestion of what nobody queries — the highest-impact lever — identifying with the Usage table which tables account for the bulk of the volume and switching off unused diagnostic categories or filtering them with transformations in the collection rule; (2) the Basic plan for high-volume, low-query tables such as container logs; (3) differentiated per-table retention, which is what resolves the conflict: AzureActivity at 365 days for compliance, AppTraces at 30, debug logs at 8; (4) long-term archive, much cheaper, with search jobs when needed; and (5) exporting to stlagocontosopro for whatever is only needed occasionally. Combining the five reaches a similar saving while preserving what is investigable. If the cut had to be made anyway, you put it to the committee as an explicit trade-off: "we save €480/month and we accept that any incident older than a week will be uninvestigable and that the audit logs will stop meeting requirement X", with the signature of whoever takes on that risk and a review date.
Solution 3: attendees, four people: whoever runs finance, whoever runs infrastructure, a product representative and the technical lead of the main product; more than five people for €4,000 is disproportionate. Duration 30 minutes a month. Agenda: (1) the month's invoice, variance and deviation from budget, 5 min; (2) the unit cost of the chosen business indicator, 5 min; (3) top 5 items and anomalies detected, 5 min; (4) waste from Advisor and Resource Graph with an apply/postpone/dismiss decision, 10 min; (5) actions with an owner and a date, 5 min. Indicators: total, monthly variance, unit cost, percentage of untagged resources, realized saving versus promised, and commitment coverage if there are any. Automation: a monthly runbook in Azure Automation that runs az advisor recommendation list --category Cost and the Resource Graph queries for orphans and untagged resources, dumps the result into a storage account and posts the summary to Teams 48 hours before the meeting; a daily cost export; a budget with alerts at 80% actual and 100% forecasted targeting the existing action group; and anomaly detection enabled. At this size chargeback is not appropriate — with a single subscription and four people, showback and a conversation are enough — nor is buying reservations before there are three months of stable usage.
Conclusion
You now know what FinOps is and why it is culture and not tooling: in the cloud the person spending the money is the person writing the template, and the only alternative to blocking people with approvals is giving them the data and the accountability. You know its three phases — inform, optimize, operate — the rule that you cannot skip the first, and the three roles with their names: Nuria bringing budget and economic context, Marta bringing the knowledge of what can be touched, and Diego and product deciding what is worth it; along with the typical dysfunction of the business being absent and the team ending up cutting what is technically easy instead of what is economically irrelevant.
You have the complete catalog of levers that consolidates the entire course — switching off, cleaning up orphans, right-sizing, autoscaling, spot instances, reservations and savings plans, Hybrid Benefit, consolidating plans, serverless tiers with auto-pause, RU/s autoscale, pausing Synapse, storage tiers and lifecycle rules, the three Log Analytics levers, sampling in Application Insights, caching and CDN against egress, the right hosting plans, serverless and event-driven architectures, and token limits — with their typical saving and, above all, with their risk. And with it, the distinction that avoids disasters: removing waste is executed without asking permission, accepting a trade-off is decided by an informed business, with the three questions — how much is saved, what exactly is lost and what happens on the day that matters. That is why Contoso left €2,555 a month on the table, rejecting in writing the removal of zone redundancy on db-reservas, the fg-contoso-reservas replica, the WAF, Defender for Cloud, GZRS on the boarding passes, backup retention and the bastion.
You carry the complete prioritized plan, ordered by saving divided by risk and effort, with the cleanup executed before the commitments; the measured result — from €17,800 to €12,550 a month, 29% less, without degrading a single service — and the honesty of presenting it as a range and budgeting the worst case. You know that the indicator that really matters is unit cost, which fell from €0.193 to €0.136 per booking sold and kept falling during peak season even as the invoice rose, because a rising invoice can be excellent news and without that indicator there is no way to prove it. And you have the process that sustains it: the one-hour monthly review with its attendees, its report sent 48 hours ahead, its actions with names and dates and its comparison of promised against realized saving; the policies that prevent spending from the governance in module 4; the integration of cost into the development lifecycle, with the estimate in the architecture review and the automatic comment on the Bicep pull request; and the anti-patterns that ruin any initiative, with the most expensive of all clearly identified: saving fifty euros at the cost of twenty hours of engineering.
That closes module 8 and, with it, the construction of the platform. It is worth looking at the whole: Contoso Airlines started this course with a vague idea of what the cloud was and finishes with a platform deployed on well-chosen compute, storage and networking; with its data in the right services and its service levels justified; secured with identity, RBAC, secrets, a WAF, Defender for Cloud and policies that prevent the creation of what should not exist; delivered by pipelines and infrastructure as code instead of by clicks; extended with containers, functions, messaging and AI; observed end to end, investigable with KQL, automated and recoverable with a tested plan; and now estimated, measured, budgeted, allocated, optimized and governed, with every euro charged to a cost center and every cutting decision — including the ones that were rejected — written down with its reason. Nuria Peña's question, the one that opened this module, finally has an answer: you know how much each piece costs, what part of that invoice is value and what part was waste, and who decides about each one.
One last thing remains, and it is to look at all of this at once. Across eight modules you have seen the platform in parts, each one in its lesson, and that is how you learn it; but it is not how it exists. Module 9 closes the course with the whole picture: the complete Contoso Airlines architecture drawn in full, with all its components and all its connections, so that you can read it the way you read a blueprint; the Azure Well-Architected Framework, the framework that justifies — or dismantles — every one of the decisions you have been making, with its five pillars and their trade-offs; the common mistakes that repeat in every organization and how to avoid them before you make them; how an entire organization migrates with the Cloud Adoption Framework, because Contoso still has systems in Barcelona; and where Azure is heading, with the certifications that accredit what you already know how to do. You have all the pieces: module 9 is where you learn to read the whole with judgment.
Azure Course
Module 1: Introduction to Azure
- What Is Azure?
- Service Models, Regions and Availability Zones
- Creating and Setting Up Your Azure Account
- A Tour of the Azure Portal
- Azure Resource Manager: Subscriptions, Resource Groups and Tags
- Azure CLI, PowerShell and Cloud Shell
Module 2: Core Azure Services
- Azure Virtual Machines
- Compute Scaling and High Availability
- Azure App Service
- Azure Storage: Blobs, Files, Queues and Tables
- Azure Networking: Virtual Networks, Subnets and NSGs
- Hybrid Connectivity and Global Delivery
Module 3: Azure Databases
- Choosing the Right Data Service
- Azure SQL Database
- Azure Cosmos DB
- Azure Database for MySQL
- Azure Database for PostgreSQL
- Data Analytics: Data Lake, Data Factory and Synapse
Module 4: Security in Azure
- Microsoft Entra ID and Identity Management
- RBAC and Managed Identities
- Azure Key Vault
- DDoS Protection and Web Application Firewall
- Microsoft Defender for Cloud
- Governance and Compliance with Azure Policy
Module 5: Azure DevOps
- Introduction to Azure DevOps
- Azure Repos
- Azure Pipelines: Continuous Integration
- Continuous Deployment with Environments and Approvals
- Azure Artifacts
- Infrastructure as Code with Bicep
Module 6: Advanced Azure Services
- Containers in Azure: Container Registry and Container Apps
- Azure Kubernetes Service (AKS)
- Azure Functions
- Azure Logic Apps
- Messaging and Events: Service Bus, Event Grid and Event Hubs
- Azure AI Services
Module 7: Monitoring and Management
- Azure Monitor: Metrics, Alerts and Dashboards
- Log Analytics and KQL Queries
- Application Insights
- Azure Automation and Runbooks
- Backup and Disaster Recovery
Module 8: Cost Management and Optimization
- Pricing Calculator and Cost Estimation
- Azure Cost Management: Analysis, Budgets and Alerts
- Reservations, Savings Plans and Azure Hybrid Benefit
- Azure Advisor
- Optimization Strategies and FinOps Culture
