Here is a question worth asking before adding a state machine to any small product: if the process running step three of five dies right now, what knows that steps one and two already happened? If the honest answer is "a row I wrote myself" or "nothing", there is a durability problem. If the answer is "nothing, and that is fine because every step is cheap to repeat", an orchestrator is probably unnecessary. This guide is a decision analysis rather than a migration report. It lays out the criteria for choosing between orchestration in code and AWS Step Functions, checked against AWS documentation. The test is what survives a crash, not how many steps you have Step count is a poor signal. A five-step flow where every step is idempotent and finishes in seconds is easy to write as plain code. The signals that matter are about time and memory: Does the flow outlive one invocation? A Lambda invocation is capped at 15 minutes, while a Standard workflow ca...
How many times does one failed downstream call actually get attempted? If you cannot answer that for your own services without opening three consoles, you probably have a retry multiplier you did not choose. This guide is a reasoning exercise with documented defaults, not an incident report: the arithmetic the defaults make possible, and the decisions worth making about it. For every hop in a call chain, four things should be known: who owns the retry, how many attempts it makes, whether it backs off, and whether the work is safe to repeat. If two layers both answer "I do", the attempts multiply instead of adding. Two reasonable defaults that together form a multiplier Take a Lambda function invoked asynchronously that calls another service through an AWS SDK client. Both layers have their own retry behavior. Layer Default behavior Worst-case attempts Lambda asynchronous invocation A failed invocation is retried up to two more times 3 handler runs AWS SDK clie...