Skip to main content
Week 1

Cost as a Design Constraint

Cloud cost isn't a finance problem that lands on your desk after the fact — it's a design constraint, exactly like latency or throughput, and it should show up in the same architecture conversations.

~24 min read · Text + interactive

By the end of this lesson, you can…

  • Explain the Inform → Optimize → Operate loop the way it actually runs from the engineering seat, not the practitioner seat.
  • Name the Iron Triangle trade-off in a real deploy decision and state which two of cost, speed, and quality you're protecting when you concede the third.
  • Describe what the Engineering persona owns versus what it hands upward to the FinOps Practitioner.
  • Turn a monthly infra bill into at least two different unit-cost numbers (per request, per pod-hour, per build) and explain why they use different cost bases.
  • Explain what a FOCUS-conformant export buys you as an engineer writing your own cost queries, instead of waiting on a monthly finance report.

The FinOps Framework, From the Engineering Seat

The FinOps Framework runs on one loop — Inform, Optimize, Operate — and most FinOps material teaches it from the practitioner's chair: build the dashboard, present the recommendation, run the governance meeting. You sit in a different chair. The same loop looks like this from where you work:

01 · Inform

Cost is a signal you can query

Not a monthly PDF — a FOCUS-conformant export or a cost API you can filter by your own resource tags, the same way you already query logs or traces.

02 · Optimize

Cost is a code change

Rightsizing, tagging, and architecture fixes ship as a commit and a PR, not a recommendation someone else has to go implement.

03 · Operate

Cost is a gate, not a review

A tagging check, a cost-diff on a PR, a budget alert wired to a deploy event — controls that run continuously without a human remembering to look.

Every week after this one is one of these three phases made concrete: Week 2 is Inform and Operate for tags, Weeks 3–5 are Optimize for architecture, rightsizing, and Kubernetes, and Week 6 is Operate for the whole pipeline.

The Iron Triangle: Cost, Speed, Quality

Every infrastructure decision you make trades off three things — cost, speed (how fast you ship, and how fast the system responds), and quality (reliability, correctness, security). You can protect two. The third one moves.

Cost
What the decision spends — infrastructure dollars, but also the engineering time to build and maintain it.
Speed
Two different clocks: how fast you ship the feature, and how fast the running system responds to a request.
Quality
Reliability, correctness, and security — the properties that fail silently until they fail loudly.

A concrete example: Multi-AZ RDS versus single-AZ. Multi-AZ roughly doubles the database cost line, in exchange for automatic failover if a whole AZ goes down. That's a quality purchase, paid for in cost, with speed unaffected either way. A team that runs single-AZ in production isn't being careless by default — they may have decided their quality bar doesn't need automated failover, and they've bought speed-to-market or cost efficiency instead. The trade-off itself isn't right or wrong; what matters is that someone made it on purpose and can name what got protected and what got conceded.

A team is under a hard deadline to ship a new feature. To hit it, they skip load testing and deploy straight to production with autoscaling set conservatively high 'just to be safe.'

Which two sides of the triangle did they protect, and which one is quietly exposed?

Reveal my answer

They protected speed (the deadline) and quality (the conservative autoscaling floor keeps the system responsive even if it's wrong about real load). The side they quietly conceded is cost — "set it high just to be safe" is exactly the kind of unexamined provisioning that shows up as idle capacity on next month's bill. Nobody made a bad decision here; they made an implicit one. The FinOps discipline isn't "never trade cost for speed" — it's making sure that trade gets named instead of defaulting silently, so it can be revisited once the deadline pressure is gone.

Where Engineering Sits Relative to the Practitioner

The FinOps Foundation treats FinOps Certified Engineer and FinOps Certified Practitioner (FOCP) as parallel, persona-based certifications, not a ladder. They own different halves of the same loop:

Engineering (this course)FinOps Practitioner (FOCP)
Primary surfaceTerraform, Kubernetes manifests, CI/CD pipelinesDashboards, forecasts, cross-functional reporting
Unit of workA tagging policy, a rightsizing script, a cost gateA showback report, a commitment strategy, a QBR
OwnsWhether the infrastructure can even produce reliable cost data, and whether it wastes less of itWhether the organization understands and acts on that data
Hands upward / receivesSurfaces anomalies and cost-impacting changes to the cross-functional teamReceives that signal, forecasts it, and negotiates commitments against it

Neither role works without the other: a Practitioner's dashboard is only as good as the tags Engineering enforced (Week 2), and Engineering's rightsizing script (Week 4) is only worth running against a budget the Practitioner has already forecast.

Reading a Bill Like an Engineer: Unit Cost

A finance-oriented cost review asks "did total spend go up." An engineering-oriented one asks "did the cost of doing one unit of work go up" — because total spend going up while traffic triples is a win, and total spend staying flat while traffic drops by half is a problem hiding behind a flat line. That's what unit cost is for: cost per request, per pod-hour, per pipeline run, per whatever unit your service actually produces.

checkout-api — one month's cost breakdown (illustrative)
Service: checkout-api                    Monthly cost
--------------------------------------------------------
Compute (8 pods avg, autoscaled)          $14,400
Managed Postgres (RDS, db.r5.xlarge)       $2,600
Data transfer / egress                       $600
--------------------------------------------------------
Serving cost (compute + db + transfer)    $17,600
CI/CD (500 builds this month)                $750
--------------------------------------------------------
Total infra + pipeline cost               $18,350

Notice the total is split into two groups: serving cost (compute, database, data transfer — the cost that scales with traffic) and CI/CD cost (the cost that scales with how often you ship). That split matters because each unit-cost number should divide by the cost base that actually drives it:

Three unit-cost lenses on the same service
Requests served this month:        40,000,000
Pod-hours this month (8 pods x 720h): 5,760
CI builds this month:                    500

cost_per_request  = serving_cost / requests
                   = $17,600 / 40,000,000
                   = $0.00044   (0.044 cents / request)

cost_per_pod_hour = compute_cost / pod_hours
                   = $14,400 / 5,760
                   = $2.50 / pod-hour

cost_per_build    = ci_cost / builds
                   = $750 / 500
                   = $1.50 / build

Three different numbers, three different levers. Cost per request ($0.00044) moves if you cache more aggressively or reduce chattiness between services. Cost per pod-hour ($2.50) moves if you rightsize the pods themselves (Week 4) or renegotiate the compute pricing model (Week 3). Cost per build ($1.50) moves if you cache CI dependencies or trim a slow test suite. Blending all three into one "total cost per something" number — which is the instinct a lot of engineers reach for first — hides which lever actually moved the needle.

FOCUS for Engineers: Querying Your Own Cost Data

Waiting for a monthly billing export from finance is the practitioner-era workflow. If your organization's cost data is FOCUS-conformant (or exported through a provider's FOCUS-compatible export, like AWS Data Exports), you can query your own service's cost the same way you'd query your own logs — filtered by the resource tags you already enforce in Week 2, using FOCUS's provider-neutral ServiceCategory and ResourceId columns instead of hand-parsing a provider-specific export format.

Pull this month's cost for a service you own, filtered by team tag
SELECT
  ServiceCategory,
  ResourceId,
  SUM(EffectiveCost) AS effective_cost
FROM focus_cost_and_usage
WHERE Tags['team'] = 'checkout'
  AND ChargePeriodStart >= DATE_TRUNC('month', CURRENT_DATE)
GROUP BY ServiceCategory, ResourceId
ORDER BY effective_cost DESC;

The point isn't that you need to become a FOCUS expert (that's a separate course on this platform, if you want the deep dive) — it's that a normalized schema is what makes "check your own service's cost before standup" a query you can actually write, instead of a report you have to request.

Exercise: Build a Unit-Cost Model for a Service You Own

Pick one real service you own (or use checkout-api above as a stand-in). Write down: (1) its monthly cost, split into serving cost and any pipeline/build cost; (2) at least two unit-cost formulas that fit how it's actually consumed (per request, per pod-hour, per job run, per active user — whatever's real for your service); (3) one concrete lever you control for each formula. That's your one-page deliverable for this week. Reveal below to compare structure against a worked example.

Reflection

Think of one deploy decision your team made in the last few months where cost, speed, and quality were in tension. Which two did you protect, and was that a decision someone made on purpose, or one that happened by default?

Putting it together

The Inform → Optimize → Operate loop, the Iron Triangle, and the Engineering/Practitioner split are the same three ideas from three angles: what data you have, what trade-off you're making with it, and whose job it is to act on it. Unit cost is what turns "the bill went up" into a number you can actually reason about, and FOCUS is what makes that number queryable instead of requested. Every deliverable for the rest of this course — a tagging policy, an ADR, a rightsizing script, a Kubernetes cost model, a CI gate — is a more specific version of the same move: catching a cost decision at the point where you, the engineer, can still change it.

Week 1 of 6 complete17%
Up next

Week 2: Tagging Enforcement & IaC Cost Checks

A tagging policy that survives refactors, policy-as-code that fails a Terraform plan on missing tags, and wiring pre-merge cost estimation into a pull request.

That's Week 1.

This is one lesson from the full FinOps Certified Engineer course.

See the full course →