Skip to content
Weave templates

Event-Driven Serverless Pipeline

API Gateway to Lambda to EventBridge, fanned out over SQS queues with dead-letter handling, a Step Functions saga, and DynamoDB / S3 sinks — the shape most serverless backends converge on.

Template previewWeave
Rendering…

Make it your own.

{
  "nodes": [
    { "id": "fan", "type": "container", "label": "Asynchronous fan-out", "x": 780, "y": 20, "width": 360, "height": 460, "fill": "rgba(219,234,254,0.22)", "stroke": "#1d4ed8" },

    { "id": "mob", "type": "mobile-device",  "label": "Mobile clients",   "x": 40, "y": 60,  "width": 130, "height": 104, "fill": "#e0f2fe", "stroke": "#0369a1" },
    { "id": "web", "type": "browser-window", "label": "Web storefront",   "x": 40, "y": 200, "width": 130, "height": 104, "fill": "#e0f2fe", "stroke": "#0369a1" },
    { "id": "iot", "type": "iot-sensor",     "label": "Store terminals",  "x": 40, "y": 340, "width": 130, "height": 104, "fill": "#e0f2fe", "stroke": "#0369a1" },

    { "id": "apigw", "type": "aws-apigw",  "label": "API Gateway",       "x": 230, "y": 190, "width": 130, "height": 110, "fill": "#fff7ed", "stroke": "#f97316" },
    { "id": "ing",   "type": "aws-lambda", "label": "Lambda — validate", "x": 420, "y": 190, "width": 130, "height": 110, "fill": "#fff7ed", "stroke": "#f97316" },
    { "id": "bus",   "type": "event-bus",  "label": "EventBridge — orders bus", "x": 610, "y": 193, "width": 130, "height": 104, "fill": "#ede9fe", "stroke": "#6d28d9", "bold": true },
    { "id": "sfn",   "type": "gear",       "label": "Step Functions — refund saga", "x": 610, "y": 340, "width": 130, "height": 104, "fill": "#dbeafe", "stroke": "#1d4ed8" },

    { "id": "q1",  "type": "aws-sqs",    "label": "SQS — fulfilment", "x": 800, "y": 60,  "width": 130, "height": 110, "fill": "#fff7ed", "stroke": "#f97316" },
    { "id": "q2",  "type": "aws-sqs",    "label": "SQS — analytics",  "x": 800, "y": 190, "width": 130, "height": 110, "fill": "#fff7ed", "stroke": "#f97316" },
    { "id": "dlq", "type": "aws-sqs",    "label": "SQS — dead letter","x": 800, "y": 330, "width": 130, "height": 110, "fill": "#fee2e2", "stroke": "#b91c1c" },
    { "id": "w1",  "type": "aws-lambda", "label": "Lambda — fulfil",   "x": 990, "y": 60,  "width": 130, "height": 110, "fill": "#fff7ed", "stroke": "#f97316" },
    { "id": "w2",  "type": "aws-lambda", "label": "Lambda — enrich",   "x": 990, "y": 190, "width": 130, "height": 110, "fill": "#fff7ed", "stroke": "#f97316" },
    { "id": "alm", "type": "bell",       "label": "CloudWatch alarm",  "x": 990, "y": 333, "width": 130, "height": 104, "fill": "#fee2e2", "stroke": "#b91c1c" },

    { "id": "ddb", "type": "aws-dynamo", "label": "DynamoDB — orders", "x": 1180, "y": 60,  "width": 130, "height": 110, "fill": "#fff7ed", "stroke": "#f97316" },
    { "id": "s3",  "type": "aws-s3",     "label": "S3 — raw events",   "x": 1180, "y": 190, "width": 130, "height": 110, "fill": "#fff7ed", "stroke": "#f97316" },
    { "id": "sns", "type": "aws-sns",    "label": "SNS — alerts",      "x": 1180, "y": 330, "width": 130, "height": 110, "fill": "#fff7ed", "stroke": "#f97316" },
    { "id": "oc",  "type": "user-group", "label": "On-call engineer",  "x": 1180, "y": 470, "width": 130, "height": 104, "fill": "#f1f5f9", "stroke": "#475569" }
  ],
  "edges": [
    { "id": "s1",  "source": "mob",   "target": "apigw" },
    { "id": "s2",  "source": "web",   "target": "apigw" },
    { "id": "s3e", "source": "iot",   "target": "apigw" },
    { "id": "s4",  "source": "apigw", "target": "ing", "label": "POST /events", "thickness": 3 },
    { "id": "s5",  "source": "ing",   "target": "bus", "label": "PutEvents",    "thickness": 3 },
    { "id": "s6",  "source": "bus",   "target": "q1",  "label": "orderPlaced" },
    { "id": "s7",  "source": "bus",   "target": "q2",  "label": "all events" },
    { "id": "s8",  "source": "bus",   "target": "sfn", "label": "refundRequested" },
    { "id": "s9",  "source": "q1",    "target": "w1" },
    { "id": "s10", "source": "q2",    "target": "w2" },
    { "id": "s11", "source": "q1",    "target": "dlq", "label": "after 3 attempts", "style": "dashed" },
    { "id": "s12", "source": "q2",    "target": "dlq", "style": "dashed" },
    { "id": "s13", "source": "w1",    "target": "ddb", "label": "order state" },
    { "id": "s14", "source": "w2",    "target": "s3",  "label": "parquet, hourly" },
    { "id": "s15", "source": "sfn",   "target": "ddb", "label": "refund state" },
    { "id": "s16", "source": "dlq",   "target": "alm", "label": "depth > 0" },
    { "id": "s17", "source": "alm",   "target": "sns" },
    { "id": "s18", "source": "sns",   "target": "oc",  "label": "page" }
  ]
}