Skip to content

AWS Lambda Deployment

FlowRAG is designed for serverless. Stateless queries, fast cold starts, no always-on containers.

Architecture

┌─────────────────┐     ┌──────────────────┐
│  Index Lambda    │     │  Query Lambda     │
│  (daily batch)   │     │  (on-demand)      │
└────────┬────────┘     └────────┬──────────┘
         │                       │
    ┌────┴───────────────────────┴────┐
    │           AWS Services          │
    │  ┌─────┐  ┌──────────┐  ┌────┐ │
    │  │  S3 │  │OpenSearch │  │ BR │ │
    │  │ (KV)│  │(Vec+Graph)│  │(AI)│ │
    │  └─────┘  └──────────┘  └────┘ │
    └─────────────────────────────────┘

Storage Setup

typescript
import { S3Client } from '@aws-sdk/client-s3';
import { Client } from '@opensearch-project/opensearch';
import { S3KVStorage } from '@flowrag/storage-s3';
import { OpenSearchVectorStorage, OpenSearchGraphStorage } from '@flowrag/storage-opensearch';

const s3Client = new S3Client({ region: 'eu-central-1' });
const osClient = new Client({
  node: 'https://my-domain.eu-central-1.es.amazonaws.com',
  // Use SigV4 auth for production
});

const storage = {
  kv: new S3KVStorage({ client: s3Client, bucket: 'my-rag-bucket', prefix: 'kv/' }),
  vector: new OpenSearchVectorStorage({ client: osClient, dimensions: 1024 }),
  graph: new OpenSearchGraphStorage({ client: osClient }),
};

Query Lambda

typescript
import { defineSchema } from '@flowrag/core';
import { createFlowRAG } from '@flowrag/pipeline';
import { BedrockEmbedder, BedrockExtractor } from '@flowrag/provider-bedrock';

const schema = defineSchema({
  entityTypes: ['SERVICE', 'DATABASE', 'PROTOCOL'],
  relationTypes: ['USES', 'PRODUCES', 'CONSUMES'],
});

export const handler = async (event: { query: string }) => {
  const rag = createFlowRAG({
    schema,
    storage,
    embedder: new BedrockEmbedder(),
    extractor: new BedrockExtractor(),
  });

  return rag.search(event.query);
};

Index Lambda

Run on a schedule (e.g., daily via EventBridge):

typescript
export const handler = async () => {
  const rag = createFlowRAG({
    schema,
    storage,
    embedder: new BedrockEmbedder(),
    extractor: new BedrockExtractor(),
  });

  // Download docs to /tmp, then index
  await rag.index('/tmp/content');
};

OpenSearch Configuration

FlowRAG accepts a pre-configured Client instance, giving you full control over authentication:

  • SigV4 for Amazon OpenSearch Service
  • Basic auth for self-managed clusters
  • IAM roles for cross-account access

See the OpenSearch docs for client configuration options.

IAM Permissions

The Lambda execution role needs:

ServiceActions
S3s3:GetObject, s3:PutObject, s3:DeleteObject, s3:ListBucket
OpenSearches:ESHttp*
Bedrockbedrock:InvokeModel

Released under the MIT License.