What NoOps is
Link to section “What NoOps is”In 30 seconds
Link to section “In 30 seconds”NoOps (“no operations”) is the idea that a software organisation can automate and buy infrastructure work so thoroughly that application teams need no dedicated operations team. Forrester analyst Mike Gualtieri proposed it in February 2011 in a blog post that called DevOps “a step backward” and promised that “application developers will never have to speak with an operations professional again”; even he expected that “Ops can run this public, private, or hybrid infrastructure”.[1] That April, Forrester’s report Augment DevOps With NoOps softened the idea: “Continue to pursue DevOps, but prepare to augment it with NoOps”.[2]
In one line: NoOps is a design goal for buying and automating as much operational work as is sensible, not a state in which operational work stops existing. Managed services take over patching, hardware, capacity and much availability engineering. You still own data, identities, configuration, cost, announced runtime upgrades, the response when the provider fails, and the decision to leave. This page shows how to estimate and own that remainder.
For leaders deciding whether to hire operations staff, architects choosing building blocks, and engineers who inherit a “NoOps” stack.
At a glance
Link to section “At a glance”| Item | Summary |
|---|---|
| Term status | Aspirational. No standard definition, governing body or certification. Reviews conclude that full “no operations” has not arrived (Tozzi, 2022: “NoOps hasn’t materialized”; TechTarget, 2023: “few organizations have reached” it), while some vendors claim otherwise.[5][4] |
| In scope | Managed, PaaS, serverless and SaaS as an operating choice; the operations that remain; lock-in, control and cost. |
| Out of scope | Serverless mechanics → ServerlessOps; building a platform → PlatformOps; cloud governance, quotas and provider events → CloudOps; automation engineering → AutomationOps; spend → FinOps. |
| Prerequisites | Delivery basics (DevOps); cloud service models (CloudOps). |
| Key outputs | A responsibility register per service; a work-and-coverage estimate; routed provider signals; a dependency-failure plan; an exit-cost estimate. |
The problem NoOps tries to solve
Link to section “The problem NoOps tries to solve”Operations work that does not differentiate the product is expensive. Google’s SRE book calls the repetitive part toil: “manual, repetitive, automatable, tactical, devoid of enduring value”.[6] Developers also waited on operations queues; at Netflix in 2012, hours a week of meetings with operations became seconds of self-service.[3]
| Operating reality | Self-managed (before) | Managed-first (after) | What did not go away |
|---|---|---|---|
| Servers and OS | You patch hosts | Provider does | Runtime and dependency upgrades |
| Capacity | You forecast and buy | Elastic within quotas | Quota headroom, cost of scale |
| Availability | You build redundancy | Provider, inside its service | Provider-failure design; restores |
| Security | Every layer | Provider’s layers | Identities, access, configuration, data |
| Incidents | Code and infrastructure | Mostly code | Provider incidents become yours |
| Cost | Mostly fixed | Variable | Unit economics |
Getting it wrong cuts both ways: self-managing commodity infrastructure wastes time on toil; assuming operations has gone leaves duties unowned until incidents expose them. Hosting alone is not enough: DORA’s 2024 research concluded that “Organizations may be better off staying in the data center if they are not willing to radically transform their application or service.”[7]
What NoOps is not
Link to section “What NoOps is not”- Not the absence of operations. Serverless “does not mean that we no longer use servers to host and run code; nor does it mean that operations engineers are no longer required” (CNCF).[8]
- Not a job title, a certification or a synonym for serverless. PaaS, managed Kubernetes, managed databases, SaaS and internal platforms are other routes (ServerlessOps, PlatformOps).
- Not simply the opposite of DevOps, although it began that way. Replying to Netflix in 2012, John Allspaw quoted Mark Imbriaco calling its model the “‘developers own their code throughout the entire lifecycle’ approach” that “the rest of us” had used “for years”.[9]
- Not a headcount plan. What Netflix described, Allspaw wrote, “is Operations”, whatever the titles: “the responsibility to make it safe to make whatever change to production is necessary”.[9] This page’s inference: removing operations skills leaves the work with people who may lack the training or time.
Where NoOps comes from and where it sits
Link to section “Where NoOps comes from and where it sits”Origins and evolution
Link to section “Origins and evolution”| Year | Milestone | What it shows |
|---|---|---|
| 2011 | Gualtieri’s post “I Don’t Want DevOps. I Want NoOps.” (February); Forrester’s report (April, Gualtieri and O’Donnell)[1][2] | A provocation, softened within months |
| 2012 | Adrian Cockcroft on “NoOps” at Netflix; Allspaw’s reply. Cockcroft later added: “lets just call it PaaS for now, and work on a better definition of DevOps”[3][9] | Its best-known proponent steps back |
| 2016–2018 | Charity Majors, “WTF is operations? #serverless”; CNCF Serverless Whitepaper v1.0[10][8] | Serverless revives the claim; Majors and the CNCF reject it |
| 2019 | UC Berkeley, Cloud Programming Simplified[11] | Serverless “handles virtually all the system administration operations”, with less predictable cost and more lock-in |
| 2026 | AWS and Microsoft document AI operations agents (emerging direction) | The “no humans” meaning returns |
Glossary and mental model
Link to section “Glossary and mental model”| Term | Meaning on this page |
|---|---|
| Low-ops | This Atlas’s term for realistic NoOps: a small, explicitly owned operational remainder. |
| Serverless | Functions plus managed back-end services, billed by demand.[8] |
| Shared responsibility | The provider’s published split of who operates each control; Google’s “shared fate” adds secure defaults.[12][13] |
| Residual operations | Duties that remain with you, such as runtime upgrades and restore tests. |
| Work and coverage | Hours spent on duties, versus someone being reachable. |
| SLI, SLO, SLA | SLI: “a carefully defined quantitative measure of some aspect of the level of service”; SLO: a target for an SLI; SLA: a contract “that includes consequences of meeting (or missing) the SLOs”.[14] |
| Quota | A provider limit: “hard limits, which you cannot change, and soft limits, which you can request increases for”.[15] |
| ADR, FTE, MFA | Architecture decision record; full-time equivalent; multi-factor authentication. |
Mental model: operations is displaced, not deleted. The provider operates below a responsibility line, you above it. Each abstraction since 2011 has moved the line up, never to the top: Microsoft’s matrix keeps data, identities and configuration with the customer in every model.[12] For each task that “went away”, ask where did it go?
Diagram source (Mermaid)
flowchart LR
subgraph Before["Self-managed: one ops queue"]
P1["Patch OS and hosts"]
P2["Plan and buy capacity"]
P3["Build redundancy"]
P5["Answer pages"]
P4["Deploy releases"]
P7["Configure services"]
P6["Manage access and data"]
end
subgraph After["Managed-first: work is displaced"]
D1["Provider: hardware, OS patching, in-service redundancy"]
D5["Management: quotas, cost, vendors, exit"]
D3["Product team: on-call, upgrades, deploys, failure design"]
D2["Platform team: paved road, guardrails"]
D4["Automation code: needs an owner"]
D6["Always yours: data, identity, config, access"]
end
P1 --> D1
P2 --> D1
P2 --> D5
P3 --> D1
P3 --> D3
P5 --> D3
P4 --> D3
P4 --> D2
P4 --> D4
P7 --> D6
P6 --> D6
classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
class P1,P2,P3,P4,P5,P6,P7 neutral
class D1,D2,D3,D4,D5 core
class D6 risk
Text equivalent: One self-managed operations queue (left) splits after adopting managed services (right). Patching goes to the provider; capacity to the provider and to management; redundancy to the provider and the product team; pages and deploys to the product team, the platform team and automation that needs an owner. Configuration, access and data stay with you (red).
How NoOps relates to other Ops
Link to section “How NoOps relates to other Ops”Neighbours teach the mechanisms of “less ops”; this page asks what remains and who owns it (an editorial split, not a standard).
| Neighbouring page | Shared scope | Its unique focus | NoOps’s unique focus |
|---|---|---|---|
| DevOps | Developers owning what they ship | CI/CD, DORA metrics | Whether developers can absorb what remains |
| PlatformOps | Hiding infrastructure | A platform run as a product | Build a platform, buy one, or neither |
| DevExOps | Removing waits for developers | Measuring friction | Whether “no ops” removed friction or moved pages |
| CloudOps | Shared responsibility, quotas, provider events | Governing the provider’s control plane | Sizing what remains |
| InfraOps | Infrastructure as code | The IaC lifecycle | IaC as a duty that survives managed services |
| KubernetesOps | Managed clusters | Upgrades and troubleshooting | What a managed control plane still leaves you |
| ITOps | Incidents, change, service levels | ITIL practices, CMDB, SLAs | Which practices remain (provider-driven change, supplier oversight) |
| ServerlessOps | Shedding operations | Cold starts, concurrency, retries | Whether serverless reduces operations for you |
| SRE | Toil, on-call, availability | SLOs and error budgets | How much of that work survives |
| AIOps | Self-running operations | ML on operational data | Testing “autonomous” claims |
| AutomationOps | Removing manual work | Safe automation | Automation as a destination of displaced work |
| FinOps | Pay-per-use economics | Financial operating model | Cost as a residual duty |
Principles and operating model
Link to section “Principles and operating model”A proposed charter and principles
Link to section “A proposed charter and principles”There is no official NoOps manifesto; this charter is this Atlas’s proposal (one-page version with goals in the templates). Mission: buy or automate undifferentiated operations; keep every remaining duty owned, measured and rehearsed.
- Displacement, not deletion. For every task a change “removes”, name the new owner.
- The always-retained band. Data, identities, configuration and access policies are yours in every model.[12][13]
- Own the critical path. In Charity Majors’s 2016 talk, as reported by InfoQ, “services are not magical pixie dust”; one of her top tips was to “own the critical path (and keep it short)”.[16]
- Design for provider failure. “A service cannot be more available than the intersection of all its critical dependencies.”[17]
- Operations is a property, not a team. “Operational excellence is not a role, it’s an emergent property.”[10]
- Keep decisions reversible. Know the exit cost before you depend on a service.
Non-goals: cutting headcount for its own sake; outsourcing accountability to an SLA. Accepted trade-off: lock-in, which “may be stronger with serverless computing than for serverful computing”.[11]
Building blocks of a low-ops system
Link to section “Building blocks of a low-ops system”Each block moves the line by a different amount; the linked pages teach the mechanics.
| Building block | Provider absorbs | You still own | Main risk | Exit cost |
|---|---|---|---|---|
| Self-managed on IaaS (SysOps) | Hardware, hypervisor | Guest OS patching and everything above[18] | Toil and hiring | Low |
| Managed Kubernetes (KubernetesOps) | Control plane; node OS patches, applied automatically only with auto-upgrade or a release channel (GKE example)[19] | Workloads, images, RBAC, upgrade policy; manual upgrades when auto-upgrades are postponed[19] | Kubernetes complexity | Moderate |
| PaaS and serverless containers (ServerlessOps) | OS, runtime platform, scaling | Code, dependencies, configuration; restarts (Heroku’s Cedar dynos restart “once every 24 hours (plus up to 216 random minutes)”, losing local files)[20][21] | Platform limits | Moderate |
| Functions (FaaS) | Servers, managed-runtime patching | Code, dependencies, quotas; major runtime upgrades, “a customer-driven operation” on Lambda[22][15] | Cost at steady volume; lock-in[11] | Moderate to high |
| Managed data (DBOps, BackupOps) | Infrastructure, engine operations | Data, backup strategy, access, schema[23] | Data gravity | Export-dependent |
| SaaS (IdentityOps) | Almost the whole application | Accounts, access, configuration, data[12] | Identity hygiene | Export-dependent |
| Internal platform (PlatformOps) | Whatever the platform team runs | Product teams keep code and on-call | Becomes a ticket queue | Internal |
Loops you keep, whatever you buy: change control as code (InfraOps), guardrails (CloudSecOps), user-facing SLIs (ObservabilityOps), routed signals, restore tests.
Roles, ownership and RACI
Link to section “Roles, ownership and RACI”NoOps redistributes roles rather than removing them (Case 1). In Team Topologies terms, stream-aligned teams own a flow of work and platform teams provide “a compelling internal product”.[24] A named, often rotating residual-ops owner keeps the registers current.
RACI for recurring residual duties (R responsible, A accountable, C consulted, I informed):
| Duty | Product team | Platform team | Security | FinOps / finance | Leadership |
|---|---|---|---|---|---|
| Runtime and dependency upgrades | R/A | C | I | — | I |
| Provider notices triage | R | A | C | I | — |
| Abuse and security notices | C | I | R/A | — | I |
| Quota headroom | R | A | — | — | I |
| Access reviews and secret rotation | R | C | A | — | I |
| Backup and restore tests | R/A | C | I | — | I |
| Provider-incident response | R/A | C | C | — | I |
| Cost review and anomalies | R | C | — | A | I |
| Exit-cost estimate and vendor review | C | R | C | C | A |
Lifecycle: Day 0, Day 1, Day 2
Link to section “Lifecycle: Day 0, Day 1, Day 2”| Phase | Activities | Exit criteria |
|---|---|---|
| Day 0: decide and design | Workload profile; register; work-and-coverage estimate; dependency availability; exit estimate; ADR | ADR approved; every duty owned; coverage agreed |
| Day 1: adopt and launch | IaC and guardrails; signals; budgets; quota alarms; SLIs; restore test; failure runbook | Launch checklist passed; first restore done; rota live |
| Day 2: operate and improve | Quarterly review; currency, quota and cost trends; game days | Decision reaffirmed or changed |
| Exit (when needed) | Export data; parallel run; decommission | Workload moved; lessons recorded |
Operating model and governance
Link to section “Operating model and governance”- Intake gate (template): what moves, what remains, who owns it, the failure plan, the exit cost.
- A responsibility register per service, with the code (format), reviewed quarterly.
- Signal routing to the owning team’s queue, not a shared mailbox.
- Escalation: product team → platform team → provider support, plus a second path, since AWS support case creation was impaired in December 2021 and October 2025.[25][26]
- Change control: provider-driven changes (deprecations, plan changes) are planned work with deadlines.
Architecture and workflow
Link to section “Architecture and workflow”Reference architecture
Link to section “Reference architecture”Diagram source (Mermaid)
flowchart TB
U["Users"] --> E["Managed edge and API"]
L1(["Yours: IaC and guardrails"]) --> E
L1 --> C
E --> C["Managed functions or containers"]
E -.-> L2(["Yours: SLIs and on-call"])
C --> D[("Managed data and queues")]
C -.-> L3(["Yours: provider, quota, cost signals"])
L4(["Yours: backups, restore tests"]) --> D
classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
class U,E,C,D neutral
class L1,L2,L3,L4 core
Text equivalent: Users reach a managed edge and API layer, then managed functions or containers, then managed data and queues (grey, provider-operated). Four customer-owned loops (green, labelled “Yours”) act on or receive signals from what they govern: IaC and guardrails act on the API layer and compute; SLIs and on-call watch the edge; provider, quota and cost signals come from compute; backups and restore tests act on the data.
Your side also includes throttling at the edge (an API layer can accept more requests than the functions behind it can run[15]), backup and versioning strategy,[23] and idempotency in queues. Alternative: at stable high load, reserved containers or managed Kubernetes, “a middle ground in this continuum”.[11]
End-to-end workflow
Link to section “End-to-end workflow”The core workflow estimates and assigns residual operations; in its exception path, an unownable duty changes the design.
Diagram source (Mermaid)
flowchart TB
T["Trigger: new service, migration or a NoOps proposal"] --> P["Profile workload: load, state, latency, regulation"]
P --> S["Choose candidate building blocks"]
S --> R["Map responsibility line using provider models"]
R --> I["List residual duties with frequency and effort"]
I --> O{"Every duty has an owner?"}
O -- "Yes" --> E["Estimate work hours and coverage"]
O -- "No" --> X{"Can we buy, automate or drop it?"}
X -- "Yes" --> I
X -- "No" --> RD["Redesign or choose another building block"]
RD --> S
E --> F{"Fits team capacity and risk appetite?"}
F -- "Yes" --> A["Record ADR, wire signals, launch"]
F -- "No" --> RD
A --> M["Measure residual hours, pages, currency, cost"]
M --> Q["Quarterly review"]
Q --> I
classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
class T,P,S,R,I,E,A,M,Q core
class O,X,F decision
class RD risk
Text equivalent: A trigger leads to profiling the workload, choosing building blocks, mapping the responsibility line and listing residual duties. An unowned duty is bought, automated or dropped, or the design changes. With every duty owned, the team estimates work and coverage; if that fits capacity and risk appetite it records an ADR, wires signals and launches, otherwise it redesigns. Measurement and a quarterly review feed back into the duty list.
Practices, frameworks and tools
Link to section “Practices, frameworks and tools”Core practices and playbooks
Link to section “Core practices and playbooks”The recurring practices (responsibility mapping, intake, signal routing, runtime currency, quota headroom, data protection, failure design, cost guardrails, exit readiness, automation ownership) have owners in the RACI, measures in the KPIs and a cadence in the checklists. Intake has the most leverage, so it gets a playbook.
Playbook: adopting a managed service
Link to section “Playbook: adopting a managed service”- Map the line from that specific service’s shared responsibility documentation; it differs by service.[27]
- List and estimate residual duties in the register: work and coverage.
- Wire signals and rehearse one restore and one provider-failure drill before launch.
- Accept when every duty has an owner, signals are tested and the exit cost is in the ADR.
- Contingency: keep the previous deployment path for one review cycle and a restored data export.
Methods, standards and frameworks
Link to section “Methods, standards and frameworks”There is no NoOps standard. The decision draws on NIST SP 800-145 for service models;[28] the providers’ shared responsibility and resiliency models for where the line sits (guidance, not contract: Microsoft calls its page “illustrative guidance”);[18][12][13][23] SLAs, which are contracts for service credits;[29][14] the Google SRE book and The Calculus of Service Availability for toil, on-call and dependencies;[6][30][17] Team Topologies for team shapes;[24] and, in the EU, the Data Act (Regulation (EU) 2023/2854) on switching.[31]
Tooling landscape
Link to section “Tooling landscape”Start with the jobs (building blocks), then judge products on limits, runtime policy, restart semantics, recovery, export paths and the vendor’s roadmap. Representative options as of October 2026: functions (AWS Lambda, Azure Functions); serverless containers and PaaS (Google Cloud Run, “a fully managed application platform”;[21] Azure App Service; Heroku, which announced in February 2026 that it is transitioning to a sustaining engineering model and has since shipped some updates[32][33]); managed Kubernetes (Google Kubernetes Engine[19]); managed data (Amazon DynamoDB, Azure SQL Database). Lock-in: function semantics and back-end services differ between providers;[11] portable layers cut exit cost but add operations.
Provider health signals compared
Link to section “Provider health signals compared”Each feed is a duty to route and read (as of October 2026); organisation-wide wiring belongs to CloudOps.
| Provider | Signal | How to route it | Caveats |
|---|---|---|---|
| AWS | AWS Health events in four categories (issue, accountNotification, scheduledChange, investigation), all of which AWS advises monitoring; abuse notifications arrive as a separate event type[34][35][36] |
EventBridge rules per Region: one for health events, one for abuse events (Lab 2)[37] | Backup copies go to US West (Oregon); global events only to US East (N. Virginia)[38] |
| Microsoft Azure | Service Health: service issues, planned maintenance, health advisories, security advisories[39] | Service Health alerts with action groups (e-mail, SMS, push, webhook, ITSM)[39] | Action group region must be “Global”; Resource Health alerts are separate[39] |
| Google Cloud | Personalized Service Health: incidents relevant to your projects or organisation[40] | Alerts on the events it logs in Cloud Logging; an API[40] | Check that your products and locations are supported[40] |
Automation and AI
Link to section “Automation and AI”Automation is a destination of displaced work, so operate it: an unowned rule or script becomes a hidden failure mode
(AutomationOps). It clearly helps with signal routing, currency scans, guardrails as code and
provider-assisted upgrades (AWS points Lambda customers moving to Java 21 or 25 to AWS Transform custom[22]), whose output
still needs review. Much triage needs no model: AWS Health events can carry an actionability value.[34] Any agent with
change permissions needs an owner, least privilege, audit logs and a kill switch; changes to data, identity and spend keep human
approval. AI agents sold as autonomous operations are assessed below.
NoOps in practice
Link to section “NoOps in practice”Reference implementation
Link to section “Reference implementation”The core artefact is a responsibility register with an estimator, one per service, next to its code: each duty has an owner,
frequency and effort; coverage says when someone must be reachable. Assumptions (illustrative): orders-api runs on a
managed API layer, functions and a managed NoSQL table, with business-hours paging and 120 productive hours per person per month.
Example status: verified by execution (Python 3.8.10, 2026-10-16) together with the script below.
{
"service": "orders-api",
"assumptions": {"productive_hours_per_person_month": 120},
"duties": [
{"id": "runtime-upgrades", "area": "runtime and dependencies", "owner": "orders-team", "per_month": 2, "hours_each": 3},
{"id": "provider-notices", "area": "provider change notices", "owner": "orders-team", "per_month": 4, "hours_each": 0.5},
{"id": "quota-review", "area": "quotas and limits", "owner": "platform-team", "per_month": 1, "hours_each": 1},
{"id": "cost-review", "area": "cost", "owner": "orders-team", "per_month": 1, "hours_each": 3},
{"id": "cost-anomalies", "area": "cost", "owner": "orders-team", "per_month": 0.5, "hours_each": 2},
{"id": "access-review", "area": "identity and access", "owner": "security-team", "per_month": 1, "hours_each": 2},
{"id": "secret-rotation", "area": "identity and access", "owner": "", "per_month": 0.33, "hours_each": 2},
{"id": "restore-test", "area": "data protection", "owner": "orders-team", "per_month": 0.33, "hours_each": 4},
{"id": "alert-tuning", "area": "observability", "owner": "orders-team", "per_month": 2, "hours_each": 1},
{"id": "provider-incidents", "area": "incident response", "owner": "orders-team", "per_month": 0.25, "hours_each": 4},
{"id": "compliance-evidence", "area": "compliance", "owner": "security-team", "per_month": 1, "hours_each": 2},
{"id": "vendor-admin", "area": "vendor management", "owner": "", "per_month": 1, "hours_each": 1.5},
{"id": "pipeline-iac-upkeep", "area": "delivery pipeline", "owner": "platform-team", "per_month": 2, "hours_each": 2}
],
"on_call": {"owner": "orders-team", "pages_per_week": 1.5, "hours_per_page": 1.5},
"coverage": {"reachable_hours_per_week": 45, "people_per_shift": 1, "max_share_of_weeks_on_call": 0.25},
"projects": [
{"id": "exit-plan-and-game-day", "owner": "orders-team", "hours": 24, "amortise_months": 12}
]
}
The estimator reports monthly work per duty and owner, and coverage (person-hours of being reachable, minimum rota); it exits with status 1 when a duty is unowned.
Example status: verified by execution (Python 3.8.10, 2026-10-16); the output below is the actual output.
"""Estimate the operations that remain after adopting managed services: work and coverage.
Usage: python3 residual_ops.py residual-ops.json
Standard library only. Prints monthly work hours per duty and per owner, an FTE equivalent,
and the coverage cost: person-hours of being reachable and the minimum rota size.
Exit code 1 if any duty has no owner.
"""
import json
import math
import sys
from collections import defaultdict
WEEKS_PER_MONTH = 52 / 12
def owner_of(item):
return (item.get("owner") or "").strip() or "UNOWNED"
def work_rows(inv):
rows = []
for d in inv.get("duties", []):
rows.append((d["id"], owner_of(d), float(d["per_month"]) * float(d["hours_each"])))
oc = inv.get("on_call")
if oc:
hours = float(oc["pages_per_week"]) * WEEKS_PER_MONTH * float(oc["hours_per_page"])
rows.append(("on-call-pages", owner_of(oc), hours))
for p in inv.get("projects", []):
rows.append((p["id"] + " (amortised)", owner_of(p), float(p["hours"]) / max(1, int(p["amortise_months"]))))
return sorted(rows, key=lambda r: r[2], reverse=True)
def main(path):
with open(path, encoding="utf-8") as fh:
inv = json.load(fh)
rows = work_rows(inv)
total = sum(r[2] for r in rows)
per_owner = defaultdict(float)
for _, owner, hours in rows:
per_owner[owner] += hours
capacity = float(inv["assumptions"]["productive_hours_per_person_month"])
print(f"Residual operations estimate for {inv['service']}")
print("WORK")
for duty, owner, hours in rows:
print(f" {duty:<34} {owner:<14} {hours:6.1f} h/month")
print(f" {'TOTAL':<34} {'':<14} {total:6.1f} h/month")
print(f" FTE equivalent (at {capacity:.0f} productive h/person-month): {total / capacity:.2f}")
for owner, hours in sorted(per_owner.items(), key=lambda kv: kv[1], reverse=True):
share = 100 * hours / total if total else 0.0
print(f" owner {owner:<20} {hours:6.1f} h/month ({share:4.1f}%)")
cov = inv.get("coverage")
if cov:
reach = float(cov["reachable_hours_per_week"]) * int(cov["people_per_shift"]) * WEEKS_PER_MONTH
rota = math.ceil(int(cov["people_per_shift"]) / float(cov["max_share_of_weeks_on_call"]))
print("COVERAGE")
print(f" reachable {cov['reachable_hours_per_week']} h/week x {cov['people_per_shift']} per shift"
f" = {reach:.0f} person-hours/month on call")
print(f" minimum rota at <= {float(cov['max_share_of_weeks_on_call']):.0%} of weeks on call: {rota} people")
if per_owner.get("UNOWNED"):
print(f"WARNING: {per_owner['UNOWNED']:.1f} h/month of duties have no owner")
return 1
return 0
if __name__ == "__main__":
if len(sys.argv) != 2:
sys.exit("usage: python3 residual_ops.py <inventory.json>")
sys.exit(main(sys.argv[1]))
$ python3 residual_ops.py residual-ops.json
Residual operations estimate for orders-api
WORK
on-call-pages orders-team 9.8 h/month
runtime-upgrades orders-team 6.0 h/month
pipeline-iac-upkeep platform-team 4.0 h/month
cost-review orders-team 3.0 h/month
provider-notices orders-team 2.0 h/month
access-review security-team 2.0 h/month
alert-tuning orders-team 2.0 h/month
compliance-evidence security-team 2.0 h/month
exit-plan-and-game-day (amortised) orders-team 2.0 h/month
vendor-admin UNOWNED 1.5 h/month
restore-test orders-team 1.3 h/month
quota-review platform-team 1.0 h/month
cost-anomalies orders-team 1.0 h/month
provider-incidents orders-team 1.0 h/month
secret-rotation UNOWNED 0.7 h/month
TOTAL 39.2 h/month
FTE equivalent (at 120 productive h/person-month): 0.33
owner orders-team 28.1 h/month (71.6%)
owner platform-team 5.0 h/month (12.7%)
owner security-team 4.0 h/month (10.2%)
owner UNOWNED 2.2 h/month ( 5.5%)
COVERAGE
reachable 45 h/week x 1 per shift = 195 person-hours/month on call
minimum rota at <= 25% of weeks on call: 4 people
WARNING: 2.2 h/month of duties have no owner
How to read it. About 39 hours a month, a third of a person, is the work; unowned duties are how “NoOps” stacks fail quietly. Coverage is larger: 195 person-hours a month of being reachable, and at least four people if nobody is on call for more than a quarter of their weeks. Google caps SRE on-call at 25% of time and, assuming week-long shifts, derives a minimum of eight engineers for a single-site 24/7 rota with a primary and a secondary;[30] on business-hours rotas, where people do project work between pages, a cap on weeks is a conservative proxy. Check the inputs: Google reports about 6 hours per on-call incident;[30] at that rate the total becomes about 68.5 hours (0.57 FTE).
Hands-on labs
Link to section “Hands-on labs”Lab 1 (beginner): build and estimate a responsibility register
Link to section “Lab 1 (beginner): build and estimate a responsibility register”Objective: a work-and-coverage estimate for one service, with unowned duties found. Prerequisites: Python 3.8 or later; no cloud account, cost or risk; under an hour.
- Save the reference register as
residual-ops.jsonand the estimator asresidual_ops.py. - Run
python3 residual_ops.py residual-ops.json. - Give both unowned duties an owner (for example
orders-team) and run again. - Change
coverageto{"reachable_hours_per_week": 168, "people_per_shift": 2, "max_share_of_weeks_on_call": 0.25}(24/7, primary and secondary) and run again. - Replace the example with your own service’s duties.
Expected output (checked by execution). Step 2: the reference output; echo $? prints 1. Step 3: no warning, exit 0, total
39.2 h/month, orders-team 30.2 h/month (77.1%). Step 4: work unchanged; coverage 1,456 person-hours a month, minimum rota 8.
Validation: every duty has an owner, and the people doing the work find the total plausible. Troubleshooting:
JSONDecodeError is often a trailing comma. Teardown: delete the directory, or commit the register.
Lab 2 (intermediate): audit and test provider-signal routing
Link to section “Lab 2 (intermediate): audit and test provider-signal routing”Objective: prove that every class of provider signal reaches an owner; test two AWS rules without deploying anything. Prerequisites: read access to your providers’ health settings; for step 3, AWS CLI v2 with credentials. No cost or risk. Status: step 3 not executed.
- Inventory. Per account or project, list the signal classes in the comparison table plus quota and budget alerts, and where each goes: a team queue, a person, a shared mailbox or nowhere.
- Trace. Who acknowledged the latest notice of each class, and how long after it arrived?
- Test the AWS rules. Save the two patterns below as
pattern-ops.jsonandpattern-abuse.jsonand the sample event assample-health-event.json, then run the script; it evaluates patterns without sending anything.[41] - Record. Every class that reaches nobody, or only a shared mailbox, becomes an owned duty in your register.
Why two rules. AWS Health sends two event types to EventBridge, AWS Health Event and AWS Health Abuse Event,[36]
and for security use cases AWS suggests focusing on “all AWS Health Abuse events”.[42] The operations rule filters no
category, since AWS calls it “a best practice that you monitor all event type categories”;[35] route pages on the optional
detail.actionability field.[34] It keeps only events whose backupEvent is “false”, which drops the copies AWS also
delivers to the backup Region, as AWS suggests.[38]
The abuse rule does not: the schema marks backupEvent as required for both types,[34] but no abuse-event sample confirms
it, so the worst case is a duplicate. Region coverage and deployment as code belong to CloudOps.
Example status: JSON syntax-checked; both patterns matched against the sample and its abuse variant with a local exact-match simulation (2026-10-16); not deployed; no AWS API called.
{
"source": ["aws.health"],
"detail-type": ["AWS Health Event"],
"detail": {"backupEvent": ["false"]}
}
{
"source": ["aws.health"],
"detail-type": ["AWS Health Abuse Event"]
}
{
"version": "0",
"id": "7bf73129-1428-4cd3-a780-95db273d1602",
"detail-type": "AWS Health Event",
"source": "aws.health",
"account": "123456789012",
"time": "2026-10-16T09:00:00Z",
"region": "eu-west-1",
"resources": ["arn:aws:lambda:eu-west-1:123456789012:function:orders-api"],
"detail": {
"eventArn": "arn:aws:health:eu-west-1::event/LAMBDA/AWS_LAMBDA_PLANNED_LIFECYCLE_EVENT/AWS_LAMBDA_PLANNED_LIFECYCLE_EVENT_EXAMPLE",
"service": "LAMBDA",
"eventTypeCode": "AWS_LAMBDA_PLANNED_LIFECYCLE_EVENT",
"eventTypeCategory": "scheduledChange",
"eventScopeCode": "ACCOUNT_SPECIFIC",
"communicationId": "example-communication-1",
"startTime": "Fri, 30 Apr 2027 00:00:00 GMT",
"lastUpdatedTime": "Fri, 16 Oct 2026 09:00:00 GMT",
"statusCode": "upcoming",
"eventRegion": "eu-west-1",
"eventDescription": [{"language": "en_US", "latestDescription": "Example: a runtime used by this function reaches end of support."}],
"affectedEntities": [{"entityValue": "arn:aws:lambda:eu-west-1:123456789012:function:orders-api", "lastUpdatedTime": "Fri, 16 Oct 2026 09:00:00 GMT", "status": "PENDING"}],
"page": "1",
"totalPages": "1",
"backupEvent": "false",
"affectedAccount": "123456789012",
"actionability": "ACTION_REQUIRED",
"personas": ["OPERATIONS"]
}
}
Example status: syntax-checked with bash -n; not executed (requires AWS credentials).
#!/usr/bin/env bash
set -euo pipefail
export AWS_REGION="eu-west-1" # any Region; the test creates nothing
# Same event with the abuse detail-type, to prove each rule catches only its own type.
sed 's/"AWS Health Event"/"AWS Health Abuse Event"/' sample-health-event.json > sample-abuse-event.json
for pattern in pattern-ops.json pattern-abuse.json; do
for event in sample-health-event.json sample-abuse-event.json; do
printf '%s + %s: ' "$pattern" "$event"
aws events test-event-pattern --event-pattern "file://$pattern" --event "file://$event" \
--query Result --output json
done
done
Expected output (local simulation; the AWS call was not made): true for each rule with its own event type, false for the
crossed pairs. Validation: with eventTypeCategory set to accountNotification the operations rule still matches; with
backupEvent “true” it does not; steps 1–2 pass when every signal class has a named owner. Troubleshooting:
InvalidEventPatternException means an invalid pattern;[43] an event error, a missing mandatory field (id, account,
source, time, region, resources, detail-type).[41] Teardown: delete the working files; nothing was created.
Lab 3 (advanced): provider-failure and exit tabletop
Link to section “Lab 3 (advanced): provider-failure and exit tabletop”Objective: test whether a managed-first service survives a hard dependency’s failure and whether its exit cost is known. Prerequisites: two hours with the team, residual-ops owner, security and finance; the dependency list; no production changes.
- Availability. Compare your hard dependencies’ SLA product and measured product with your SLO (worked calculation).
- Scenario A, regional disruption. “The primary Region’s managed database endpoint stops resolving; the status page has not updated.” Walk through the worked runbook.
- Scenario B, forced upgrade. “40% of functions use a runtime deprecated in 60 days; a security fix ships next week.” (See the deprecated-runtime risk under security.)
- Scenario C, exit. “A service you use will be retired in a year”, as Google Cloud IoT Core was in 2023.[44] Estimate the exit in person-weeks.
Expected output: an availability comparison, runbook gaps, a dated exit estimate. Validation: every gap has an owner and a date (an unknown dependency list is the first finding). Teardown: none; follow up in 30 days.
Use cases and scenarios
Link to section “Use cases and scenarios”Case 1: Netflix’s “NoOps” was reorganised operations (sourced)
Link to section “Case 1: Netflix’s “NoOps” was reorganised operations (sourced)”In 2012 Cockcroft wrote that “There is no ops organization involved in running our cloud”: developers deployed through a self-service portal and carried the pager, a reliability team would “never make changes to production applications”, and transferred ITops staff built base images. Yet “Netflix stil [sic] does Ops to run its datacenter DVD business.”[3] Lesson: the label rested on a platform, operations skills and developer on-call.
Case 2: Prime Video’s serverless design did not fit its load (sourced, secondary)
Link to section “Case 2: Prime Video’s serverless design did not fit its load (sourced, secondary)”InfoQ reports that Prime Video’s stream monitoring on AWS Step Functions and Lambda handled only “around 5% of the expected load”, hit an account limit on state transitions and was costly. The team “packed all of the components into a single process” on Amazon ECS on EC2 and reported “a 90% reduction in operational costs”, meaning running cost, not operations work (the original post has moved).[45] Lesson: the building block must fit the workload; this page adds that the team accepted more infrastructure to run for a lower unit cost.
Case 3: a fully managed SaaS still left identity with the customer (sourced)
Link to section “Case 3: a fully managed SaaS still left identity with the customer (sourced)”In 2024 Mandiant investigated a campaign (UNC5537) that stole data from Snowflake customer instances. It “has not found any evidence” of a breach of Snowflake’s enterprise environment; accounts “were not configured with multi-factor authentication”, unrotated credentials stayed valid for years, and network allow lists were missing.[46] Lesson: SaaS moves the line almost to the top, but identity hygiene stays yours.
Measuring, securing and paying for what remains
Link to section “Measuring, securing and paying for what remains”Metrics and KPIs
Link to section “Metrics and KPIs”| KPI | Definition / formula | Pitfall |
|---|---|---|
| Residual work | Σ(occurrences × hours each) + pages per week × 52/12 × hours per page + Σ(project hours ÷ amortisation months), per month | Drifts low |
| Coverage requirement | Reachable hours per week × people per shift; rota = people per shift ÷ maximum share of weeks on call | Confused with work |
| Unowned duty share | Unowned hours ÷ residual work (target 0) | A team name with no person |
| Page load per shift | Incidents ÷ shifts; Google’s upper bound is two per 12-hour shift[30] | Counting alerts, not incidents |
| Runtime currency | Function versions ≥ 180 days from deprecation ÷ all versions (Trusted Advisor or API) | Notices list only $LATEST and skip container images[22] |
| Quota headroom | 1 − (peak usage ÷ quota), per limiting quota | Checking one quota only[15] |
| Dependency availability | SLA-implied: Π(SLA); measured: Π(measured availability) | Treating the SLA product as a ceiling |
| Restore readiness | Days since the last timed restore, per store | Backups never restored |
| Total unit cost | (Bill + residual work × loaded hourly rate) ÷ business units (residual work includes amortised exit planning) | Leaving people time out |
Review work, coverage and unit cost quarterly, the rest monthly; ownership, currency, headroom and restores are leading indicators.
Diagram source (Mermaid)
flowchart TB
M["Measure: residual hours, pages, currency, headroom, unit cost"] --> C{"Classify each duty"}
C -- "Buyable" --> B["Buy"]
C -- "Repetitive" --> A["Automate, with an owner"]
C -- "Unneeded" --> X["Eliminate"]
C -- "Essential" --> K["Keep and rehearse"]
B --> V["Verify the duty moved and nothing new appeared"]
A --> V
X --> V
K --> V
V --> M
classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
class M,B,A,X,K,V core
class C decision
Text equivalent: Measure residual hours, pages, currency, headroom and unit cost; buy, automate (with an owner), eliminate, or keep and rehearse each duty; verify that it moved and that nothing new appeared, such as automation to maintain; measure again.
Worked calculations
Link to section “Worked calculations”1. SLA-implied versus measured availability. A request path uses a managed API layer (SLA 99.95% monthly), functions (99.95%) and a managed NoSQL table (99.99% for standard tables).[47][29][48] If each ran exactly at its SLA with independent failures: 0.9995 × 0.9995 × 0.9999 ≈ 99.89%, about 47.5 minutes of unavailability in a 30-day month, against 21.6 minutes for one 99.95% dependency. This is not a ceiling: AWS calls such a product “only likely to produce a rough order of magnitude calculation” and notes that a workload on two or three 99.99% dependencies “can still achieve 99.99% availability itself, or higher”.[49] The Calculus ceiling (principle 4) applies to actual availability:[17] the SLA product shows what the contracts support, the measured product what users get. If the latter misses your target, add mitigations (caches, graceful degradation) or dependencies with an extra nine.[17]
2. Total unit cost (illustrative). Bill 1,800 currency units a month; 39.2 residual hours at a loaded 90 an hour (3,528); 30 million requests: (1,800 + 3,528) ÷ 30 = 177.6 per million requests, 66% of it people time. The 39.2 hours already include 2 hours a month of amortised exit planning, so no separate exit reserve is added. Here people time outweighs the bill, which is why the “NoOps” pitch is really about people; at high, steady volume the balance can flip (Case 2). Vanity traps: “servers we manage: 0”, “percentage serverless”, “operations headcount”, “provider SLA met”.
Quality, security, privacy and compliance
Link to section “Quality, security, privacy and compliance”| Risk | Likelihood / impact | Mitigation | Owner |
|---|---|---|---|
| Credential-only access to a SaaS or data platform | Plausible; high (Case 3) | MFA or SSO; rotation; allow lists | Security |
| Over-privileged function, automation or agent roles | Common; medium–high | Least privilege per function or agent | Product team |
| Deprecated runtimes | Common; medium–high | Upgrade; after deprecation AWS “may no longer apply security patches”[22] | Product team |
| Data loss from a bad write | Plausible; high | Backup and versioning strategy are yours[23] | Product team |
| Abuse notice unread | Plausible; high | Route abuse events to security (Lab 2) | Security |
| Data in an unexpected jurisdiction | Plan-dependent | Choose Regions deliberately | Security / legal |
Auditability. Provider attestations cover the provider’s scope;[27] evidence for your configuration is a recurring duty (ComplianceOps); EU switching rules are under exit cost.
Cost, capacity and sustainability
Link to section “Cost, capacity and sustainability”Cost drivers change shape. The Berkeley paper names “Paying in proportion to resources used instead of for resources allocated” as a defining serverless trait and “Serverless computing can have unpredictable costs” as a pitfall;[11] at high, steady volume, per-use charges can exceed reserved capacity.[45]
Capacity becomes quota management. AWS documents 1,000 concurrent Lambda executions per Region by default and API Gateway’s default of 10,000 requests per second; it recommends load testing.[15]
Exit cost is a liability that grows with proprietary code and data, and providers change on their own schedule: Google Cloud IoT Core was discontinued in August 2023, and Heroku’s February 2026 announcement changed its roadmap.[44][32] In the EU (not legal advice), the European Commission states that the Data Act removes switching charges, including data egress charges for switching, from 12 January 2027 (cost-based charges are allowed until then);[31] that cuts transfer costs, not engineering work.
Sustainability. AWS lists “Use managed services” as a sustainability design principle, because shared services maximise utilisation;[50] treat it as directional (GreenOps).
Assurance of the operating model
Link to section “Assurance of the operating model”Service monitoring belongs to ObservabilityOps; this asks whether the residual duties get done.
- Register audit. Quarterly, sample three duties per service and check their evidence.
- Risk indicators that open an action (this Atlas’s thresholds): any unowned duty; headroom below 20%; restore older than 90 days; provider notice unacknowledged after 14 days; exit estimate older than 12 months.
- Signal health. Test the signal path twice a year; health events arrive at least once, so de-duplicate.[37]
When things go wrong
Link to section “When things go wrong”Common failures and troubleshooting
Link to section “Common failures and troubleshooting”| Symptom | Likely cause and diagnosis | Remediation | Prevention |
|---|---|---|---|
| A fix cannot be deployed to some functions | Runtime past deprecation[22] | Upgrade, test, deploy | Currency metric |
| Throttling at peak | Regional concurrency quota; check ClaimedAccountConcurrency (Max)[51] |
Quota increase; queueing | Headroom alarm; load tests |
| Bill spikes overnight | Runaway retries or recursion | Stop the loop; cap concurrency | Budgets and anomaly alerts |
| Data overwritten, no way back | Backup assumed to be the provider’s job | Restore what exists | Timed restore tests[23] |
| Users see errors, status page green | Status lags, or your configuration | Treat it as yours | Your own SLIs[25] |
Worked runbook: a managed dependency fails
Link to section “Worked runbook: a managed dependency fails”An illustrative scenario modelled on documented events. In October 2025 an empty DNS record for DynamoDB in us-east-1 caused API errors from 11:48 PM PDT on 19 October to 2:40 AM on 20 October; Lambda event processing and EC2, ECS, EKS and Fargate launches stayed impaired for hours, and the whole event ended at 2:20 PM PDT.[26] In December 2021 launches and DNS changes were impaired while running EC2 instances were unaffected.[25]
Diagram source (Mermaid)
sequenceDiagram
autonumber
participant U as Users
participant S as Service
participant O as On-call
participant P as Provider
U->>S: Requests
S-->>U: Errors, latency
S->>O: SLO burn alert
O->>P: Check health feed
O->>O: Declare, assign roles
alt Tested multi-Region design
O->>S: Fail over to another Region
else No tested failover
O->>S: Degrade: queue writes, serve cache
end
O-->>U: Status page update
O->>P: Open case if possible
P-->>O: Recovered
opt Service failed over
O->>S: Fail back
end
O->>S: Drain queues, watch throttling
O-->>U: Resolved, review scheduled
Text equivalent: Users see errors; an SLO burn alert reaches on-call, who checks the provider’s health feed and declares an incident. With a tested multi-Region design the service fails over; otherwise it degrades (queued writes, cached reads). On-call updates the status page and opens a provider case if possible. After recovery, a service that failed over fails back; either way queues are drained while throttling is watched, and users are told it is resolved.
- Detect from your SLO alert or synthetic check; the absence of a provider event is not evidence of health.
- Declare: incident commander and communications lead (IncidentOps); scope dependency, Region and user journeys from the register.
- Mitigate: degrade by feature flag, queue writes, serve cached reads, pause batch jobs, break retry storms. Fail over only to a tested design, and avoid actions that need the affected Region’s control plane, which was impaired in both events.[25][26]
- Communicate every 30 minutes on your own status page.
- Recover: fail back if you failed over; drain queues idempotently and watch throttling. In 2025, downstream recovery took hours longer than the DNS fault.[26]
- Learn: separate the provider’s root cause from your contributing factors; AWS places testing, including “game day practices”, on the customer’s side.[23]
Anti-patterns and myths
Link to section “Anti-patterns and myths”| Anti-pattern or myth | Why it fails | Warning signal | Do instead |
|---|---|---|---|
| “NoOps by announcement”: disbanding the ops team on migration day | Duties land on people without the skills or time | Pages bounce between teams | Redeploy operations skills, as Netflix did[3] |
| “The provider’s SLA is our SLO” | An SLA is a contract, not a measurement[14] | SLO equals one provider SLA | Set the SLO from user needs |
| “Managed means backed up” | Backup strategy remains yours[23] | No restore on record | Time a restore |
| “We can always migrate later” | Proprietary wiring and data gravity accumulate[44] | No exit estimate in any ADR | Exit estimate; tested export |
| “The AI agent is our ops team” | Automation fails at scale too; someone owns its permissions and mistakes[52] | Agent with write access, no owner | Review mode, least privilege, kill switch |
Deciding and adopting
Link to section “Deciding and adopting”When to use and when not to use
Link to section “When to use and when not to use”Pursue “less ops” (managed-first) when most of these hold:
- A common workload shape (web, API, events, batch) with spiky or low load, where pay-per-use and scale-to-zero help.[11][21]
- A small team whose scarce skill is product engineering; limits that fit with headroom; an exit cost you accept.
Avoid or limit it when:
- Load is high and steady, so reserved capacity is probably cheaper.[45]
- The workload needs exotic hardware, kernel settings, or runtime and maintenance control the provider lacks.
- Latency must be consistently low. The Berkeley paper calls it a fallacy that functions cannot serve low-latency applications, since they can be pre-warmed;[11] warm capacity is then a cost you pay.
- A provider retirement would be existential and the exit cost is unknown, or “NoOps” would remove operations skills rather than redeploy them.
A counterpoint. In 2022 David Heinemeier Hansson, co-owner and CTO of 37signals, called renting computers “(mostly) a bad deal” for medium-sized companies like his with stable growth: “The savings promised in reduced complexity never materialized”.[53] One company’s view, but a useful test: if your operations team would not shrink and load is stable, the managed premium needs another justification.
Decision framework
Link to section “Decision framework”Diagram source (Mermaid)
%%{init: {"flowchart": {"wrappingWidth": 120, "nodeSpacing": 24, "rankSpacing": 36}}}%%
flowchart TB
S["Workload to place"] --> Q1{"Sold as SaaS?"}
Q1 -- "Yes, data rules fit" --> SaaS["SaaS"]
Q1 -- "No" --> Q2{"Fits managed limits?"}
Q2 -- "No" --> SM["Self-managed or managed Kubernetes"]
Q2 -- "Yes" --> Q3{"Load high and steady?"}
Q3 -- "No" --> MF["Managed-first: PaaS or functions"]
Q3 -- "Yes" --> Q4{"Cheaper on reserved capacity?"}
Q4 -- "No" --> MF
Q4 -- "Yes" --> CT["Reserved containers or Kubernetes"]
SaaS --> Q5{"Duties owned, coverage affordable?"}
SM --> Q5
MF --> Q5
CT --> Q5
Q5 -- "Yes" --> GO["Adopt; wire signals; record ADR and exit cost"]
Q5 -- "No" --> RD["Not yet: redesign, cut coverage needs or staff up"]
classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
class S,SaaS,SM,CT,MF,GO core
class Q1,Q2,Q3,Q4,Q5 decision
class RD risk
Text equivalent: A standard business function sold as SaaS goes to SaaS if data rules fit (you keep identity, configuration, data and export). A workload outside managed limits (with headroom) goes self-managed or to managed Kubernetes. Spiky or low load goes managed-first (PaaS, serverless containers or functions); high, steady load goes to reserved containers or Kubernetes only if that is cheaper by total unit cost. Every option then passes one check: adopt only if the remaining duties are owned and coverage is affordable; otherwise redesign, reduce coverage needs or staff up.
When options are close, use a weighted matrix (illustrative): a spiky customer-facing API, five-person team, moderate compliance; scores 1 (poor) to 5 (good); weighted score = Σ(weight × score) ÷ 5, out of 100.
| Criterion (weight) | Self-managed (VMs or Kubernetes) | Managed containers or PaaS | Functions + managed data | SaaS product |
|---|---|---|---|---|
| Team capacity for operations (25) | 1 | 4 | 5 | 5 |
| Fit to load shape (20) | 3 | 4 | 5 | 4 |
| Control and compliance needs (20) | 5 | 4 | 3 | 2 |
| Total unit cost at expected volume (20) | 3 | 4 | 4 | 3 |
| Exit cost tolerance (15) | 5 | 4 | 2 | 2 |
| Weighted score | 64 | 80 | 79 | 67 |
PaaS and functions tie and the extremes drop out; weight exit cost higher and PaaS wins, weight team capacity higher and functions do. Record the weights in the ADR.
Maturity model
Link to section “Maturity model”These levels are this Atlas’s model; no official one exists. The diagram adds proposed regression triggers, because this maturity is easily lost.
Diagram source (Mermaid)
flowchart TB L0["Level 0: NoOps by assertion"] --> L1["Level 1: Owners named"] L1 --> L2["Level 2: Signals and recovery proven"] L2 --> L3["Level 3: Remainder engineered"] L3 --> L4["Level 4: Low-ops by design"] L2 -. "Unowned duty found in an incident" .-> L1 L3 -. "Restore or signal test fails" .-> L2 L4 -. "Service adopted without intake" .-> L3 L1 -. "Reorganisation leaves registers stale" .-> L0 classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029 classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029 classDef core fill:#e8f3f2,stroke:#16756f,color:#122029 class L0 risk class L1,L2 neutral class L3,L4 core
Text equivalent: Solid arrows lead from Level 0 (NoOps by assertion) to Level 4 (low-ops by design). Dotted arrows show regressions: stale registers after a reorganisation (Level 1 to 0); an unowned duty found in an incident (2 to 1); a failed restore or signal test (3 to 2); a service adopted without intake (4 to 3).
| Level | Observable behaviour | Exit criteria |
|---|---|---|
| 0. NoOps by assertion | “The provider handles it”; duties found in incidents | Registers for the top five services |
| 1. Owners named | Registers for top services; basic budgets and alerts | Every duty of every service has a named owner |
| 2. Signals and recovery proven | Zero unowned duties; signals routed and tested; restore log | Runtime currency ≥ 95%; two quarterly reviews held |
| 3. Remainder engineered | Residual hours and pages tracked; toil automated with owners; game days | Residual hours flat as services grow |
| 4. Low-ops by design | Intake requires residual estimate, failure plan and exit cost | Sustain; periodic external review |
Assess per product area; Level 2 suits most organisations.
Adoption roadmap: 30/60/90 days
Link to section “Adoption roadmap: 30/60/90 days”For an organisation already running some managed services, led by a part-time residual-ops owner:
| Window | Goals | Activities | Metrics at the end |
|---|---|---|---|
| Days 1–30: see the remainder | Duties visible | Registers for the top five services (Lab 1); dependency list; runtime inventory; SaaS accounts without MFA | Unowned hours; runtime currency |
| Days 31–60: own and wire | Every duty owned; signals routed | Owners; signal audit (Lab 2); quota alarms; a timed restore per data store; intake form | Zero unowned duties; restore readiness |
| Days 61–90: rehearse and decide | Resilience and reversibility | Tabletop (Lab 3); degraded-mode runbooks; exit estimates for the top three dependencies; first quarterly review | Residual baseline; exit estimates |
Toolkit
Link to section “Toolkit”Checklists
Link to section “Checklists”Preflight before adopting a managed service
Link to section “Preflight before adopting a managed service”- Shared responsibility page summarised; quotas checked against peak, with headroom.
- Residual duties owned and estimated; coverage stated; failure plan written.
- Data location, backup and export path confirmed; exit cost in the ADR.
- MFA or SSO, credential rotation and least-privilege roles designed in.
Launch readiness
Link to section “Launch readiness”- Signals deployed as code and tested in every used Region: health and abuse events, budgets, quota alarms, SLIs.
- Synthetic checks independent of the provider’s status page; rota and escalation path, including a second path.
- One timed restore done; degrade-versus-fail-over rules and dependency-failure runbook written.
Quarterly review
Link to section “Quarterly review”- Unowned duties at zero; residual hours, coverage and pages against the trend.
- Runtime currency across all versions; quota headroom; unit cost including people time.
- Provider incidents and roadmap announcements reviewed.
- Every automation and agent has an owner and a kill switch.
Templates
Link to section “Templates”One-page low-ops charter
Link to section “One-page low-ops charter”LOW-OPS CHARTER — <product area> Owner: <name> Review: quarterly
Mission: Buy or automate undifferentiated operations; own the remainder explicitly.
Scope: Services <list>. Out of scope: <list>.
Principles: Displacement not deletion · Always-retained band (data, identity, config, access)
· Design for provider failure · Measure the remainder · Keep decisions reversible.
Goals: 0 unowned duties · runtime currency >= <target>% · restore test <= 90 days old
· exit estimate <= 12 months old · residual work and coverage tracked per service.
Coverage: Paging hours: <business hours | 24/7>. Rota: <names/size>. Max share of weeks on call: <x>%.
Non-goals: Cutting operations skills; adopting abstractions for their own sake;
treating provider SLAs as our SLOs.
Decision rights: Adopting a new managed service requires an intake form and an ADR.
Managed-service intake form
Link to section “Managed-service intake form”MANAGED-SERVICE INTAKE — <service name> for <workload> Date: <YYYY-MM-DD>
1. Job to be done and alternatives considered:
2. Provider responsibility (link to provider's shared responsibility page):
3. Residual duties (area · owner · frequency · effort) and coverage needed:
4. Limits and quotas that could bind (value · our peak · headroom):
5. SLA · measured availability · our SLO · mitigation if it fails:
6. Data: classification · location · backup · export path tested? (Y/N)
7. Security: identity model · MFA/SSO · least-privilege roles · audit logs:
8. Cost: pricing basis · expected monthly cost · budget alert:
9. Exit cost: person-weeks · money · biggest unknown:
10. Decision · approver · review trigger:
Architecture decision record: buy versus run
Link to section “Architecture decision record: buy versus run”ADR-<nnn>: <Use managed X | Run Y ourselves> for <workload>
Status: proposed | accepted | superseded by ADR-<nnn> Date: <YYYY-MM-DD>
Context: Workload profile; team capacity; compliance; volume forecast and horizon.
Options: 1) ... 2) ... 3) ... (scores from the weighted matrix, with weights)
Decision: <option>, because <evidence>.
Residual operations: work <hours/month>; coverage <hours/week, rota size>; owners <names>.
Dependency availability: SLA-implied <x>%, measured <y>%; mitigations: <list>.
Exit cost: <person-weeks, money>; export path: <tested on date>.
Consequences: what gets easier, what gets harder, what we will monitor.
Revisit when: <volume, price, regulation, limit, or provider roadmap trigger>.
Quarterly residual-ops review
Link to section “Quarterly residual-ops review”RESIDUAL-OPS REVIEW — <area> — <quarter> Attendees: <names>
Per service: residual h/month (trend) · coverage · pages/shift · unowned duties · runtime currency
· quota headroom · restore age · unit cost · provider incidents · exit-cost age
Top 3 duties by hours -> decision: buy | automate | eliminate | keep (owner, date)
Provider notices and roadmap changes received / acknowledged / overdue:
Risks above threshold and actions:
Decisions changed since last review (ADR links):
Scorecard
Link to section “Scorecard”| Dimension | Red | Amber | Green |
|---|---|---|---|
| Ownership | Any unowned duty | Owned by teams | Owned by named people |
| Currency | Past deprecation | Inside 180 days | Beyond 180 days |
| Restores | None | Older than 90 days | Within 90 days |
| Provider signals | Not routed | Some, e-mail only | All, as code, tested |
| Exit readiness | No estimate | Older than 12 months | Current, export tested |
Is NoOps real? As a direction, yes; as a literal state, no. Even its originator expected “Ops” to run the infrastructure.[1]
Does NoOps mean developers do all the operations? Often, for their own services; it works only when they have the skills, time and authority to run production.
We outsource operations to a managed service provider. Are we NoOps? No: you bought operations. Oversight and accountability stay with you, and the exit cost now includes what the provider knows.
Our platform team answers every production page. Did we just rename the ops team? Probably. The CNCF Platforms White Paper says a platform team “doesn’t necessarily run compute, network, storage or other services” and that an internal platform “should rely on externally-provided services and capabilities as much as possible”.[54] A platform team carrying every pager is a relabelled ops team.
Is a solo developer on a PaaS the case where NoOps is literally true? It is the closest: with no coverage promise, the remainder can be a few hours a month, but it includes data, identities, upgrades, cost and exit. When Heroku stopped offering free plans and began shutting down free dynos and data services from 28 November 2022,[55] keeping a hobby app running meant paying or moving.
Going further
Link to section “Going further”Advanced topics and emerging direction
Link to section “Advanced topics and emerging direction”Autonomous operations (the second meaning). Google’s SRE book describes automation evolving from none, through externally maintained and then built-in automation, to “Systems that don’t need any automation”, where “The database notices problems, and automatically fails over without human intervention”; it adds that “sometimes manual operations are unavoidable”.[52] That top level is the technical NoOps ideal, reached one failure mode at a time, not bought. The same chapter shows automation failing at scale: a decommissioning workflow read an empty machine list as “everything” and, within minutes, wiped the disks of all machines in Google’s CDN; users were served from Google’s own datacentres, and very few noticed.[52]
AI operations agents (as of October 2026). AWS made AWS DevOps Agent generally available on 31 March 2026, calling it “your always-available operations teammate”; it investigates incidents and can “suggest code-level fixes as part of mitigation plans”, and its improvement figures come from preview customers and partners.[56] Microsoft’s Azure SRE Agent offers a review mode, in which the “Agent proposes an action; you approve or deny”, and an autonomous mode; Microsoft recommends review for production incidents and security alerts and advises: “Start with review mode.”[57] This page’s reading: such agents shorten investigation, Microsoft’s guidance keeps a person in the loop for production changes, and someone still owns each agent’s permissions and mistakes. Separate established automation (event routing, autoscaling, managed patching), real but limited practice (agent investigations, remediation proposed for approval) and speculative claims (fully autonomous production incident resolution).
The serverless boundary keeps moving. As of October 2026 AWS documentation refers to “Lambda Event Functions (previously known as Lambda functions)” and lists further compute types (Lambda Managed Instances, Web Functions, MicroVMs) with their own quotas and security controls;[22][15][27] map the line per compute type.
Learning path
Link to section “Learning path”- Beginner: read to the decision framework; then the CNCF Serverless Whitepaper and Majors’s essay; shadow an on-call rotation; continue with ServerlessOps.
- Practitioner: Lab 1 on a real service, then Lab 2 and the SRE book on toil, on-call and automation; run the 30-day roadmap for one area; continue with PlatformOps or AutomationOps.
- Leader or architect: the judgement call, then Lab 3 with one team; introduce the intake form and a coverage policy; continue with FinOps and SRE.
Wrap-up
Link to section “Wrap-up”Executive recap and cheat sheet
Link to section “Executive recap and cheat sheet”| Topic | What to remember |
|---|---|
| Definition | An aspiration to buy and automate operations; “low-ops” is the owned, realistic version. |
| Essential practices | Register; all provider signals routed; restore tests; failure design; exit estimates. |
| Always yours | Data, identities, configuration, access; the response when the provider fails. |
| Metrics | Residual work, coverage, unowned duties, runtime currency, quota headroom, total unit cost. |
| Watch-outs | NoOps by announcement; SLA as SLO; “managed means backed up”; password-only SaaS; unpriced exit; unowned agents. |
| Next actions | Draft one register; route provider notices; enforce MFA; time one restore. |
A judgement call: hire an ops engineer or go managed-first?
Link to section “A judgement call: hire an ops engineer or go managed-first?”Situation (illustrative). A 12-engineer company runs six services; whoever is awake handles incidents. The CTO can make one hire: Option A, a dedicated operations or platform engineer, or Option B, no hire, managed-first (“NoOps”) with the remainder spread across product engineers. A large customer wants 24/7 support; two services hold regulated data; load is spiky.
Residual work after migration, by the Lab 1 method:
| Component | Assumption | Hours per month |
|---|---|---|
| Two larger services | Lab 1 rate without its shared and compliance lines: 29.7 h each (includes 9.75 h of pages) | 59.5 |
| Four smaller services | Half the Lab 1 rate | 59.5 |
| Shared duties (pipeline, vendors, exit planning) | Twice Lab 1’s 7.5 h | 15.0 |
| Compliance evidence | Lab 1’s 2 h plus 3 h per regulated service | 8.0 |
| Total (central estimate) | 142, about 1.2 FTE |
Sensitivity: about 122 hours if the smaller services need a third of the Lab 1 rate, about 201 if all six match it: one to one and three-quarter people of work.
The attractive choice and why it can be wrong. Option B looks cheaper, and the migration is probably right, but it fails three ways: about 140 hours a month is 12 hours per engineer competing with features; the 24/7 clause needs a rota (at Google’s 25% cap, eight people with a primary and a secondary, or four with a primary only, by this page’s arithmetic[30]), so a third to two-thirds of the company would carry night pages; and regulated data adds evidence work nobody owns by default. Option A has its own trap: one operations hire can become a new silo, and one person cannot cover 24/7.
Recommendation. Separate work from coverage. Work can be distributed if every duty has an owner; coverage depends on whether the contract needs 24/7 response or 24/7 availability with graceful degradation. Migrate managed-first and hire a platform engineer who owns the paved road, signals, registers and shared duties, not “operations for everyone”; product teams stay on call in business hours. If true 24/7 response is needed, price it in and staff a rota or a follow-the-sun partner. Uncertainty: the estimate could be off by half; without the 24/7 clause, Option B alone is reasonable.
Learning objectives and mastery check
Link to section “Learning objectives and mastery check”After this page you should be able to explain why NoOps is aspirational and its two meanings; map a service’s responsibility line; estimate residual work and coverage; design signals and failure handling; and evaluate whether “less ops” fits a workload. Self-check:
- “We moved to a fully managed database, so backups are the provider’s problem.” What is wrong?
Show answer for question 1
AWS assigns the customer the “resiliency of your data including backup, versioning, and replication strategies”.[23] Durable storage does not undo your own bad writes; prove recovery with a timed restore.
- Your request path depends on services with SLAs of 99.95%, 99.95% and 99.99%. Is a 99.95% SLO achievable?
Show answer for question 2
- On a managed function runtime, which remain yours: (a) minor runtime patches, (b) a new major language version, © dependency updates, (d) rebuilding container-image functions on new base images?
Show answer for question 3
(b), © and (d). AWS applies managed-runtime updates automatically by default (a), but major-version moves are “a customer-driven operation”, and dependencies and container images are yours to update and rebuild.[22]
- Lab 1 shows 39 hours a month of work. The CEO concludes the team needs “a third of an ops person”. What is missing?
Show answer for question 4
Coverage. Business-hours paging with a 25% cap on weeks on call needs at least four people; 24/7 with a primary and a secondary needs eight, Google’s single-site minimum.[30] The alternative to staffing is to reduce what must page at night.
- A teammate proposes a health-event rule that matches only
issueandscheduledChange“to cut noise”. What do you say?
Show answer for question 5
AWS calls monitoring all categories a best practice, and account notifications, such as a public S3 bucket, “might require urgent
action from you”;[35] Lambda shows deprecation notices under “Other notifications”.[22] Route every category, plus abuse events (a separate event type, for security);[36] cut noise
by routing on actionability, with a catch-all.[34]
Conclusion
Link to section “Conclusion”NoOps began as a provocation and was softened within months; even at Netflix, people built the platform and carried pagers. Operations without humans is now sold again with AI agents, and the conclusion holds: operations moves up the stack and into new hands. It does not leave.
The useful version of NoOps is a discipline of honesty: buy what a provider does better, automate what is repetitive and safe, name an owner for each remaining duty, count work and coverage, rehearse the failures you cannot buy away, and know the cost of leaving. Teams that skip it get the operations anyway, at the worst possible time.
Sources and further reading
Link to section “Sources and further reading”Every source below was opened on 2026-10-16; dates are the source’s own. Claim-level support is in the Atlas evidence ledger
(research/noops-ledger.md).
Changelog. 2026-10-16, r1: revised after independent review (origins, two meanings, signals, coverage, estimates). r2: minimal AWS rule, provider-neutral lab, redrawn diagrams, neighbour rows, boundary-case FAQ. r3: regrouped into 13 parts (Blueprint v2); abuse events routed; Figures 5 and 6 corrected; GKE qualifier; AI operations agents added; repetition cut; AWS quota and budget details handed to CloudOps. r3 follow-up (orchestrator): Majors attribution (“one of her top tips”); Lab 2 backup-event wording clarified.
I Don’t Want DevOps. I Want NoOps. (archived copy) — Mike Gualtieri, Forrester blog, 2011-02-08; the original URL now returns HTTP 404, Internet Archive snapshot of 2026-04-20. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Augment DevOps With NoOps (trend report summary) — Mike Gualtieri, Glenn O’Donnell, Forrester, 2011-04-26. Checked 2026-10-16. ↩︎ ↩︎
Ops, DevOps and PaaS (NoOps) at Netflix — Adrian Cockcroft, 2012-03-19 (with a later, undated update). Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
What is NoOps (no operations)? — Rahul Awati, TechTarget, 2023-03-22. Checked 2026-10-16. ↩︎ ↩︎
NoOps: IT Operations Getting Closer to Automated Future — Christopher Tozzi, Data Center Knowledge, 2022-01-07. Checked 2026-10-16. ↩︎
Eliminating Toil — Site Reliability Engineering (Google, O’Reilly, 2016). Checked 2026-10-16. ↩︎ ↩︎
Flexible infrastructure — DORA, updated 2026-06-18. Checked 2026-10-16. ↩︎
CNCF Serverless Whitepaper v1.0 — CNCF Serverless Working Group, 2018-02-14. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Reply to “Ops, DevOps and NoOps at Netflix” — John Allspaw, GitHub Gist, 2012-03-20. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
WTF is operations? #serverless — Charity Majors, 2016-05-31. Checked 2026-10-16. ↩︎ ↩︎
Cloud Programming Simplified: A Berkeley View on Serverless Computing — Eric Jonas et al., UC Berkeley, arXiv:1902.03383, 2019-02-09. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Shared responsibility in the cloud — Microsoft Learn, updated 2026-08-24. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Shared responsibilities and shared fate on Google Cloud — Google Cloud, updated 2023-08-21. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Service Level Objectives — Site Reliability Engineering (Google, O’Reilly, 2016). Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Lambda quotas — AWS documentation. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Serverless Operations is Not a Solved Problem — Chris Swan, InfoQ, 2016-10-28. Checked 2026-10-16. ↩︎
The Calculus of Service Availability — Ben Treynor, Mike Dahlin, Vivek Rau, Betsy Beyer, ACM Queue 15(2), 2017. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Shared Responsibility Model — Amazon Web Services, undated. Checked 2026-10-16. ↩︎ ↩︎
GKE shared responsibility — Google Cloud, updated 2026-10-13. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Dyno Restarts — Heroku Dev Center, updated 2025-09-11. Checked 2026-10-16. ↩︎
What is Cloud Run — Google Cloud, updated 2026-10-13. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Lambda Event Function runtimes — AWS documentation. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Shared Responsibility Model for Resiliency — AWS Well-Architected Framework, Reliability Pillar. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Key Concepts — Team Topologies, undated. Checked 2026-10-16. ↩︎ ↩︎
Summary of the AWS Service Event in the Northern Virginia (US-EAST-1) Region — Amazon Web Services, 2021-12-10. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎
Summary of the Amazon DynamoDB Service Disruption in the Northern Virginia (US-EAST-1) Region — Amazon Web Services, October 2025. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎
Security in AWS Lambda — AWS documentation. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
The NIST Definition of Cloud Computing (SP 800-145) — Peter Mell, Tim Grance, NIST, 2011-09. Checked 2026-10-16. ↩︎
AWS Lambda Service Level Agreement — Amazon Web Services, updated 2022-05-05. Checked 2026-10-16. ↩︎ ↩︎
Being On-Call — Site Reliability Engineering (Google, O’Reilly, 2016). Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Data Act explained — European Commission, updated 2025-12-15. Checked 2026-10-16. ↩︎ ↩︎
An Update on Heroku — Nitin T Bhat, Heroku, 2026-02-06. Checked 2026-10-16. ↩︎ ↩︎
October 2026 Update: Heroku Innovations and New Features — Keshav Pokkuluri, Heroku, 2026-10-07. Checked 2026-10-16. ↩︎
Reference: AWS Health events Amazon EventBridge schema — AWS documentation. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Concepts for AWS Health — AWS documentation. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
AWS Health events — Amazon EventBridge Events Reference. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Monitoring events in AWS Health with Amazon EventBridge — AWS documentation. Checked 2026-10-16. ↩︎ ↩︎
Creating EventBridge rules for AWS Region coverage — AWS documentation. Checked 2026-10-16. ↩︎ ↩︎
Create Service Health alerts for Azure service notifications — Microsoft Learn, updated 2026-03-31. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Personalized Service Health overview — Google Cloud, updated 2026-10-14. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
aws events test-event-pattern — AWS CLI Command Reference. Checked 2026-10-16. ↩︎ ↩︎
Configuring an EventBridge rule to send notifications about events in AWS Health — AWS Health User Guide. Checked 2026-10-16. ↩︎
TestEventPattern — Amazon EventBridge API Reference. Checked 2026-10-16. ↩︎
Google Cloud to retire IoT Core service in 2023 — Praharsha Anand, ITPro, 2022-08-18. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Prime Video Switched from Serverless to EC2 and ECS to Save Costs — Rafał Gancarz, InfoQ, 2023-05-03. Checked 2026-10-16. ↩︎ ↩︎ ↩︎
UNC5537 Targets Snowflake Customer Instances for Data Theft and Extortion — Mandiant, Google Cloud Blog, 2024-06-10 (updated 2024-06-17). Checked 2026-10-16. ↩︎
Amazon API Gateway Service Level Agreement — Amazon Web Services, updated 2022-05-05. Checked 2026-10-16. ↩︎
Amazon DynamoDB Service Level Agreement — Amazon Web Services, updated 2025-05-14. Checked 2026-10-16. ↩︎
Availability with dependencies — AWS whitepaper “Availability and Beyond”. Checked 2026-10-16. ↩︎ ↩︎
Design principles for sustainability in the cloud — AWS Well-Architected Framework, Sustainability Pillar. Checked 2026-10-16. ↩︎
Types of metrics for Lambda functions — AWS documentation. Checked 2026-10-16. ↩︎
The Evolution of Automation at Google — Niall Murphy with John Looney and Michael Kacirek, Site Reliability Engineering (Google, O’Reilly, 2016). Checked 2026-10-16. ↩︎ ↩︎ ↩︎
Why we’re leaving the cloud — David Heinemeier Hansson, 2022-10-19. Checked 2026-10-16. ↩︎
CNCF Platforms White Paper — CNCF TAG App Delivery, v1.0. Checked 2026-10-16. ↩︎
Heroku’s Next Chapter — Bob Wise, Heroku, 2022-08-25. Checked 2026-10-16. ↩︎
Announcing General Availability of AWS DevOps Agent — Madhu Balaji, AWS Cloud Operations Blog, 2026-03-31. Checked 2026-10-16. ↩︎
Run modes in Azure SRE Agent — Microsoft Learn, 2026-06-02. Checked 2026-10-16. ↩︎