You know the drill. The alert goes off at 3 a.m., you pull up the runbook, and the first step says ssh into the bastion—but the bastion's DNS is broken. Second step: check the config diff. Diff against what? The runbook doesn't say. So you're staring at a document that was meant to save you, but it's just another broken thing in a chain of broken things.
Most wander remediation runbooks are written in calm times. They're thorough, they're accurate, and they're useless when it counts. Because a runbook that assumes a clean terminal, a patient mind, and a network that behaves is not a runbook—it's a corpse. This article is about writing runbooks that survive first contact with an actual outage. Not perfect ones. Just ones that get used.
Who Actually Needs wander Runbooks (and What Dies When They're Missing)
On-Call Engineers and SREs Who Wake Up to a Pager
The pager goes off at 3:17 AM. Not the fake test alert—the real one. Your phone glows with a wander alert that says Nginx config mismatch, and you're supposed to know what to do with that. You don't. The runbook that promised “rollback to last known good” lives somewhere in a Confluence page that was last edited when Kubernetes was still a baby. So you improvise. You SSH into a box that shouldn't exist anymore, and you patch a live system with the same confidence you'd use to defuse a bomb while wearing mittens.
That's the audience for slippage runbooks: the exhausted human who owns the 4 AM window. Not the architect who designed the system on a whiteboard. Not the CTO who approved the budget. The person whose job depends on doing the right thing before
coffee kicks in. What dies without a runbook? The change window. The incident response SLA. The engineer's confidence—and sometimes their weekend.
The specific failure mode is telling: you spend forty minutes reverse-engineering what the creep actually means, then another thirty deciding which state is correct, and by the time you act, the incident has escalated from “yellow” to “critical.” The runbook isn't a formality. It's the difference between a controlled correction and a desperate gamble.
Platform Teams That Hand Off Infrastructure to Junior Staff
Most slippage runbooks get written by the people who built the infrastructure. They make sense at 2 PM on a Tuesday, sitting next to the author. The catch is that the person who actually runs the procedure is a junior engineer who just joined, or a contractor who's never seen your Terraform state, or a support analyst who's been told “just follow the steps.” Without a runbook, that handoff becomes a game of telephone where the message is “I think it's fine, maybe restart the pod?”
The concrete cost here is the handoff tax—the hours burned when knowledge lives in one person's head and the incident doesn't wait for them to wake up. I have watched a platform team spend a week building slippage detection, then send a terse Slack message telling everyone “the runbook is in the repo.” The repo had a README with two links and a joke. The junior engineer on call that weekend did the only thing that made sense: they pushed a “fix” that made the creep worse, because nobody had told them which state was canonical.
What dies is the division of labor. The senior engineer can't be everywhere; the junior can't infer what was never written down. A runbook that names the system, the expected state, and the exact steps to verify it turns a mystery into a checklist.
Auditors and Compliance Officers Who Ask “Show Me the Procedure”
Then there's the quieter audience—the auditor who doesn't care about your YAML indentation but does care about evidence. creep is a control failure. When the auditor asks “how do you detect and remediate unauthorized changes?” and you answer with “we have alerts,” you have just failed the review. What they want is the procedure on paper, before the incident happens.
Without a runbook, the audit turns into a series of uncomfortable silences. You can't produce a document that shows the remediation steps, the responsible team, and the verification criteria. The auditor writes a finding; the finding becomes a remediation plan; the remediation plan becomes more meetings. That's not a technical problem—it's a paper problem that costs weeks.
Don't mistake this for bureaucracy for its own sake. The runbook is the artifact that proves you've thought about the failure mode before it happens. It's the difference between “we handle wander reactively” and “here is the procedure we follow, here is who approves the rollback, here is how we verify the fix.”
“The runbook is your defense against the question you can't answer at 4 AM: what exactly did we intend to run here?”
— a senior SRE who has been woken up one too many times
So who actually needs wander runbooks? Everyone who touches the system after it drifts. The on-call engineer needs step-by-step sanity. The junior needs guardrails. The auditor needs proof. And the platform team needs a way to sleep through the night without being woken by a phone call that could have been a five-minute fix.
Before You Write: What to Settle So the Runbook Isn't Fiction
Know Your creep Sources Before You Trust the Term
Most teams write runbooks for the wander they can see—the Terraform plan that shows three resources changing. The slippage that wakes you at 3 AM is rarely that tidy. I have chased ghosts through cloud consoles only to find the source was a developer running a manual script against production, bypassing the pipeline entirely. That's a creep source, and your runbook needs to name it. If you have not logged where creep actually originates—CI reruns, hotfixes, leftover click-ops, API retries that mutate state—you're writing fiction with a header.
List your sources honestly. The cloud provider's eventual consistency can create phantom diffs that resolve themselves in minutes. Ignore those. Manual schema changes from a DBA who "knows better" are real. So are scheduled jobs that touch state outside your IaC. One team I worked with discovered their monitoring agent was rewriting a tag every hour—clean, deterministic drift that looked like an attack. The runbook that skips source classification sends a tired engineer down a rabbit hole for nothing.
Define What 'Drift' Means to Your Outage, Not Your Dashboard
Drift is not a binary state. A missing tag on an S3 bucket is noise. A security group that suddenly allows 0.0.0.0/0 is a page. The same delta can be trivial in one context and catastrophic in another, so your runbook must draw that line explicitly before step one. Write down what counts as a problem worth waking someone up for: state deviation that breaks compliance, blocks deployments, or creates a security exposure. Everything else goes to the backlog.
The catch is that definitions rot. What was noise six months ago—say, an unused AMI accumulating—becomes a cost explosion nobody flagged. Revisit your threshold with every major incident. Otherwise, you automate the detection of things nobody cares about, and the runbook becomes a paperweight when the real fire starts.
A runbook that can't distinguish between a cosmetic diff and a production threat is a map drawn by someone who never left the office.
— platform engineer, post-incident review
Map the Actual Remediation Paths, Not the Idealized Ones
Here is where runbooks die: they describe the fix as it should work in a clean lab. Real remediation involves a broken credential, a locked-down network path, or a tool that lost its service account. You need to trace the steps an engineer will actually take when the status page is down and the VPN is flaky. That means logging into the bastion, checking if the state file is reachable, and knowing which IAM role has permission to apply changes—not assuming the CI runner still works.
Most teams skip this and write what they hope is true. Wrong order. The right path is messy, full of fallbacks: "If the apply fails due to 403, here is the emergency access procedure." "If the state bucket is locked, here is who to call." Draw that map by walking the route yourself during a drill, not by staring at the architecture diagram. Short version: your remediation path is only as good as the last time someone actually executed it end to end.
That sounds fine until you realize the tooling changed last sprint and nobody updated the runbook. The fix is to make mapping a habit, not a one-time exercise—attach it to every change that touches the environment. Then the runbook survives first contact, and so does the engineer holding it.
The Core Workflow: Steps That Lead a Tired Engineer to Resolution
Step 1: Confirm the drift is real (and not a false positive)
The alert says your Terraform state disagrees with prod. That doesn't mean your infrastructure is broken. Sometimes the agent that scans drift runs with stale credentials, or the comparison hash misses a known-cosmetic change like an auto-added tag. I have burned two hours on a runbook that skipped this gate. The first thing your doc should tell a weary engineer is: check the diff output like you're reading a bank statement, not a novel.
Look for the specific attribute that drifted. If it's a security group rule or an IAM policy, that's urgent. If it's a resource tag or a launch template's description, you can probably breathe. The runbook needs a hard rule here—drift in state files without a corresponding API change is almost always a phantom. A quick aws resourcegroupstaggingapi get-resources or a kubectl get re-read can settle it in ninety seconds. Not yet convinced? Then ask the question every good runbook encodes: *did anything deploy in the last hour?*
Step 2: Assess blast radius and decide if it's safe to auto-remediate
Most drift remediation tools want to re-apply your desired state and call it a day. That's fine for a test environment or a stateless worker pool. It's a catastrophe waiting to happen for a database cluster or a payment gateway. The workflow should force a judgment call before any automated fix runs: what breaks if I re-apply this config?
The catch is that "blast radius" isn't a single number. It's a short list. The runbook should spell out three questions in order. First, does this resource serve live traffic? Second, would the remediation action cause a restart, a replacement, or just an in-place update? Third—and teams skip this—do you have a rollback path if the re-apply makes things worse? If you can't answer all three in under a minute, the answer is manual intervention. Wrong order here means you fix the drift and lose the database. That hurts.
For auto-remediation, set a boundary. Only allow it for resources where the desired state is idempotent and the apply operation is non-disruptive. Everything else gets a ticket and a human. The runbook should include a small table of safe categories—auto-scaling group launch configs, S3 bucket policies, CloudFront behaviors—and a hard blocklist for anything with state.
Step 3: Execute the fix, verify, and document what changed
Execution is the shortest step in the entire workflow, and that's a trap. Running terraform apply or your drift tool's remediate command takes minutes. Verification takes seconds if you know what to check. The runbook needs explicit post-fix checks: confirm the resource is healthy, confirm the drift scan returns clean, and confirm your monitoring didn't page anyone new. I have seen runbooks that end at "apply successful"—then the team discovers the fix worked but the load balancer drained all connections in the process.
Documentation after remediation is where most engineers cut corners. Write it anyway. Even a terse note—"re-applied launch template v12, replaced 3 instances, traffic shifted clean"—saves the next person from re-deriving your thinking. Log the false alarms too; those are gold for tuning your drift detection thresholds later.
Automation that can't explain itself is just a faster way to make a mess.
— field note from a site reliability engineer who learned this the expensive way
One last sequence check: confirm the fix didn't create drift elsewhere. Re-running the scan is the only honest test. The runbook should make that final scan a mandatory gate, not a suggestion. That's the difference between a runbook that works and one that just looks complete.
Tools and Environment Realities That Make or Break the Steps
Terraform, CloudFormation, Ansible—how they handle drift differently
The runbook that says "run terraform apply" assumes Terraform is even the tool that created the resource. It might not be. I’ve watched a team burn ninety minutes trying to import a manually-created VPC into state before they could fix one bad security group rule. CloudFormation treats drift as a stack-level condition — you detect it, then you either patch the template or accept the deviation. Ansible, by design, converges every run. No detection phase, no state file to reconcile. It just rewrites the world toward the playbook. Your runbook must name the tool upfront. Wrong tool, wrong workflow, wasted hour.
But the deeper trap is assuming the tool's drift model matches your incident. Terraform reports drift in the plan output, yet the plan itself can be massive, opaque, and full of "tainted" resources that aren't actually broken. CloudFormation gives you a clean stack drift status but hides the exact resource-level diffs unless you drill into each one. Ansible is honest about what it changed, but it will happily "fix" things you didn't want touched. The runbook's job is to map the symptom — error message, failing API call, degraded response — to the right tool command. That mapping is the whole product.
The state file problem: where 'truth' lives and who can touch it
State is the silent assassin of every drift runbook. The file says one thing, the cloud says another, and the runbook's commands depend on the file being trustworthy. If your team stores state in an S3 bucket with no locking, two engineers can run the same plan and get wildly different results — or worse, both write and corrupt the file. I've seen a state file locked by a stale DynamoDB lease from a dev's laptop that had been closed for three days. The runbook didn't mention checking the lock. It didn't need to until it did.
Permissions follow state. The engineer on-call might have read-only access to the state bucket but full write to AWS — or vice versa. Your steps silently assume the operator can see the truth before they change it. That's a non-starter. Write down exactly which credentials, which role, and which bucket — or the runbook becomes a scavenger hunt at 2 AM. And if your state is local, on someone's laptop? The runbook is fiction from page one. Move it, or don't bother writing the steps.
The network and permissions that your steps silently assume
Most drift runbooks assume the operator has network reach to the control plane. Bastion host down? VPN flapping? The commands fail before they even run. Your steps need a pre-flight check: can you reach the API endpoint, is the CLI authenticated, does the target environment exist right now? These checks feel trivial when you're writing the doc at your desk. In an outage, they're the difference between a five-minute fix and a forty-minute "why is nothing working" spiral.
The runbook that skips authentication and network checks isn't a runbook. It's a screenshot of someone's lucky afternoon.
— staff engineer, post-incident review
Service account roles drift too. The token that used to let Terraform assume a deployment role gets rotated, and suddenly the "standard" apply step fails with a cryptic access denied. Build a ten-second connectivity test into the runbook's first step. If it fails, the doc should say what to check next — token age, role ARN, policy attachment — not just "ensure credentials are valid." That phrase is where runbooks go to die. Be specific, or be silent.
Scaling the Runbook Down: Variations for Small Teams, Regulated Shops, and Solo Ops
The two-page runbook for a startup with no dedicated SRE
Startups drift because nobody owns the infrastructure until it screams. Your runbook should match that reality: short, blunt, and written for the person who just got paged at 2am while also holding the on-call phone for customer support. Two pages is the ceiling. One page is better.
Strip every step that assumes a mature toolchain. No Terraform state inspection scripts, no Grafana dashboard deep-dives, no "validate against the golden configuration" prose. What you need is a linear path: what does healthy look like, what does broken look like, what do I type first. The fix commands go in a code block at the top, not buried in paragraph five. Wrong order—the tired engineer will skim, miss the command, and improvise.
Honestly — most devops posts skip this.
That sounds fine until the actual outage hits and the table's flipside shows. The catch is that two-page runbooks age badly. They assume the stack stays simple, and startups don't. What usually breaks first is the command list—someone migrates from Docker Compose to Kubernetes, and now the old runbook tells you to restart a container that no longer exists. I have seen this exact failure at three different companies. The remedy isn't more pages; it's a quarterly ten-minute check where someone actually executes the steps against a test environment and edits the drift out.
Honestly — most devops posts skip this.
The audit-ready runbook: change approvals and evidence trails
Regulated shops don't care about speed; they care about the paper trail after the fact. Your runbook needs a different spine: every step must produce an artifact. Logs, timestamps, command output, who approved what, and when. The remediation itself can be slow, because the compliance officer's signature matters more than the five minutes you saved.
The trade-off here is brutal but honest. You will write steps that feel bureaucratic—"capture current state, file change request, wait for approval, execute, capture post-state, attach all to ticket"—and they will feel awful during the outage. But the alternative is worse: a fine, a failed audit, or a lawsuit that asks why you changed production without a trace. Most teams skip this part until the auditor finds out, and that's the pitfall. Build the evidence capture into the runbook as a mandatory first step, not a retrospective afterthought.
One trick that works: use the runbook itself as the evidence log. Each step has a field for the operator to paste the actual command output, not just check a box. That turns the document from fiction into a courtroom-adjacent record. Quick reality check—your monitoring tool's export feature is not a substitute; auditors want the human-typed transcript, warts and all.
The solo engineer's runbook: screenshots and self-check prompts
When you're the only one in the room, the runbook is not a reference—it's a memory transplant. You're writing for a future version of yourself who hasn't touched this system in six months and has forgotten every hard-won lesson. Screenshots matter more than words. A picture of the dashboard before the fix, a picture after, arrows pointing at the button you need to click. Text alone fades; images stick.
Self-check prompts are the hidden weapon. Each step ends with a question: did the error message disappear? is the metric back in the green band? does this output match the expected regex? They force you to stop, look, and verify instead of blindly moving to the next command. The pitfall is false confidence—you think you remember the sequence, so you skip the runbook entirely and then spend an hour rediscovering a fix you already wrote down. That's why the prompt placement matters: put the self-check before the next command, not after the whole sequence.
Write the runbook for the operator who has forgotten everything, not the expert who never forgets.
— solo infrastructure engineer, after a 3am Redis cluster scare
For solo ops, the scaling rule is brutal: if the runbook takes more than one page per incident type, you won't maintain it. Trim until it hurts. And update it the morning after the incident, while the memory is raw, not a week later when the details have dissolved.
Pitfalls That Turn a Runbook into a Liability (and How to Catch Them)
Stale Screenshots and Version Drift in the Runbook Itself
The runbook says “click the blue button in the upper right.” There is no blue button. There hasn’t been one for three months. Someone migrated that panel to a dropdown, and nobody updated the doc. This is the quiet killer—the runbook that was accurate on the day it shipped, then slowly rotted alongside the infrastructure it described. I have debugged outages where the runbook cost us an extra hour because step two referenced a dashboard that no longer existed in any environment.
How do you catch this before it bites? You don’t audit the whole runbook quarterly. That’s fiction. Instead, check the timestamps on screenshots during your next incident review. If the image is older than two releases, flag it. Better yet—strip screenshots entirely from high-frequency steps. Describe the *outcome* of a button click, not the button’s location. “The drift summary page shows a red banner” survives UI changes. “Click the gear icon” doesn't.
Version drift is sneakier. The runbook targets Terraform 0.12 syntax, but your pipeline runs OpenTofu 1.6. The commands still *look* right. They fail with cryptic errors that a tired engineer won’t parse at 2 AM. Add a header line to every runbook: “Validated against [tool] version X.X on [date].” Then actually re-run the steps when you bump tooling. One hour of validation saves a four-hour outage scramble.
Step Sequences That Assume a Healthy Network or a Fresh Shell
Most runbooks assume the thing you’re fixing is the only thing broken. That’s rarely true. If you’re remediating drift because a state lock is stale, your shell might also be pointing at the wrong profile, or your VPN dropped mid-command, or the API endpoint is rate-limiting. The sequence “run `terraform plan`, review output, apply” is linear. Reality is not.
Write defensive steps that check preconditions *inside* the runbook. “Before running plan, verify `terraform workspace list` shows the expected environment.” “Confirm `aws sts get-caller-identity` returns the right account.” These add thirty seconds per step. They save you from executing plan against production when you meant staging. That sounds obvious, but I have watched an engineer run `apply` in the wrong region because the runbook assumed a fresh shell and the env vars from a previous task were still hanging around.
The trick is to make the checks feel like part of the workflow, not bureaucracy. Don’t write “Verify you're in the correct environment” as a bullet point. Instead: “Run `terraform workspace show`. Expected output: `prod-eu-west-1`. If you see anything else, stop here and call the on-call lead.” Wrong output means you stop. Most runbooks say “proceed to next step” without a failure path.
What about automation that “clicks this” for you? Dangerous assumption. If your runbook wraps a script that auto-confirms a destructive apply, you’ve traded human judgment for convenience. That’s fine—until the script’s environment differs from your test environment. Catch it by running the automation in a sandbox on a quarterly basis. Not monthly. Quarterly. The failures you find will be exactly the ones that would have hit you in production.
The False Confidence of Automation—When “Click This” Is a Trap
Automation in a runbook feels powerful. It removes human error. It shortens time-to-resolution. It also hides the failure mode that matters most: when the automation *half-works*. A script that runs 80% of the steps and then exits with a generic error code leaves you worse off than no script at all, because you don’t know which 20% succeeded.
“The most dangerous runbook step is the one that never fails during testing but fails exactly once, in production, at 3 AM, in a way you can’t reproduce.”
— platform engineer, post-incident review
How do you catch a trap like that? Look for steps that say “this usually works” or “if it errors, retry once.” Those are admission of uncertainty. Rewrite them as explicit branches: “If exit code 0, proceed to step 5. If exit code 1, run the diagnostic in Appendix B. If exit code 2, escalate to the infrastructure team—don't retry.” A runbook that embraces failure modes instead of hoping they don’t occur is one you can trust during an outage.
One more thing to check: the idle timeout. Runbooks that assume a terminal stays open for a 15-minute apply will fail when the SSH connection drops. Add a note: “If the connection drops mid-apply, the state file may be locked. Use `terraform force-unlock` with the lock ID from the error message—but confirm with the team before doing that, because force-unlock can corrupt state if used on active operations.” That’s not glamorous. It's the difference between a runbook that saves the day and one that makes it worse.
The goal is not a perfect document. It’s a document that fails loudly, with clear next steps, instead of failing silently. Review your runbooks with the same suspicion you’d apply to a vendor’s claims. Test the steps you think are obvious. Because the step you skip testing is the one that will bite. And it will bite the tiredest engineer on your team, at the worst possible hour. That’s the rule. Write accordingly.
Runbook FAQ: Quick Answers for the Questions You'll Actually Ask
How often should I update the runbook?
Update it when the system lies to you. That sounds flippant, but it's the real answer. A runbook that survives first contact with an outage is one that got corrected the morning after the last outage — not one that got a quarterly refresh from someone who never ran the steps.
I have seen teams schedule monthly runbook reviews and still ship a document that told engineers to restart a service that had been deprecated for two quarters. The cadence that works is event-driven: every time a step fails, every time a dashboard URL changes, every time a rollback command stops being idempotent — fix it in the moment.
Quarterly reviews are for the table of contents, not the steps. The steps get touched whenever reality disagrees.
Who owns it — and what if no one does?
The owner is whoever gets paged. That's a uncomfortable sentence for managers, but it's the truth. If the person who answers the 2 AM alert isn't allowed to edit the runbook, the runbook will slowly drift toward fiction. We fixed this in one team by adding a "last verified by" line and a one-line change log at the bottom. No approval workflow. Just a name and a date.
The catch is that most runbooks have no owner at all. They sit in a wiki folder with an author who left the company in 2021. Nobody deletes them because nobody wants to own their absence.
Unowned runbooks are worse than none — they give you confidence in a path that's already gone.
— Site reliability engineer, post-incident review
If ownership is contested, assign it to the person who last changed the system the runbook covers. Not the team lead. Not the architect. The person who touched the config file.
How do I make it findable in a crisis?
Most teams skip this. They write a beautiful document and then bury it inside a Confluence tree with six levels of nesting. In an incident, nobody searches for that. They type three keywords into Slack and hope.
Make the runbook discoverable where the pager fires. Link it in the alert payload itself. Put it in the on-call handoff template. Add a short URL you can say out loud to a half-asleep colleague. One team I worked with printed the URL on a physical card taped to the monitor in the war room. That felt absurd until it saved an incident that would have taken twenty minutes to locate.
The other trick is redundancy. The same runbook lives in the repo next to the Terraform and in the wiki. They might drift apart, but in an emergency you want the copy that's closest to the fingers that are typing. Version control wins for freshness; the wiki wins for the person who hasn't touched a terminal in six months.
Wrong order kills more runbooks than stale commands. Put the first step on page one — no preamble, no background section, no "Before you begin" checklist that assumes a rested brain.
Next Steps: Write One Runbook This Week, Then Let It Rot
Pick the smallest, most painful drift scenario and start there
Not the board-wide compliance overhaul. Not the multi-region catastrophe you rehearse in slides. Pick the drift that actually woke you up at 2 a.m. last quarter—the config that silently flipped, the IAM policy that rotted, the load balancer rule that vanished after a "harmless" update. Write that one. It should fit on two pages, maybe three. If it needs more, you're documenting your architecture, not a runbook.
The catch is that most teams start with the scariest failure mode and produce a novel nobody reads. Small and specific beats comprehensive and ignored. I have seen a single-page runbook save a Friday afternoon that a forty-page wiki never would have touched.
Schedule a 'fire drill' to test it before you need it
Put it on the calendar for this week. Thirty minutes, one person playing the tired on-call engineer, another person breaking things on purpose. Read the runbook cold—no pre-reading, no context. Mark every spot you pause, every command that assumes prior knowledge, every step that references a doc you can't open.
The drill will hurt. That's the point. Wrong order. Missing credentials. A step that says "check the dashboard" but doesn't say which dashboard. Fix these now, not during an incident when the timer is real and your judgment is already shot.
One rule: the person testing can't be the person who wrote it. The writer knows the unwritten steps, the implicit assumptions, the shortcuts that live in their head. Another engineer will expose the gaps fast.
Set a recurring review date—and actually keep it
Quarterly is fine. Monthly is better. The runbook is a living artifact, not a tombstone. Infrastructure drift doesn't respect your documentation schedule, and the runbook that saved you in March may be fiction by September.
A runbook that hasn't been tested in six months is just a story you tell yourself about being prepared.
— paraphrased from every incident postmortem I've sat through
Pick a recurring calendar invite with a real agenda: fifteen minutes to skim for stale commands, ten minutes to check access still works, five minutes to update the one thing that changed. If you can't find anything to update, run the drill again. That's the review.
Then let it rot—deliberately. Set it aside for a quarter, let the tech stack shift, let the team turn over. The next review will show you exactly which parts were assumptions and which parts held. That decay is the signal. That's where the next runbook lives.
This week, one page, one scenario, one drill. Next quarter, do it again with the new pain. That's the whole system.
Comments (0)
Please sign in to post a comment.
Don't have an account? Create one
No comments yet. Be the first to comment!