Articles
CodeSignal AWS Engineering Assessment: Practice Cloud-Service Choices and Failure Scenarios
Prepare for CodeSignal's AWS Engineering Assessment with original cloud-service decision drills, queue failure scenarios, and clear evidence boundaries.
CodeSignal lists an AWS Engineering Assessment in its technical-assessment catalog. Its public description names a Cloud Engineer example role and tags including AWS cloud engineering, relational and non-relational databases, and messaging and integration. That is enough to guide preparation, but it is not a published question bank or a promise about your particular invitation. The most useful practice is to make a cloud-service choice against explicit requirements, then walk through what breaks when a dependency, consumer, or retry fails.
This guide separates what CodeSignal and AWS document from the original practice scenarios below. It does not claim access to live questions, a score cutoff, a timer, or a console-lab format. Check your own invitation for those details before you practice against a clock.
For a full systems exercise, keep Design distributed message queue service open as you work through the failure drills.
What is actually known about this assessment?
Official fact: CodeSignal's technical assessments catalog names the AWS Engineering Assessment. A June 2025 product update announced it as an addition to Certified Assessments. The catalog tags give a reasonable study map: AWS architecture, data stores, and integration. They do not reveal the exact prompts, weighting, number of items, or a pass mark.
Official platform guidance, not an AWS-specific rule: CodeSignal's assessment-taking guide explains that an invitation's information page supplies the duration and that question count and style can vary. The platform offers a practice area and sample question where available. Read the page attached to your invitation rather than borrowing another candidate's timer.
Candidate-report boundary: We could not verify independent, current candidate accounts specific enough to establish this assessment's format. Therefore, none of the exercises here is labeled a recalled CodeSignal question. They are constructed AWS engineering drills. If you encounter a report online, check its date, assessment name, and whether the author actually took this version before treating it as a format clue.
Use a workload contract before naming a service
An answer that starts “use Lambda, SQS, and DynamoDB” has skipped the decision. Begin with a small contract: who sends work, who receives it, how late it may be, whether ordering matters, what must survive a failure, and what a retry is allowed to do. Then select the service and explain the rejected alternative. This makes the reasoning visible even if several architectures could work.
| Workload question | Decision it changes | Failure you must still handle |
|---|---|---|
| Is the result needed in the request? | Synchronous API versus queued job | Client timeout after server success |
| Can two workers process the same item? | Idempotency key and durable result state | Duplicate side effect |
| Is ordering global or per entity? | Queue or stream partitioning and key | Head-of-line blocking |
| Is a record queried by key or joined relationally? | Key-value/document access versus relational model | Hot key, transaction conflict, migration |
| How old may queued work become? | Backlog limit, scaling target, expiry policy | A “healthy” queue serving obsolete work |
The table is a practice framework, not CodeSignal's rubric. “Managed” is not a delivery or recovery contract: your application still owns what happens after an ambiguous timeout.
Practice scenario 1: choose the boundary for an upload workflow
Original prompt: A user uploads a document. The API must return quickly with an upload ID; virus scanning and preview generation may take minutes. A client sometimes retries after a timeout. The preview can be regenerated, but an approval email must be sent at most once. Outline a design using AWS services, then explain why the work is not completed synchronously in the upload request.
A strong answer first defines the accepted state. Store the object durably, record an upload/job ID, and return that ID once submission is acknowledged. Put scan/preview work behind a durable queue or event-to-queue path; workers consume independently of the client's connection. Choose a relational database if approval state requires multi-record invariants and joins; choose a key-based store if the access pattern is simple and its conditional-write semantics cover the invariant. Naming a database without its query and consistency needs earns little.
Now make the retry path explicit. A duplicate client POST with the same idempotency key should resolve to the same job record, not create another approval. A worker must also tolerate a repeated delivery: claim or conditionally update the work state, make preview generation repeatable, and persist an email-send decision using a unique business key. If the email provider cannot offer a reliable idempotency contract, describe the residual ambiguity between “provider accepted” and “local commit succeeded.” “Exactly once” should not be asserted across that boundary without proof.
One alternative is a presigned upload followed by a processing record when storage reports completion. That changes when the API calls the upload “accepted”; it does not erase missing or duplicate events. Explain the acknowledgment point, reconciliation for orphaned objects or records, and user-visible states: pending, scanning, ready, rejected, or failed.
Follow-up: The scan service is down for twenty minutes. What do users see? Keep accepted uploads durable, report pending status, alarm on oldest-message age, limit retry traffic, and decide whether old work is still useful. AWS's Well-Architected guidance on limiting queues discusses backlog age, dead-letter queues, and failure detection.
Practice scenario 2: a payment-adjacent consumer stalls
Original prompt: A service places “invoice ready” events on a queue. Two worker deployments read the queue. A database outage makes writes slow, the visible queue depth rises, and a few invoices appear twice. Operations wants to double worker count immediately. Diagnose before acting.
The first move is to separate receipt, processing, and effect. Ask whether the producer generated duplicate business events, the queue redelivered one event, or the worker retried the same database operation. Correlate a stable invoice/event ID through queue message, worker log, database transaction, and downstream output. Queue depth alone cannot answer that question. Check age of oldest message, receive count, processing duration, database latency, conditional-write conflicts, and dead-letter volume. A larger fleet may simply multiply calls to the failing database.
Next, explain a safe sequence. Pause or cap consumer concurrency if the database cannot accept the load. Fix or isolate the database failure and set a bounded recovery rate. Make the invoice side effect conditional on an invoice/event key, then replay with a small cohort before draining the backlog. Watch the backlog's age, not just its count: a million quick messages may be healthier than a small set of stuck old ones. Set a dead-letter policy for poison messages and a documented redrive path after repair.
AWS documents why a queue receipt is not a proof of exactly-once application effects. Its SQS outage-recovery scenarios cover visibility timeouts, duplicate-producing retries, and dead-letter routing. The correct timeout depends on work duration and whether the worker can extend visibility. If the worker writes the database and crashes before deleting the message, a redelivery is expected; a durable business-key check protects the invoice.
Use this failure trace as a rehearsal card:
| Signal or event | Meaning to test | Action to justify |
|---|---|---|
| Database latency rises before queue age | Downstream bottleneck may cause backlog | Reduce concurrency; inspect dependency |
| One message is received repeatedly | Poison item, timeout, or crash | Check receive count, visibility, DLQ |
| Same invoice row is inserted twice | Idempotency boundary failed | Add unique key/conditional write and repair duplicates |
| Queue depth falls but oldest age rises | New traffic drains while old items stick | Inspect blocked partition or old-item policy |
| Redrive begins after recovery | Replay may repeat effects | Canary replay, compare business keys and outcomes |
This table is original editorial analysis; the observed order of signals in a real incident must be measured rather than assumed.
Practice scenario 3: relational or non-relational?
Original prompt: An account settings API needs a profile lookup by account ID, while an order service needs transactional changes to order, inventory reservation, and payment status. The team proposes one key-value database for both because the profile workload is simple. What would you ask before agreeing?
Separate the two access patterns. The profile service may suit a key-based model: predictable key reads, conditional updates for versioning, and a carefully planned secondary access path if needed. The order flow needs a clearly described invariant. Which records must change atomically? Can inventory be reserved rather than decremented in one cross-service transaction? Can a saga tolerate compensation? A relational database may simplify multi-row constraints and joins, but it does not automatically solve a transaction crossing payment provider and inventory service. Conversely, a non-relational store is not inherently unable to support conditional or transactional operations; examine the actual service feature and limits.
State a migration and failure question too. What happens if a conditional update succeeds but the client times out? Read by operation ID or idempotency key before retrying a non-idempotent effect. What does the application promise when replicas lag? Define whether read-after-write matters for the user confirmation screen. Avoid a universal “SQL versus NoSQL” slogan: the interview signal is the mapping from operation and invariant to service capability.
Sketch two designs. In one, a relational transaction commits order plus reservation, then an outbox event asks a payment worker to act. In another, separate services coordinate with pending and compensating states. Compare recovery after a crash between payment and success recording. The useful answer is a state machine.
A concise way to explain retries under pressure
When a call fails, classify it before retrying. A permission error or invalid request will not become valid because you send it five more times. A transient throttle or transport failure may merit retry, but only inside a bounded attempt or elapsed-time budget. Add backoff and jitter so many callers do not synchronize into another traffic spike. AWS's Well-Architected retry guidance recommends limits, exponential backoff, and jitter; it also warns against assuming a client library already uses the right policy.
Trace the whole call chain. If an API retries a worker three times and that worker retries a database four times, one user request could generate twelve database attempts. This is a constructed arithmetic example, not a CodeSignal question. Put the retry budget at a clear layer and measure the dependency's load. For an async job, define when a message moves to a DLQ and how an operator distinguishes a temporary dependency incident from a permanently invalid payload. A DLQ is an investigation and recovery mechanism, not a place to hide failed work indefinitely.
If asked “what if the region fails?”, define recovery objectives before offering active-active. Single-region multi-AZ and multi-region failover have different replication, conflict, cost, and operational burdens. Ask whether accepted work may be lost, what downtime is acceptable, and how clients find the replacement endpoint.
Rehearse answers with evidence, not memorized diagrams
Practice with three constraints and one failure injection. First write the workload contract and minimal components. Then challenge one assumption: ordering becomes per account, a duplicate arrives, or the database goes down. Finally explain observable signals and repair. Check four things: contract, rejected alternative, duplicate or lost-work boundary, and recovery test.
For example, replace “SQS solves reliability” with “A durable queue decouples request latency from processing; my worker uses a business-key conditional write, tracks oldest-message age, and can safely replay after a crash.” Replace “use DynamoDB because it scales” with the exact key access, conditional update, and consistency requirement you need. The second answers can be challenged and verified.
If the invitation provides sample material, learn the interface and response mode. Then practice the architecture reasoning independently. When the prompt omits a constraint, state what you would confirm.
Sources and further reading
- CodeSignal technical assessments catalog — official listing and skill tags for AWS Engineering Assessment.
- CodeSignal June 2025 product update — official announcement of the assessment.
- CodeSignal: Taking an assessment — generic invitation and practice-area guidance; not an AWS-specific blueprint.
- AWS Well-Architected: Fail fast and limit queues — backlog age and DLQ operational considerations.
- AWS Well-Architected: Control and limit retry calls — bounded retries, backoff, and jitter.
- Amazon SQS outage recovery scenarios — visibility timeout, duplicate delivery, and DLQ behavior.