TL;DR
- Start an AWS solutions architect answer with requirements, constraints and failure expectations before naming services.
- Explain one complete request path, including identity, storage, background processing and status reporting.
- Distinguish availability, scaling and recovery; a standby database is not automatically a read-scaling solution.
- Use a failure matrix and a small verification plan to show how the design would behave under retries, outages and growth.
1. What would you ask before drawing the architecture?
Consider this original interview exercise: a business wants customers to upload documents and receive a processed report. Reports can take time, customers must see only their own files, and a failed worker should not cause a completed job to be billed twice.
Before drawing boxes, ask about file size, permitted formats, expected volume, burstiness, processing duration, retention and the acceptable wait. Ask whether processing can be asynchronous and what “completed” means. A report written to storage but absent from the customer's job list is not a successful experience. If you tend to jump straight to naming services, follow a system design interview framework that puts clarifying questions ahead of scale estimates and design.
Clarify operational constraints too: the team's skills, existing systems, deployment requirements and recovery expectations. State assumptions when the interviewer leaves a detail open. For example, “I will assume a single AWS Region is acceptable initially, but I will identify what changes if regional recovery is required.”
AWS's Well-Architected Framework provides a way to discuss architectural tradeoffs across operational and workload qualities. Use it as a review aid, not a substitute for explaining this particular system.
2. How would you describe the first complete design?
Walk through the user journey. An authenticated customer creates a job. The application records ownership and status. The file is stored privately, background work is queued, a worker processes it, and the customer can retrieve the result after the service verifies access.
One possible AWS design uses an application service, S3 for document objects, an SQS queue for work and a relational database for job metadata. The exact compute choice depends on processing time, runtime requirements and operational constraints. Naming Lambda, containers or instances without discussing those constraints is not a complete answer.
Keep the responsibilities separate. Amazon S3 is object storage; the job's business state still needs an explicit model. For this exercise, define states such as accepted, processing, completed and failed, together with the transitions that are allowed.
Describe how the interface gets status and how it handles a delayed result. A spinner without a durable job identifier makes recovery from a browser refresh unnecessarily difficult.
3. What happens when a queue message is delivered twice?
AWS documents at-least-once delivery for standard SQS queues. Design the worker around the possibility of receiving a job again instead of assuming that a successful first attempt eliminates retries.
Use a stable job identifier and make the effect of repeated processing explicit. For example, check the durable job state, claim work through a concurrency-safe transition and avoid issuing a second billing event for a job already completed. A unique business-operation key can help enforce the billing rule.
Then discuss the awkward boundary: writing an object and committing a database transaction are separate operations. A worker can crash between them. Choose a deterministic result location or another recovery mechanism, record enough state to reconcile partial completion, and explain what a retry inspects.
Do not claim that adding a queue makes all side effects exactly once. Show how the design handles duplicate delivery, concurrent workers and the crash after producing a result but before marking the job complete. If you deduplicate by storing processed message IDs, a backend interview guide on queues and idempotency explains why those IDs must be kept longer than the queue's maximum retry window.
4. How would you protect one customer's documents from another?
Separate infrastructure permissions from application authorization. A worker may need to read input objects and write results, but that does not mean every signed-in user should be allowed to retrieve every object it can access.
AWS IAM best practices recommend least-privilege access and appropriate use of temporary credentials. For the exercise, describe a workload role limited to its required operations instead of embedding broad account credentials in code.
At the application boundary, authorize the requested job against the caller. Test an otherwise valid request that names another customer's job. A hard-to-guess ID is not the authorization check.
Also consider logs and failure messages. Do not include full document contents or access-bearing URLs in ordinary diagnostics merely because the upload failed. Choose the identifiers and error categories that operators need without turning troubleshooting into a second distribution channel for private data.
5. Does Multi-AZ solve database scaling?
Ask which RDS deployment is being discussed. AWS distinguishes a Multi-AZ DB instance deployment from a Multi-AZ DB cluster deployment. The single standby in the former provides failover support and does not serve read traffic. The latter has two standby instances that can also serve reads.
That distinction matters in an interview. “Enable Multi-AZ” is not a complete response to every read-capacity problem. Discuss the chosen engine and deployment model, the query workload and the application's consistency needs.
For the document service, first inspect job-list query patterns, indexes, connection usage and polling frequency. If customers poll too aggressively, a better status-refresh policy may reduce pressure before a major database redesign is needed.
Keep recovery separate from ordinary scaling. Ask how backups are restored, how the application reconnects after failover and how recovery is tested. An architecture diagram cannot establish that a restore meets the required recovery time.
6. How would you reason about a growing backlog?
Use rates with explicit assumptions. Suppose a fictional queue contains one hundred waiting jobs, workers complete eight jobs per second and new work arrives at two jobs per second. If those rates remain stable, the net drain rate is six jobs per second, so the existing backlog takes about 16.7 seconds to clear.
That is a simplified capacity calculation, not an AWS performance measurement. Real processing durations vary, and increasing workers may overload a shared dependency. Ask whether the bottleneck is compute, database connections, object access, an external service or a concurrency limit.
Track the age of waiting work as well as the number of messages. A small queue containing a repeatedly failing old job tells a different story from a large queue of very recent work.
Define what happens when the service cannot keep up. You may need to limit intake, communicate a longer wait or reduce optional work. Explain the customer-facing behavior and the recovery path rather than relying on “autoscaling” as a complete answer.
7. How would you review cost without guessing a monthly price?
Build a workload model. Estimate documents per period, average input and output size, processing time, storage retention, request volume and any data movement. Then map those quantities to the chosen services' current pricing dimensions.
Separate baseline capacity from variable work. A low-volume service with idle infrastructure can have a different cost profile from a busy service whose processing dominates. Include operational effort when comparing designs; fewer service names do not automatically mean less work for the team.
For this exercise, ask what happens to old input files and superseded results. A retention rule needs to match the product's promise. Deleting everything quickly may reduce storage but break a customer's expectation that reports remain available.
State what you would measure after launch and when you would revisit the design. A cost answer is stronger when it names the uncertain quantities and a way to observe them, instead of inventing a precise bill.
8. What would you test before calling the design ready?
Use a failure matrix that connects each test to an expected outcome:
| Test | Expected observable behavior |
|---|---|
| Duplicate message | No duplicate completed business operation |
| Two workers claim one job | A concurrency rule prevents conflicting completion |
| Worker crashes after writing output | Retry can reconcile the existing result |
| Customer requests another account's job | Access is denied without disclosing the document |
| Database becomes temporarily unavailable | Work remains recoverable and retries are bounded |
| Input exceeds the accepted format or size | Clear rejection before expensive processing |
| Backlog grows beyond the target wait | Alert and customer-facing status reflect the delay |
| Backup is restored in a recovery exercise | Data and application behavior are checked against the agreed objective |
These are proposed tests for the design, not claims that an AWS environment has been deployed or benchmarked for this article.
Finish your answer by naming one tradeoff and one unresolved question. For example: “This design keeps processing asynchronous and recoverable, but I still need the maximum document runtime to choose the compute model confidently.” That makes the reasoning reviewable and gives the interviewer a useful next discussion. To test that habit under pressure, rehearse the scenario aloud in a mock system design interview where an AI interviewer pushes back on your tradeoffs.