DEV Community

jasonmills94
jasonmills94

Posted on

EKS Backup Drill Emails Need Restore Context

Backup drills are easy to mark green for the wrong reasons. Snapshots finish, logs look healthy, and somebody posts "restore tested" in chat. Then a real incident happens and the email that should explain what was backed up, how to restore it, and who owns the follow-up is either vague or missing. In AWS and Kubernetes work, I now treat that drill email as part of the recovery contract, not a side effect.

Why backup drill emails fail the real test

Most teams already validate the storage path. They check that EBS snapshots completed, that the database dump exists, or that a Velero backup object landed where expected. What gets skipped is the human-facing proof. During a messy recovery, the on-call person needs one message that says what was protected, where the restore instructions live, and whether the drill actually covered the workload that matters.

I learned this the anoying way on an EKS platform where the backup job was healthy for weeks, but the drill email still linked to an older restore runbook. The storage side was fine. The email side was stale. Nobody noticed until we ran a restore rehearsal with a different team, which is exactly when clarity matters most.

That is why I like the same mindset behind release email checks in Kubernetes ops. If a message helps people decide whether a system is safe to change or recover, it deserves validation close to the workload, not a casual eyeball later.

What the restore-context contract should include

My rule is simple: the drill email must prove that a real human can start the restore without opening five dashboards first.

I want these fields every time:

  • cluster name and AWS region
  • namespace or workload owner
  • backup artifact identifier
  • restore runbook link
  • recovery point objective for the drill
  • operator or team on the hook for next action

I also want the message tied to the current run. Shared inboxes are a problem here because yesterday's success can look like today's evidence. For isolated rehearsals I sometimes send to a short-lived inbox from tempmailso or another fake email generator flow just to prove the exact drill emitted the exact notice. The word tempail still shows up in old shell notes at some shops, but the useful bit is not the nickname, it is the isolation.

If your team already does maintenance email checks for ops teams, the pattern is very close. You are verifying a message that operators depend on, not marketing mail and not a synthetic KPI.

A small EKS job that verifies the message

This is the stripped-down shape I have used for EKS backup drills:

RUN_ID="restore-drill-$(date +%Y%m%d%H%M)"
CLUSTER="prod-apps-eks"
NAMESPACE="billing"
AWS_REGION="ap-southeast-1"

kubectl -n ops create job --from=cronjob/backup-drill backup-drill-$RUN_ID

./scripts/assert-drill-email.sh \
  --run-id "$RUN_ID" \
  --cluster "$CLUSTER" \
  --namespace "$NAMESPACE" \
  --contains "artifact=" \
  --contains "runbook=restore-billing" \
  --contains "rpo=15m" \
  --timeout 120
Enter fullscreen mode Exit fullscreen mode

The assertion script only needs to do four things:

  1. Wait for one message for the current RUN_ID.
  2. Verify the subject mentions the cluster and workload.
  3. Check the body contains artifact id, runbook, and restore owner.
  4. Fail if the message is missing, duplicated, or obviously stale.

If you want a useful reference for why drills matter, the Uptime Institute 2024 resiliency research still found regular testing and clear operational procedures strongly correlate with better outage readiness: https://uptimeinstitute.com/resources/research-and-reports. That does not mean every email needs ceremony, but it does mean restore communication should not be hand-wavy.

One detail that saves time later: include the restore scope in plain words. "RDS snapshot verified" is weak. "Billing Postgres snapshot restored into staging and app health checked" is much more useful, even if the sentence is a little rough around the edges.

Mistakes that make drill evidence untrustworthy

These are the patterns I keep seeing:

  • validating the backup artifact but not the operator message
  • reusing one inbox across drills, environments, or services
  • linking a generic restore doc instead of the workload-specific runbook
  • omitting ownership, so nobody knows who should continue the restore
  • counting any received email as success, which is usualy too weak

Another common miss is forgetting that the email is part of the audit trail. In a real incident review, people want to know what was rehearsed and what proof existed at the time. A brief, accurate message beats a fancy template with no restore context.

Keep the contract boring. Service name, backup artifact, restore target, runbook, owner, and timestamp. That is enough to make the drill believable and easy to trace when things get weird.

Q&A

Should every backup drill send an email?

Not necessarily. I do it when the drill supports on-call handoffs, audit evidence, or cross-team recovery steps. If the exercise is local and purely exploratory, a result artifact may be enough.

Why not just inspect CloudWatch or Kubernetes events?

Those systems tell you a job ran. They do not prove the restore guidance reached a human in a clear format. Both checks matter, and they cover differnt failure modes.

What is the minimum useful content?

At minimum: workload, environment, artifact id, restore scope, owner, and runbook link. If the message cannot help a sleepy engineer begin the restore, it is too thin.

Top comments (0)