
The Undo Button for the Cloud: Designing Reversible AWS Systems
Explore Reversible Cloud Architecture—a new approach to building AWS systems that can safely recover from mistakes. Learn how EventBridge, Step Functions, DynamoDB, S3, CloudTrail, and CloudWatch can work together to create recoverable, observable, and resilient cloud systems.
The Undo Button for the Cloud: Designing Reversible AWS Systems
What if “rollback” was not a deployment feature, but an architectural property?
We have become very good at making cloud systems do things.
Deploy an application.
Scale a service.
Modify a database.
Change a security policy.
Process millions of events.
Automate infrastructure.
But there is a question that deserves much more attention:
What happens when the system does the right thing at the wrong time?
A deployment succeeds but introduces a subtle data corruption bug.
An automation removes a resource that another workflow still depends on.
A configuration change is technically valid but causes an unexpected traffic pattern.
An event-driven workflow processes an event twice.
An operator makes a perfectly legitimate change that turns out to be the wrong decision.
Traditional reliability engineering often asks:
“How do we prevent failure?”
A more powerful question is:
“How do we make failure cheap to reverse?”
This article introduces a design principle I call Reversible Cloud Architecture.
The idea is simple:
Every important state-changing operation should have a known recovery boundary, enough history to reconstruct the previous state, and a controlled path to reverse or compensate for the change.
AWS already provides many of the building blocks needed to implement this idea.
The interesting part is connecting them deliberately.
1. Rollback Is Not the Same as Reversibility
Rollback usually means returning a system to an earlier version.
For example:
1
2
3
4
5
6
7
8
9
Version 5
↓
Version 6
↓
Version 7
↓
Something breaks
↓
Rollback to Version 6
This works well for stateless application deployments.
But real systems are not just application binaries.
They contain:
- databases
- events
- files
- permissions
- configuration
- queues
- external integrations
- infrastructure
- long-running workflows
Imagine this sequence:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
09:00 Application v1 deployed
09:15 Customer places order
09:16 Order event published
09:17 Inventory updated
09:18 Payment processed
09:19 Application v2 deployed
09:20 Bug discovered
09:21 Application rolled back to v1
The application has been rolled back.
But the world has not.
The payment has already happened.
The inventory has already changed.
The event has already been consumed.
The customer has already received an email.
This is why I prefer the term reversible architecture rather than rollback architecture.
Rollback restores software.
Reversibility restores intent.
2. The Reversibility Triangle
A useful way to reason about reversible systems is with three properties:
1
2
3
4
5
HISTORY
/ \
/ \
/ \
CONTROL -------- RECOVERY
History
Can we determine what happened?
Control
Can we stop or isolate the operation?
Recovery
Can we return to a safe state—or perform a compensating action?
If one side is missing, reversibility becomes difficult.
For example:
History + Recovery, but no Control
You can restore the database, but the broken application continues writing bad data.
Control + Recovery, but no History
You know how to recover, but you don't know which state you should recover to.
History + Control, but no Recovery
You can investigate the incident perfectly—but cannot repair it.
A mature cloud architecture needs all three.
3. AWS Gives Us Most of the Pieces
Consider this conceptual architecture:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
┌──────────────────────┐
│ Clients │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ API / Service │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ EventBridge │
│ Event Bus │
└───────┬───────┬──────┘
│ │
┌────────────┘ └─────────────┐
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Step Functions│ │ Event Archive │
│ Workflow │ │ / History │
└────────┬────────┘ └─────────────────┘
│
┌────────┴─────────┐
▼ ▼
┌────────────────┐ ┌────────────────┐
│ DynamoDB │ │ S3 │
│ Current State │ │ Snapshots/Data │
└────────────────┘ └────────────────┘
│
▼
┌──────────────────────┐
│ CloudWatch / CloudTrail│
│ Audit + Observability │
└──────────────────────┘
This is not a mandatory AWS reference architecture.
It is a design pattern.
Each service answers a different reversibility question.
4. EventBridge: Keep the Past Alive
One of the most interesting capabilities for reversible architectures is Amazon EventBridge event archiving and replay.
EventBridge can archive events and later replay them to the source event bus. AWS specifically documents replay as a mechanism for recovering from errors and validating new functionality.
That changes how we think about events.
Normally:
1
Event → Consumer → Finished
A reversible system can instead think:
1
2
3
4
5
Event
│
├──→ Consumer
│
└──→ Historical Record
Now an event is not just a message.
It becomes part of the system's recovery material.
For example:
1
2
3
4
5
6
7
8
9
10
{
"source": "orders",
"detail-type": "OrderCreated",
"detail": {
"orderId": "ORD-4821",
"customerId": "C-193",
"amount": 1499,
"currency": "INR"
}
}
Suppose a downstream service accidentally fails to process a group of events.
Instead of manually reconstructing what happened, the architecture can potentially replay the relevant historical events.
This is especially powerful for event-driven systems because history becomes executable.
5. But Replay Is Not Undo
This distinction is critical.
Suppose an event was:
1
OrderCreated
Replaying it does not necessarily undo the order.
It creates another processing opportunity for the same event.
Therefore:
Replay is recovery, not reversal.
A truly reversible event-driven system needs idempotency.
For example:
1
2
3
4
5
6
7
8
9
10
11
OrderCreated
│
▼
Check idempotency key
│
┌───┴────┐
│ │
New Already
│ seen
▼ │
Process └──→ Ignore
A common pattern is to store an event or operation identifier in DynamoDB.
Conceptually:
1
2
3
4
5
6
7
8
operationId = "op-8f31..."
if operationId already exists:
return previous result
else:
perform operation
store operationId
This turns retries and replays from dangerous operations into controlled operations.
6. Step Functions: Make the Workflow Explainable
Long-running operations are another place where reversibility becomes difficult.
Imagine:
1
2
3
4
5
6
7
8
9
Create customer
↓
Create account
↓
Provision resources
↓
Send notification
↓
Enable service
If step four fails, what does “rollback” mean?
Delete everything?
Maybe.
But what if the notification was already sent?
What if the external system cannot be rolled back?
This is where compensating actions become more useful than traditional rollback.
For example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Forward action:
Create Account
↓
Provision Resource
↓
Enable Service
Compensation:
Disable Service
↓
Delete Resource
↓
Close Account
The compensation is not necessarily the inverse API call.
It is the action that restores the business invariant.
AWS Step Functions provides execution history for state-machine executions, making workflow behavior inspectable after the fact.
That gives us an important architectural property:
A workflow should know not only what it is doing, but what recovery action corresponds to each irreversible step.
7. The Compensation Table
One practical technique is to define a compensation table during design.
| Operation | Forward Action | Failure Risk | Compensation |
|---|---|---|---|
| Create account | Create account | Partial provisioning | Disable + quarantine |
| Reserve inventory | Decrease stock | Payment failure | Restore inventory |
| Charge payment | Capture payment | Fulfillment failure | Refund |
| Upload file | Store object | Processing failure | Mark object invalid |
| Enable feature | Change configuration | Unexpected behavior | Restore previous configuration |
This table looks simple.
But it forces an architectural conversation that often never happens:
“If this succeeds and the next step fails, what exactly do we do?”
That question is gold during system design.
8. DynamoDB: Store State, Not Just Data
DynamoDB can become the state ledger for reversible operations.
Instead of storing only the current state:
1
2
3
4
{
"orderId": "123",
"status": "PAID"
}
store enough metadata to understand the transition:
1
2
3
4
5
6
7
8
{
"orderId": "123",
"status": "PAID",
"version": 7,
"lastOperation": "payment-capture-82ab",
"previousStatus": "PENDING_PAYMENT",
"updatedAt": "2026-10-06T15:10:00Z"
}
Now the system knows:
1
2
3
4
5
6
7
8
Current:
PAID
Previous:
PENDING_PAYMENT
Operation:
payment-capture-82ab
That small addition can dramatically improve recovery workflows.
For critical data, DynamoDB point-in-time recovery provides continuous backups and allows restoration to a point in time within the configured recovery period. AWS notes that restores create a new table rather than overwriting the source table.
That “new table” behavior is actually useful for safe recovery.
Instead of:
1
Production → Restore → Hope
you can think:
1
2
3
4
5
6
7
8
9
10
11
12
Production
│
├──→ Recovery Table
│
▼
Compare
│
▼
Validate
│
▼
Controlled Cutover
Recovery becomes an engineering workflow instead of a panic button.
9. CloudTrail: The Difference Between State and History
There is another subtle problem.
A database can tell you:
“The security policy is currently X.”
But that doesn't necessarily tell you:
“Who changed it, when, and through which API operation?”
This is where AWS CloudTrail matters.
CloudTrail records AWS account activity, including actions performed through the console, CLI, SDKs, and APIs. Its Event history provides the past 90 days of recorded management events in a Region.
Think of the difference as:
1
2
3
4
5
6
7
Database / Resource State
↓
"What is true now?"
CloudTrail
↓
"What happened?"
A reversible system needs both.
10. The Five Questions Every Dangerous Operation Should Answer
Before allowing an automation to change production state, ask:
1. What changed?
Example:
1
2
SecurityGroup sg-123
Port 443 → Port 22
2. Why did it change?
1
Change request: CR-9281
3. Who or what initiated it?
1
Role: deployment-service
4. What was the previous state?
1
2
Previous rule:
443/tcp from corporate CIDR
5. How do we recover?
1
2
Compensation:
restore previous rule set
If your system cannot answer these questions, it is difficult to call the operation safely reversible.
11. The Reversible Operation Envelope
Here is the pattern I recommend.
Every important state-changing operation gets an operation envelope:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"operationId": "op-019283",
"resource": "order/4821",
"action": "CAPTURE_PAYMENT",
"actor": "payment-service",
"timestamp": "2026-10-06T15:10:00Z",
"previousState": {
"status": "AUTHORIZED"
},
"targetState": {
"status": "PAID"
},
"compensation": {
"action": "REFUND_PAYMENT"
},
"correlationId": "req-72ab91"
}
The important idea is not the exact JSON schema.
It is the discipline.
A state change should carry enough information to understand and recover from itself.
12. Reversibility Levels
Not every operation can be perfectly reversed.
So I propose five levels.
Level 0 — Disposable
No meaningful recovery.
Example:
1
Write debug log
Level 1 — Retryable
The same operation can safely be attempted again.
Example:
1
Publish notification event
Level 2 — Restorable
Previous state can be recovered from a backup or snapshot.
Example:
1
Restore database state
Level 3 — Compensatable
The original action cannot be undone, but an equivalent business correction exists.
Example:
1
2
3
Payment captured
↓
Refund issued
Level 4 — Replayable
The system has sufficient history to reconstruct or reprocess the workflow.
Example:
1
2
3
4
5
Historical events
↓
EventBridge replay
↓
Rebuild downstream state
This gives architecture reviews a new vocabulary.
Instead of saying:
“This service is reliable.”
We can ask:
“What reversibility level does this operation have?”
13. What Cannot Be Reversed?
This is where the concept gets really interesting.
Some actions are fundamentally irreversible.
For example:
1
2
3
4
5
Send an email
Publish a public message
Transfer information to an external system
Expose a secret
Delete something without backup
You cannot truly undo these actions.
The email has already arrived.
The secret may already be copied.
The public message may already have been indexed.
Therefore, the goal is not:
Make everything reversible.
The goal is:
Identify irreversible boundaries before you cross them.
Then put additional controls around those boundaries.
For example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Reversible Zone
────────────────────────────────
Validate
↓
Authorize
↓
Prepare
↓
Stage
↓
════════════════════════════════
IRREVERSIBLE BOUNDARY
════════════════════════════════
Send
↓
Commit
↓
External side effect
This is a powerful design pattern for payments, notifications, infrastructure automation, and AI agents.
14. Why This Matters Even More for AI Agents
AI agents make reversible architecture much more important.
A traditional application usually has a relatively predictable set of operations.
An agent can dynamically decide:
1
2
3
4
5
6
7
8
9
10
11
Observe
↓
Reason
↓
Choose tool
↓
Modify system
↓
Observe result
↓
Choose another tool
The danger isn't necessarily that the agent is wrong.
The danger is that a correct tool call can have an unexpectedly large blast radius.
Imagine an agent with permission to:
1
2
3
4
Modify IAM
Delete resources
Change networking
Update databases
Giving the agent perfect reasoning does not solve the recovery problem.
A safer architecture gives the agent:
1
2
3
4
5
6
7
8
9
10
11
Tools
↓
Policy Boundary
↓
Approval / Validation
↓
Operation Envelope
↓
Execution
↓
Audit + Recovery
The future of safe AI infrastructure may therefore depend less on making agents “never make mistakes” and more on making mistakes bounded, observable, and recoverable.
15. A Practical AWS Implementation
A minimal implementation could look like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
┌─────────────┐
│ API Gateway │
└──────┬──────┘
│
▼
┌─────────────┐
│ Lambda │
└──────┬──────┘
│
▼
┌───────────────────┐
│ EventBridge │
│ Event Bus │
└─────┬────────┬─────┘
│ │
┌─────────┘ └──────────────┐
▼ ▼
┌────────────────┐ ┌────────────────┐
│ Step Functions │ │ Event Archive │
└───────┬────────┘ └────────────────┘
│
┌─────┴──────┐
▼ ▼
┌────────────┐ ┌────────────┐
│ DynamoDB │ │ S3 │
│ State/Lock │ │ Snapshots │
└────────────┘ └────────────┘
│
└──────────┬───────────┐
▼ ▼
CloudWatch CloudTrail
The roles are deliberately separated:
| AWS service | Reversibility role |
|---|---|
| Amazon EventBridge | Event routing + replay |
| AWS Step Functions | Workflow state + compensation |
| Amazon DynamoDB | Current state + operation ledger |
| Amazon S3 | Durable artifacts/snapshots |
| AWS CloudTrail | Audit history |
| Amazon CloudWatch | Detection + operational signals |
| AWS Lambda | Small recovery/control functions |
The architecture does not require every service.
The principle is what matters.
16. The Most Important Metric Isn't Uptime
Here's a controversial idea.
For systems with significant automation, uptime alone isn't enough.
Consider two systems:
System A
1
2
3
4
99.99% uptime
10-minute recovery
manual investigation
unclear state
System B
1
2
3
4
99.95% uptime
30-second detection
automated compensation
complete operation history
System A looks better on an uptime dashboard.
But System B may be safer.
This suggests another useful operational metric:
Time to Safe State — TTSS
Instead of asking only:
“How quickly did we detect the failure?”
ask:
“How quickly did the system return to a known safe state?”
For example:
1
2
3
4
5
6
7
8
9
10
11
Failure detected
↓ 5 sec
Operation stopped
↓ 3 sec
Bad state identified
↓ 8 sec
Compensation executed
↓ 10 sec
Validation completed
↓
SAFE
TTSS = 26 seconds.
This measures something users actually care about:
How long was the system unsafe?
17. Reversibility as a Design Review Checklist
Before shipping a critical workflow, ask:
State
- What state does this operation modify?
- Where is the current state stored?
- Is there a version or revision identifier?
History
- Can we determine exactly what happened?
- Can we correlate related operations?
- Are important events retained?
Idempotency
- Can the operation safely run twice?
- What happens during retry?
- What happens during replay?
Recovery
- What is the previous safe state?
- Can we restore it?
- If not, what is the compensating action?
Control
- Can the operation be paused?
- Can we disable the consumer?
- Can we prevent additional writes?
External effects
- Which actions leave AWS?
- Which actions cannot be reversed?
- Where is the irreversible boundary?
Automation
- Can an automated system execute this operation?
- What permissions does it have?
- What is the maximum blast radius?
18. The Deeper Lesson
Cloud architecture has spent years optimizing for:
1
2
3
4
5
Scale
Availability
Performance
Cost
Security
Those remain essential.
But highly automated systems introduce another dimension:
1
2
3
4
5
6
7
8
9
Reliability
│
┌───────────┼───────────┐
│ │ │
Scale Availability Cost
│ │ │
└──────┬────┴────┬──────┘
│ │
Recovery Reversibility
Reversibility is not a replacement for reliability.
It is what makes reliability forgiving.
A system that never fails is unrealistic.
A system that fails and cannot recover is fragile.
A system that fails, contains the failure, explains what happened, and safely returns to a known state is resilient.
Conclusion: Build Systems With an Undo Button
The best cloud architectures are not the ones that assume engineers will never make mistakes.
They are the ones that assume mistakes are inevitable.
A production system should therefore answer three questions before it changes anything important:
What are we changing?
How will we know exactly what happened?
What will we do if we need to get back?
Amazon EventBridge can preserve and replay event history. Step Functions can make workflows explicit and inspectable. DynamoDB can maintain state and support point-in-time recovery. S3 can provide durable artifacts. CloudTrail can provide an audit trail. CloudWatch can detect operational problems.
But the real innovation is not any individual AWS service.
It is the design mindset:
Don't only build systems that can move forward.
Build systems that know how to recover when forward was the wrong direction.
Because in a world of autonomous automation and AI-powered infrastructure, the most valuable feature of a cloud system might not be its ability to do something automatically.
It might be its ability to say:
“I know what I changed. I know why. And I know how to safely undo it.”
Key Takeaways
- Rollback is not the same as reversibility.
- Treat important state changes as explicit operations.
- Preserve enough history to understand what happened.
- Design event consumers to be idempotent.
- Use compensation when true rollback is impossible.
- Separate reversible operations from irreversible boundaries.
- Give automation bounded permissions and recovery paths.
- Consider Time to Safe State (TTSS) alongside traditional reliability metrics.
- For AI agents, recovery architecture is as important as agent intelligence.
- Design every critical operation with an answer to: “What is our undo strategy?”
#AWS #CloudArchitecture #Serverless #EventDrivenArchitecture #AWSLambda #AmazonEventBridge #AWSStepFunctions #AmazonDynamoDB #CloudResilience #AIInfrastructure #DevOps #CloudEngineering
Any opinions in this article are those of the individual author and may not reflect the opinions of AWS.
Enjoyed reading this content? Let the author know!
Your likes, comments, shares, and saves help creators reach more builders.
Loading recommendations
Loading article