Skip to content
GitHub Discord

AWS Workflow

Uses the Workflow component to create an AWS Lambda durable workflow.

Hit the Invoker URL to start the workflow. The workflow logs a callback URL with a token query parameter. Open that URL to resume the waiting step.

sst.config.ts
const workflow = new sst.aws.Workflow("Workflow", {
handler: "src/workflow.handler",
});
const resolver = new sst.aws.Function("Resolver", {
handler: "src/resolver.handler",
url: true,
link: [workflow],
});
const invoker = new sst.aws.Function("Invoker", {
handler: "src/invoker.handler",
url: true,
link: [workflow, resolver],
});
src/workflow.ts
import { workflow } from "sst/aws/workflow";
interface Event {
resolverUrl: string;
}
export const handler = workflow.handler<Event>(async (event, ctx) => {
await ctx.step("start", async ({ logger }) => {
logger.info("Workflow started.");
});
const result = await ctx.waitForCallback(
"callback",
async (token, { logger }) => {
const resolverUrl = new URL(event.resolverUrl);
resolverUrl.searchParams.set("token", token);
logger.info(resolverUrl.toString());
},
{
timeout: {
minutes: 5,
},
},
);
await ctx.step("finish", async ({ logger }) => {
logger.info(result);
});
});
src/resolver.ts
import { APIGatewayProxyEventV2 } from "aws-lambda";
import { workflow } from "sst/aws/workflow";
export const handler = async (event: APIGatewayProxyEventV2) => {
const token = event.queryStringParameters?.token;
if (!token) {
return "Missing token in query parameters";
}
await workflow.succeed(token, {
payload: {
message: "Sent from the resolver."
},
});
return "Workflow callback sent. Check the logs to see the workflow succeed." ;
};
src/invoker.ts
import { Resource } from "sst";
import { workflow } from "sst/aws/workflow";
export const handler = async () => {
await workflow.start(Resource.Workflow, {
name: `workflow-example-${Date.now()}`,
payload: {
resolverUrl: Resource.Resolver.url,
},
});
return "Workflow started. Check the logs for the callback URL.";
};

View the full example.