Architecture
Deadlift is one CloudFormation stack. Everything in this page is provisioned inside your AWS account when you subscribe through Marketplace.
What gets deployed
| Layer | Resource |
|---|---|
| Frontend | S3 bucket + CloudFront distribution serving a static Next.js export |
| API | AppSync GraphQL API with Cognito User Pool authorization |
| Compute | 13 Lambda functions (AppSync resolvers + scheduled jobs) and one inline AppSync JS resolver |
| Storage | 5 DynamoDB tables: sessions, audit log, daily counters, auto-replay rules, settings |
| Identity | Cognito User Pool with optional MFA, email/SSO sign-in |
| Monitoring | CloudWatch alarms reconciled per DLQ by a scheduled Lambda; SNS topic for delivery |
| Notifications | SNS topic with optional email subscription, plus a Lambda that POSTs to your configured webhook URL |
How a replay works
- You browse a DLQ. The frontend calls AppSync
listMessages, which holds the SQS visibility timeout for 5 minutes via aReceiveMessagecall. Receipt handles are stored in DynamoDB. - You select messages and hit replay. AppSync invokes the
replay-messagesLambda with the message IDs. - The Lambda reads the stored receipt handles, sends the messages to the source queue (derived from the DLQ redrive policy), then deletes them from the DLQ.
- The audit log writes an entry with your Cognito user ID, the queue URL, the action, and the message count.
Messages never travel through Deadlift infrastructure - they stay inside your account, moving directly between SQS and Lambda.
Why no SaaS backend?
Deadlift is sold as a bring-your-own-account product. The trade-offs:
- ✅ Data residency: customer data never leaves the customer’s AWS account
- ✅ Cost transparency: usage shows up in the customer’s existing AWS bill
- ✅ Compliance simpler: no third-party data processor to vet
- ⚠️ Updates require a stack update: customers update on their own cadence; we publish new templates to Marketplace
- ⚠️ Multi-tenancy via Cognito User Pools: each deployment is a single tenant
For our target customer (engineering teams managing AWS workloads, especially in regulated environments), the data residency story outweighs the update friction.
Tier gating
The CloudFormation stack receives a Tier parameter set by AWS Marketplace
based on your subscription. The Lambda functions read this from their
TIER environment variable and gate behaviour accordingly:
- DLQ count limits enforced by
list-queues - Daily message browse caps enforced by
list-messages, tracked in theCounterTable - Audit history retention enforced by DynamoDB TTL on the
AuditTable - Webhooks gated by
dlq-webhook(no-op when tier doesn’t include them) - Multi-user gated at the Cognito layer
When you upgrade your subscription, the Marketplace flow updates the CloudFormation parameter and the limits change immediately.