You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Reported downstream in aws/aws-sam-cli#9200: a user who starts a local durable execution with sam local invoke --durable-execution-name test cannot correlate that name with anything afterwards — sam local execution history/get take an ARN, and the emulator's ARN contains no trace of the name.
Current behavior
The emulator generates a placeholder ARN in Execution.new() (execution.py):
# make a nicer arn# Pattern: arn:(aws[a-zA-Z-]*)?:lambda:...:durable-execution:...returnExecution(
durable_execution_arn=str(uuid4()) +"/"+ (input.invocation_idorstr(uuid4())),
...
)
Two problems:
It doesn't match the real service ARN shape, so the execution name (and function name) appear nowhere in the identifier. Locally, DurableExecutionName is effectively write-only.
It conflates the second path segment with the invocation ID; the real ARN's last segment is a distinct execution ID.
(The comment's intended pattern is also stale — it predates the current public API shape.)
Expected behavior
Generate ARNs matching the public DurableExecutionArn pattern from the Lambda service model:
Everything needed is already on StartDurableExecutionInput (account_id, function_name, function_qualifier, execution_name are required fields). Region can be fixed to us-east-1, consistent with the hardcoded FunctionArn in executor.py's GetDurableExecution response.
Possible Implementation
Null/omitted execution name: callers (e.g. SAM CLI) may send "ExecutionName": null. Generate a name (uuid) when absent — matches cloud behavior and also fixes DurableExecutionName being null in GetDurableExecution responses.
Execution ID: use a fresh uuid4(), not invocation_id.
Routing is already safe:Route.from_string splits on / before URL-decoding, so a percent-encoded ARN stays one segment — the same mechanism that handles today's one-slash placeholder. botocore percent-encodes / in non-greedy URI params.
Store/runner treat the ARN as an opaque key; only tests asserting the placeholder shape need updating.
Questions to resolve:
Execution-name idempotency: mimic cloud idempotency behaviour — in the service, starting a durable execution with an ExecutionName that matches an existing execution for the same function is an idempotent start (the existing execution/ARN is returned rather than a new one created). The emulator currently creates a duplicate with a distinct ARN sharing the same name segment. Confirm the exact service semantics (idempotency window, retention, input-mismatch handling) and implement to match.
Function name fidelity: SAM CLI hardcodes "FunctionName": "function" in its start payload, so local ARNs would read function:function:$LATEST/.... Decide whether to pair this with a sam-cli change to pass the real logical ID so the ARN is actually informative.
Blocked by
A new emulator image release is required for this to reach SAM CLI users (:latest on ECR is still v1.2.1, built 2026-05-20 from the pre-migration repo) — see #487.
What would you like?
Context
Reported downstream in aws/aws-sam-cli#9200: a user who starts a local durable execution with
sam local invoke --durable-execution-name testcannot correlate that name with anything afterwards —sam local execution history/gettake an ARN, and the emulator's ARN contains no trace of the name.Current behavior
The emulator generates a placeholder ARN in
Execution.new()(execution.py):Two problems:
DurableExecutionNameis effectively write-only.(The comment's intended pattern is also stale — it predates the current public API shape.)
Expected behavior
Generate ARNs matching the public
DurableExecutionArnpattern from the Lambda service model:Everything needed is already on
StartDurableExecutionInput(account_id,function_name,function_qualifier,execution_nameare required fields). Region can be fixed tous-east-1, consistent with the hardcodedFunctionArninexecutor.py'sGetDurableExecutionresponse.Possible Implementation
"ExecutionName": null. Generate a name (uuid) when absent — matches cloud behavior and also fixesDurableExecutionNamebeing null inGetDurableExecutionresponses.uuid4(), notinvocation_id.Route.from_stringsplits on/before URL-decoding, so a percent-encoded ARN stays one segment — the same mechanism that handles today's one-slash placeholder. botocore percent-encodes/in non-greedy URI params.\S+ARN regex, Flask<path:>routes).Questions to resolve:
ExecutionNamethat matches an existing execution for the same function is an idempotent start (the existing execution/ARN is returned rather than a new one created). The emulator currently creates a duplicate with a distinct ARN sharing the same name segment. Confirm the exact service semantics (idempotency window, retention, input-mismatch handling) and implement to match."FunctionName": "function"in its start payload, so local ARNs would readfunction:function:$LATEST/.... Decide whether to pair this with a sam-cli change to pass the real logical ID so the ARN is actually informative.Blocked by
A new emulator image release is required for this to reach SAM CLI users (
:lateston ECR is still v1.2.1, built 2026-05-20 from the pre-migration repo) — see #487.