cswork / libraryOpen practice workspace

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 questionDecision it changesFailure you must still handle
Is the result needed in the request?Synchronous API versus queued jobClient timeout after server success
Can two workers process the same item?Idempotency key and durable result stateDuplicate side effect
Is ordering global or per entity?Queue or stream partitioning and keyHead-of-line blocking
Is a record queried by key or joined relationally?Key-value/document access versus relational modelHot key, transaction conflict, migration
How old may queued work become?Backlog limit, scaling target, expiry policyA “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 eventMeaning to testAction to justify
Database latency rises before queue ageDownstream bottleneck may cause backlogReduce concurrency; inspect dependency
One message is received repeatedlyPoison item, timeout, or crashCheck receive count, visibility, DLQ
Same invoice row is inserted twiceIdempotency boundary failedAdd unique key/conditional write and repair duplicates
Queue depth falls but oldest age risesNew traffic drains while old items stickInspect blocked partition or old-item policy
Redrive begins after recoveryReplay may repeat effectsCanary 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