AWS Lambda Durable Functions
AWS LabsOfficialPublished by AWS Labs
- Skill
- Tool integration
- Cloud and DevOps
- Apache-2.0
- Low risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The AWS Lambda Durable Functions skill provides a framework for orchestrating complex, multi-step applications that require long-running execution, automatic state persistence, and robust error handling. It enables developers to implement patterns like sagas, human-in-the-loop callbacks, and retries while ensuring progress is maintained across interruptions. The skill covers the replay model, step operations, and testing strategies for both TypeScript and Python environments, helping developers build reliable serverless architectures that can run for up to a year.
What it does
- Orchestrates multi-step serverless workflows with automatic state persistence.
- Implements complex error handling patterns including sagas and circuit breakers.
- Supports long-running executions with wait/callback patterns and human-in-the-loop integration.
- Provides a replay-aware environment to ensure determinism in distributed serverless functions.
- Offers testing utilities via LocalDurableTestRunner for local development and validation.
- Enables dynamic step naming and advanced concurrency patterns for AI agents and batch processing.
When to use it
- When building workflows that need to persist state across multiple Lambda invocations.
- When implementing long-running processes that require wait times or external system callbacks.
- When you need robust retry logic and error recovery for distributed serverless tasks.
- When developing complex state machines or saga-based transaction management in AWS.
- When creating AI agent workflows that require reasoning and multi-step tool execution.
Advantages
- Maintains reliable progress for workflows that may run for up to one year.
- Simplifies complex orchestration logic through a structured replay model.
- Provides built-in support for idempotent operations and retry strategies.
- Enables local testing of distributed stateful logic before cloud deployment.
- Reduces boilerplate code for managing state, timeouts, and error recovery.
Usage examples
- “How do I implement a retry strategy for a database update in a durable function?”
- The agent provides a code example using context.step with retry options, explaining how to classify errors as transient or permanent to ensure only appropriate operations are retried.
- “Show me how to wait for an external callback in a Python durable function.”
- The agent generates a Python snippet using context.wait_for_callback, including configuration for timeouts and fallback logic to handle cases where the callback is not received.
- “I am getting a non-deterministic error in my Lambda function, how do I fix it?”
- The agent explains the replay model, identifies non-deterministic code (like Date.now or API calls) outside of steps, and provides a refactored code block moving those calls into context.step.
- “How do I test my durable function locally?”
- The agent guides the user to use the LocalDurableTestRunner, providing a template for instantiating the runner with their handler and executing test cases to verify replay behavior.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/awslabs/aws-lambda-durable-functions/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip aws-lambda-durable-functions.zip -d .agents/skills
Documentation by AWS Labs
AWS Lambda durable functions
Build resilient multi-step applications and AI workflows that can execute for up to 1 year while maintaining reliable progress despite interruptions.
Onboarding
Step 1: Validate Prerequisites
Before using AWS Lambda durable functions, verify:
AWS CLI is installed (2.33.22 or higher) and configured:
aws --version aws sts get-caller-identityRuntime environment is ready:
For TypeScript/JavaScript: Node.js 22+ (
node --version)For Python: Python 3.11+ (
python --version. Note that currently only Lambda runtime environments 3.13+ come with the Durable Execution SDK pre-installed. 3.11 is the min supported Python version by the Durable SDK itself, however, you could use OCI to bring your own container image with your own Python runtime + Durable SDK.)
Deployment capability exists (one of):
AWS SAM CLI (
sam --version) 1.153.1 or higherAWS CDK (
cdk --version) v2.237.1 or higherDirect Lambda deployment access
Step 2: Select language and IaC framework
Language Selection
Default: TypeScript
Override syntax:
"use Python" → Generate Python code
"use JavaScript" → Generate JavaScript code
When not specified, ALWAYS use TypeScript
IaC framework selection
Default: CDK
Override syntax:
"use CloudFormation" → Generate YAML templates
"use SAM" → Generate YAML templates
When not specified, ALWAYS use CDK
Error Scenarios
Unsupported Language
List detected language
State: "Durable Execution SDK is not yet available for [framework]"
Suggest supported languages as alternatives
Unsupported IaC Framework
List detected framework
State: "[framework] might not support Lambda durable functions yet"
Suggest supported frameworks as alternatives
Serverless MCP Server Unavailable
Inform user: "AWS Serverless MCP not responding"
Ask: "Proceed without MCP support?"
DO NOT continue without user confirmation
Step 3: Install SDK
For TypeScript/JavaScript:
npm install @aws/durable-execution-sdk-js
npm install --save-dev @aws/durable-execution-sdk-js-testingFor Python:
pip install aws-durable-execution-sdk-python
pip install aws-durable-execution-sdk-python-testingWhen to Load Reference Files
Load the appropriate reference file based on what the user is working on:
Getting started, basic setup, example, ESLint, or Jest setup -> see getting-started.md
Understanding replay model, determinism, or non-deterministic errors -> see replay-model-rules.md
Creating steps, atomic operations, or retry logic -> see step-operations.md
Waiting, delays, callbacks, external systems, or polling -> see wait-operations.md
Parallel execution, map operations, batch processing, or concurrency -> see concurrent-operations.md
Error handling, retry strategies, saga pattern, or compensating transactions -> see error-handling.md
Advanced error handling, timeout handling, circuit breakers, or conditional retries -> see advanced-error-handling.md
Testing, local testing, cloud testing, test runner, or flaky tests -> see testing-patterns.md
Deployment, CloudFormation, CDK, SAM, log groups, deploy, or infrastructure -> see deployment-iac.md
Advanced patterns, GenAI agents, completion policies, step semantics, or custom serialization -> see advanced-patterns.md
troubleshooting, stuck execution, failed execution, debug execution ID, execution history, execution error, why did my execution fail, execution timed out, callback not received, diagnose execution, or root cause execution -> see troubleshooting-executions.md
Quick Reference
Basic Handler Pattern
TypeScript:
import { withDurableExecution, DurableContext } from '@aws/durable-execution-sdk-js';
export const handler = withDurableExecution(async (event, context: DurableContext) => {
const result = await context.step('process', async () => processData(event));
return result;
});Python:
from aws_durable_execution_sdk_python import durable_execution, DurableContext
@durable_execution
def handler(event: dict, context: DurableContext) -> dict:
result = context.step(lambda _: process_data(event), name='process')
return resultCritical Rules
All non-deterministic code MUST be in steps (Date.now, Math.random, API calls)
Cannot nest durable operations - use
runInChildContextto group operationsClosure mutations are lost on replay - return values from steps
Side effects outside steps repeat - use
context.logger(replay-aware)
Python API Differences
The Python SDK differs from TypeScript in several key areas:
Steps: Use
@durable_stepdecorator +context.step(my_step(args)), or inlinecontext.step(lambda _: ..., name='...'). Prefer the decorator for automatic step naming.Wait:
context.wait(duration=Duration.from_seconds(n), name='...')Exceptions:
ExecutionError(permanent),InvocationError(transient),CallbackError(callback failures)Testing: Use
DurableFunctionTestRunnerclass directly - instantiate with handler, use context manager, callrun(input=...)
Invocation Requirements
Durable functions require qualified ARNs (version, alias, or $LATEST):
# Valid
aws lambda invoke --function-name my-function:1 output.json
aws lambda invoke --function-name my-function:prod output.json
# Invalid - will fail
aws lambda invoke --function-name my-function output.jsonIAM Permissions
Your Lambda execution role MUST have the AWSLambdaBasicDurableExecutionRolePolicy managed policy attached. This includes:
lambda:CheckpointDurableExecution- Persist execution statelambda:GetDurableExecutionState- Retrieve execution stateCloudWatch Logs permissions
Additional permissions needed for:
Durable invokes:
lambda:InvokeFunctionon target function ARNsExternal callbacks: Systems need
lambda:SendDurableExecutionCallbackSuccessandlambda:SendDurableExecutionCallbackFailure
Validation Guidelines
When writing or reviewing durable function code, ALWAYS check for these replay model violations:
Non-deterministic code outside steps:
Date.now(),Math.random(), UUID generation, API calls, database queries must all be inside stepsNested durable operations in step functions: Cannot call
context.step(),context.wait(), orcontext.invoke()inside a step function — usecontext.runInChildContext()insteadClosure mutations that won't persist: Variables mutated inside steps are NOT preserved across replays — return values from steps instead
Side effects outside steps that repeat on replay: Use
context.loggerfor logging (it is replay-aware and deduplicates automatically)
When implementing or modifying tests for durable functions, ALWAYS verify:
All operations have descriptive names
Tests get operations by NAME, never by index
Replay behavior is tested with multiple invocations
Use
LocalDurableTestRunnerfor local testing
MCP Server Configuration
Write access is enabled by default. The plugin ships with --allow-write in .mcp.json, so the MCP server can create projects, generate IaC, and deploy on behalf of the user.
Access to sensitive data (like Lambda and API Gateway logs) is not enabled by default. To grant it, add --allow-sensitive-data-access to .mcp.json.
Resources
Files
- ATTRIBUTION.mdAdded by AutoGineer942 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer89 B
- SKILL.md9.0 KiB
- references/advanced-error-handling.md4.9 KiB
- references/advanced-patterns.md9.8 KiB
- references/concurrent-operations.md8.4 KiB
- references/deployment-iac.md14.3 KiB
- references/error-handling.md10.9 KiB
- references/getting-started.md11.1 KiB
- references/replay-model-rules.md8.3 KiB
- references/step-operations.md7.4 KiB
- references/testing-patterns.md17.4 KiB
- references/troubleshooting-executions.md8.2 KiB
- references/wait-operations.md9.5 KiB
references/deployment-iac.md
Deployment with Infrastructure as Code
Deploy durable functions using CloudFormation, CDK, or SAM.
IaC framework selection
Default: CDK
Override syntax:
"use CloudFormation" → Generate YAML templates
"use SAM" → Generate YAML templates
When not specified, ALWAYS use CDK
Error Scenario: Unsupported IaC Framework
List detected framework
State: "[framework] might not support Lambda durable functions yet"
Suggest supported frameworks as alternatives
Requirements
All durable functions require:
DurableConfig property on the function
AWSLambdaBasicDurableExecutionRolePolicy attached to execution role
Qualified ARN (version or alias) for invocation
AWS CloudFormation
template.yaml:
AWSTemplateFormatVersion: '2010-09-09'
Resources:
DurableFunctionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicDurableExecutionRolePolicy
DurableFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: myDurableFunction
Runtime: nodejs24.x # or python3.14
Handler: index.handler
Role: !GetAtt DurableFunctionRole.Arn
Code:
ZipFile: |
// Your durable function code
DurableConfig:
ExecutionTimeout: 3600 # Max execution time (seconds)
RetentionPeriodInDays: 7 # How long to keep execution state
Environment:
Variables:
LOG_LEVEL: INFO
DurableFunctionVersion:
Type: AWS::Lambda::Version
Properties:
FunctionName: !Ref DurableFunction
DurableFunctionAlias:
Type: AWS::Lambda::Alias
Properties:
FunctionName: !Ref DurableFunction
FunctionVersion: !GetAtt DurableFunctionVersion.Version
Name: prod
Outputs:
FunctionArn:
Value: !GetAtt DurableFunction.Arn
AliasArn:
Value: !Ref DurableFunctionAliasDeploy:
aws cloudformation deploy \
--template-file template.yaml \
--stack-name my-durable-function \
--capabilities CAPABILITY_IAMAWS CDK
TypeScript:
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as iam from 'aws-cdk-lib/aws-iam';
export class DurableFunctionStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const durableFunction = new lambda.Function(this, 'DurableFunction', {
runtime: lambda.Runtime.NODEJS_24_X, // or PYTHON_3_14
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
durableConfig: {
executionTimeout: cdk.Duration.hours(1),
retentionPeriod: cdk.Duration.days(7)
},
environment: {
LOG_LEVEL: 'INFO'
}
});
// CDK automatically adds checkpoint permissions when durableConfig is set
// Create version and alias
const version = durableFunction.currentVersion;
const alias = new lambda.Alias(this, 'ProdAlias', {
aliasName: 'prod',
version: version
});
// Output the qualified ARN
new cdk.CfnOutput(this, 'FunctionAliasArn', {
value: alias.functionArn
});
}
}Deploy:
cdk deployCDK Custom Log Group Management
Best Practice: Explicitly create and manage CloudWatch Log Groups for better control over retention, cleanup, and costs.
import * as logs from 'aws-cdk-lib/aws-logs';
import * as iam from 'aws-cdk-lib/aws-iam';
// 1. Create explicit log group
const functionLogGroup = new logs.LogGroup(this, 'DurableFunctionLogGroup', {
logGroupName: '/aws/lambda/myDurableFunction',
retention: logs.RetentionDays.ONE_WEEK,
removalPolicy: cdk.RemovalPolicy.DESTROY, // Delete on stack destroy
});
// 2. Link to function
const durableFunction = new lambda.Function(this, 'DurableFunction', {
runtime: lambda.Runtime.NODEJS_24_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
logGroup: functionLogGroup, // Link to managed log group
durableConfig: {
executionTimeout: cdk.Duration.hours(1),
retentionPeriod: cdk.Duration.days(7)
}
});
// 3. Add durable execution policy (required with explicit log groups)
durableFunction.role?.addManagedPolicy(
iam.ManagedPolicy.fromAwsManagedPolicyName(
'service-role/AWSLambdaBasicDurableExecutionRolePolicy'
)
);Benefits:
Explicit Cleanup:
removalPolicy: cdk.RemovalPolicy.DESTROYensures log groups are deleted when stack is destroyedCustom Retention: Set retention periods matching compliance/debugging needs
Predictable Naming: Control exact log group name
Cost Control: Avoid accumulating costs from orphaned log groups
When to use:
✅ Production environments where log retention policies must be enforced
✅ Development/test environments where automatic cleanup saves costs
✅ Multi-function stacks where consistent log management is needed
Important: Don't forget to add AWSLambdaBasicDurableExecutionRolePolicy when using explicit log groups.
AWS SAM
template.yaml:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Globals:
Function:
Timeout: 900
MemorySize: 512
Resources:
DurableFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: myDurableFunction
Runtime: nodejs24.x # or python3.14
Handler: index.handler
CodeUri: ./src
DurableConfig:
ExecutionTimeout: 3600
RetentionPeriodInDays: 7
Policies:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicDurableExecutionRolePolicy
AutoPublishAlias: prod
Environment:
Variables:
LOG_LEVEL: INFO
Outputs:
FunctionArn:
Value: !GetAtt DurableFunction.Arn
AliasArn:
Value: !Ref DurableFunction.AliasDeploy:
sam build
sam deploy --guidedDurable Invokes
For functions that invoke other durable functions:
CloudFormation:
DurableFunctionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicDurableExecutionRolePolicy
Policies:
- PolicyName: InvokeOtherFunctions
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- lambda:InvokeFunction
Resource:
- !GetAtt TargetFunction.Arn
- !Sub '${TargetFunction.Arn}:*' # For versions/aliasesCDK:
const targetFunction = new lambda.Function(this, 'TargetFunction', {
// ... configuration
});
const orchestratorFunction = new lambda.Function(this, 'OrchestratorFunction', {
// ... configuration with durableConfig
});
// Grant invoke permission
targetFunction.grantInvoke(orchestratorFunction);External Callbacks
For external systems to send callbacks:
IAM Policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:SendDurableExecutionCallbackSuccess",
"lambda:SendDurableExecutionCallbackFailure",
"lambda:SendDurableExecutionCallbackHeartbeat"
],
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:myDurableFunction:*"
}
]
}Environment Configuration
Development:
DurableFunction:
Type: AWS::Lambda::Function
Properties:
DurableConfig:
ExecutionTimeout: 900 # 15 minutes
RetentionPeriodInDays: 1 # Short retention
Environment:
Variables:
LOG_LEVEL: DEBUG
ENVIRONMENT: developmentProduction:
DurableFunction:
Type: AWS::Lambda::Function
Properties:
DurableConfig:
ExecutionTimeout: 86400 # 24 hours
RetentionPeriodInDays: 30 # Long retention
Environment:
Variables:
LOG_LEVEL: INFO
ENVIRONMENT: productionMulti-Environment Deployment
CDK with Stages:
const app = new cdk.App();
new DurableFunctionStack(app, 'DurableFunction-Dev', {
env: { account: '123456789012', region: 'us-east-1' },
stage: 'dev',
durableConfig: {
executionTimeout: cdk.Duration.minutes(15),
retentionPeriod: cdk.Duration.days(1)
}
});
new DurableFunctionStack(app, 'DurableFunction-Prod', {
env: { account: '123456789012', region: 'us-east-1' },
stage: 'prod',
durableConfig: {
executionTimeout: cdk.Duration.hours(24),
retentionPeriod: cdk.Duration.days(30)
}
});Invocation Examples
Critical Requirements
⚠️ Important Invocation Rules:
Qualified Function Name Required: You MUST provide a qualified function name with version, alias, or
:$LATESTIdempotency with durable-execution-name: Use this parameter to ensure the same execution name always refers to the same execution
Binary Format: Use
--cli-binary-format raw-in-base64-outto avoid base64 encoding issues
Synchronous Invocation (RequestResponse)
Synchronous invocation waits for the function to complete and returns the result immediately. Suitable for short workflows.
aws lambda invoke \
--function-name 'myDurableFunction:$LATEST' \
--invocation-type RequestResponse \
--durable-execution-name "execution-123" \
--payload '{"userId":"12345","action":"process"}' \
--cli-binary-format raw-in-base64-out \
--output json \
response.json
# View the response
cat response.jsonWhen to use RequestResponse:
Short-running workflows (under 15 minutes total)
When you need the result immediately
Interactive applications requiring synchronous responses
Asynchronous Invocation (Event)
Asynchronous invocation returns immediately with the execution ID. Ideal for long-running workflows.
aws lambda invoke \
--function-name 'myDurableFunction:$LATEST' \
--invocation-type Event \
--durable-execution-name "background-task-456" \
--payload '{"orderId":"ORD-789","amount":99.99}' \
--cli-binary-format raw-in-base64-out \
--output json \
response.json
# Response contains execution ID, not the result
cat response.jsonWhen to use Event:
Long-running workflows (hours, days, or longer)
Background processing tasks
Workflows with wait operations or human-in-the-loop steps
Idempotency with durable-execution-name
The --durable-execution-name parameter ensures that the same execution is never created twice:
# First invocation - creates new execution
aws lambda invoke \
--function-name 'myDurableFunction:$LATEST' \
--invocation-type RequestResponse \
--durable-execution-name "order-processing-ORD-123" \
--payload '{"orderId":"ORD-123"}' \
--cli-binary-format raw-in-base64-out \
response.json
# Second invocation with same execution name - returns existing execution result
aws lambda invoke \
--function-name 'myDurableFunction:$LATEST' \
--invocation-type RequestResponse \
--durable-execution-name "order-processing-ORD-123" \
--payload '{"orderId":"ORD-123"}' \
--cli-binary-format raw-in-base64-out \
response.jsonUsing Specific Function Versions
Durable functions require qualified ARNs (version, alias, or $LATEST):
# ✅ Invoke specific version
aws lambda invoke \
--function-name 'myDurableFunction:1' \
--invocation-type RequestResponse \
--durable-execution-name "versioned-exec-1" \
--payload '{"test":"data"}' \
--cli-binary-format raw-in-base64-out \
response.json
# ✅ Invoke using alias
aws lambda invoke \
--function-name 'myDurableFunction:production' \
--invocation-type RequestResponse \
--durable-execution-name "prod-exec-1" \
--payload '{"test":"data"}' \
--cli-binary-format raw-in-base64-out \
response.json
# ❌ Unqualified - will fail!
aws lambda invoke \
--function-name 'myDurableFunction' \
--payload '{"test":"data"}' \
response.json
# Error: Durable execution requires qualified function identifierMonitoring and Observability
CloudWatch Logs:
DurableFunction:
Type: AWS::Lambda::Function
Properties:
# ... other properties
LoggingConfig:
LogFormat: JSON
LogGroup: !Ref DurableFunctionLogGroup
DurableFunctionLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: /aws/lambda/myDurableFunction
RetentionInDays: 7CloudWatch Alarms:
DurableFunctionErrorAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: DurableFunction-Errors
MetricName: Errors
Namespace: AWS/Lambda
Statistic: Sum
Period: 300
EvaluationPeriods: 1
Threshold: 5
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: FunctionName
Value: !Ref DurableFunctionBest Practices
Always use qualified ARNs (versions or aliases) for invocation
Set appropriate execution timeouts based on workflow duration
Configure retention periods to balance cost and debugging needs
Use aliases for production deployments
Grant minimal IAM permissions - only what's needed
Enable structured logging (JSON format)
Set up CloudWatch alarms for errors and throttles
Use environment variables for configuration
Deploy to multiple environments (dev, staging, prod)
Version your infrastructure code alongside function code
Common issues
Function Not Durable
Issue: Function executes but doesn't checkpoint.
Solution: Verify DurableConfig is set and role has checkpoint permissions.
Invocation Fails with "Unqualified ARN"
Issue: InvalidParameterValueException: Durable execution requires qualified function identifier
Solution: Use version, alias, or $LATEST:
# ✅ Correct
aws lambda invoke --function-name myFunction:prod ...
aws lambda invoke --function-name myFunction:1 ...
# ❌ Wrong
aws lambda invoke --function-name myFunction ...Checkpoint Permission Denied
Issue: AccessDeniedException: User is not authorized to perform: lambda:CheckpointDurableExecution
Solution: Add AWSLambdaBasicDurableExecutionRolePolicy to execution role.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server, Needs a command-line tool, Needs Python, Needs Node.js
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- AWS Labs
- Publisher
- AWS Labs (Official)
- Source
- awslabs/agent-plugins · plugins/aws-serverless/skills/aws-lambda-durable-functions · commit fbefb37
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- NOTICE (added by AutoGineer from NOTICE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by AWS Labs.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download aws-lambda-durable-functions.zip