From 4ae3eb5afe34d8006c59a7b7dfe89a9fbb8cab99 Mon Sep 17 00:00:00 2001 From: Ben Freiberg <9841563+bfreiberg@users.noreply.github.com> Date: Fri, 27 Mar 2026 22:54:12 +0100 Subject: [PATCH] feat(sfn-s3vectors-rag-refresh-cdk): Add S3 Vectors RAG refresh pattern with CDK - Add Step Functions state machine for automated document ingestion pipeline - Create S3 Vectors knowledge base with distributed map for parallel processing - Implement Lambda functions for embedding generation, validation, and rollback - Add CDK infrastructure as code for complete stack deployment - Include comprehensive README with deployment and testing instructions - Add example pattern configuration and state machine visualization - Configure TypeScript build setup with tsconfig and package dependencies - Enable vector embedding via Amazon Bedrock Titan Text Embeddings V2 - Implement validation and automatic rollback on ingestion failure --- sfn-s3vectors-rag-refresh-cdk/README.md | 135 ++++++++++ sfn-s3vectors-rag-refresh-cdk/bin/app.ts | 13 + sfn-s3vectors-rag-refresh-cdk/cdk.json | 8 + .../example-pattern.json | 68 +++++ sfn-s3vectors-rag-refresh-cdk/lambda/embed.ts | 51 ++++ .../lambda/package.json | 10 + .../lambda/rollback.ts | 27 ++ .../lambda/tsconfig.json | 17 ++ .../lambda/validate.ts | 62 +++++ .../lib/rag-refresh-stack.ts | 250 ++++++++++++++++++ sfn-s3vectors-rag-refresh-cdk/package.json | 21 ++ .../state-machine.png | Bin 0 -> 95058 bytes sfn-s3vectors-rag-refresh-cdk/tsconfig.json | 27 ++ 13 files changed, 689 insertions(+) create mode 100644 sfn-s3vectors-rag-refresh-cdk/README.md create mode 100644 sfn-s3vectors-rag-refresh-cdk/bin/app.ts create mode 100644 sfn-s3vectors-rag-refresh-cdk/cdk.json create mode 100644 sfn-s3vectors-rag-refresh-cdk/example-pattern.json create mode 100644 sfn-s3vectors-rag-refresh-cdk/lambda/embed.ts create mode 100644 sfn-s3vectors-rag-refresh-cdk/lambda/package.json create mode 100644 sfn-s3vectors-rag-refresh-cdk/lambda/rollback.ts create mode 100644 sfn-s3vectors-rag-refresh-cdk/lambda/tsconfig.json create mode 100644 sfn-s3vectors-rag-refresh-cdk/lambda/validate.ts create mode 100644 sfn-s3vectors-rag-refresh-cdk/lib/rag-refresh-stack.ts create mode 100644 sfn-s3vectors-rag-refresh-cdk/package.json create mode 100644 sfn-s3vectors-rag-refresh-cdk/state-machine.png create mode 100644 sfn-s3vectors-rag-refresh-cdk/tsconfig.json diff --git a/sfn-s3vectors-rag-refresh-cdk/README.md b/sfn-s3vectors-rag-refresh-cdk/README.md new file mode 100644 index 000000000..9f5ea8938 --- /dev/null +++ b/sfn-s3vectors-rag-refresh-cdk/README.md @@ -0,0 +1,135 @@ +# Knowledge base refresh pipeline with AWS Step Functions and Amazon S3 Vectors + +This pattern deploys an AWS Step Functions workflow that automates the ingestion of new documents into an Amazon S3 Vectors knowledge base so AI agents always answer from up-to-date information. When new documents land in S3, the workflow fans out via Distributed Map to generate vector embeddings using Amazon Bedrock and store them with `PutVectors` in parallel. After ingestion, `QueryVectors` validates that the new content is searchable, and a Choice state either confirms success or rolls back by deleting the newly added vectors if validation fails. + +Learn more about this pattern at Serverless Land Patterns: [https://serverlessland.com/patterns/sfn-s3vectors-rag-refresh-cdk](https://serverlessland.com/patterns/sfn-s3vectors-rag-refresh-cdk) + +Important: this application uses various AWS services and there are costs associated with these services after the Free Tier usage - please see the [AWS Pricing page](https://aws.amazon.com/pricing/) for details. You are responsible for any AWS costs incurred. No warranty is implied in this example. + +## Requirements + +* [Create an AWS account](https://portal.aws.amazon.com/gp/aws/developer/registration/index.html) if you do not already have one and log in. The IAM user that you use must have sufficient permissions to make necessary AWS service calls and manage AWS resources. +* [AWS CLI v2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) (latest available version) installed and configured +* [Git Installed](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) +* [AWS CDK](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html) (version 2.221.0 or later) installed and configured +* [Node.js 22.x](https://nodejs.org/) installed + +## Deployment Instructions + +1. Create a new directory, navigate to that directory in a terminal and clone the GitHub repository: + + ```bash + git clone https://github.com/aws-samples/serverless-patterns + ``` + +1. Change directory to the pattern directory: + + ```bash + cd sfn-s3vectors-rag-refresh-cdk + ``` + +1. Install the project dependencies: + + ```bash + npm install + ``` + +1. Install the Lambda dependencies: + + ```bash + cd lambda && npm install && cd .. + ``` + +1. Deploy the CDK stack: + + ```bash + cdk deploy + ``` + + Note: Deploy to your default AWS region. Please refer to the [AWS capabilities explorer](https://builder.aws.com/build/capabilities/explore) for feature availability in your desired region. + +1. Note the outputs from the CDK deployment process. These contain the resource names used for testing. + +## How it works + +This pattern creates a single stack with the following resources: + +1. **S3 Document Bucket** — Stores the source documents to be ingested. Upload files to the `documents/` prefix. + +2. **S3 Vectors Bucket & Index** — An S3 Vectors vector bucket with a `knowledge-base` index configured for 1024-dimensional cosine similarity (matching Amazon Titan Text Embeddings V2 output). + +3. **Step Functions State Machine** — Orchestrates the full ingestion pipeline: + - **Distributed Map** fans out over every object under `s3:///documents/`, processing up to 40 documents concurrently + - For each document, the **EmbedAndStore** Lambda reads the file, calls Amazon Bedrock Titan Text Embeddings V2 to generate a 1024-dimensional vector, and writes it to the S3 Vectors index via `PutVectors` with the source file path as metadata + - **ValidateIngestion** Lambda fetches the Distributed Map result manifest from S3, collects all vector keys from the SUCCEEDED results, generates a probe embedding, and calls `QueryVectors` to confirm at least one newly ingested vector is returned + - A **Choice** state checks the validation result: on success the workflow completes; on failure the **RollbackVectors** Lambda calls `DeleteVectors` to remove all newly added vectors, then the workflow fails + +## Architecture + +![State Machine](state-machine.png) + +## Testing + +After deployment, upload sample documents and start the workflow. + +### Upload test documents + +```bash +BUCKET=$(aws cloudformation describe-stacks \ + --stack-name RagRefreshStack \ + --query "Stacks[0].Outputs[?OutputKey=='DocumentBucketName'].OutputValue" \ + --output text) + +echo "Amazon S3 Vectors is a new vector storage capability." > /tmp/doc1.txt +echo "Step Functions Distributed Map enables parallel processing at scale." > /tmp/doc2.txt + +aws s3 cp /tmp/doc1.txt s3://$BUCKET/documents/doc1.txt +aws s3 cp /tmp/doc2.txt s3://$BUCKET/documents/doc2.txt +``` + +### Start the workflow + +```bash +STATE_MACHINE_ARN=$(aws cloudformation describe-stacks \ + --stack-name RagRefreshStack \ + --query "Stacks[0].Outputs[?OutputKey=='StateMachineArn'].OutputValue" \ + --output text) + +aws stepfunctions start-execution \ + --state-machine-arn $STATE_MACHINE_ARN +``` + +### Monitor execution + +```bash +aws stepfunctions list-executions \ + --state-machine-arn $STATE_MACHINE_ARN \ + --max-results 1 +``` + +### Expected result + +The workflow should complete successfully. In the Step Functions console you'll see: +1. Distributed Map processed both documents in parallel +2. Each document was embedded and stored as a vector +3. Validation confirmed the vectors are queryable +4. The workflow reached the `IngestionSucceeded` state + +## Cleanup + +1. Delete the stack: + + ```bash + cdk destroy + ``` + +1. Confirm the stack has been deleted: + + ```bash + aws cloudformation list-stacks --stack-status-filter DELETE_COMPLETE + ``` + +---- +Copyright 2026 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: MIT-0 diff --git a/sfn-s3vectors-rag-refresh-cdk/bin/app.ts b/sfn-s3vectors-rag-refresh-cdk/bin/app.ts new file mode 100644 index 000000000..8fde85eb9 --- /dev/null +++ b/sfn-s3vectors-rag-refresh-cdk/bin/app.ts @@ -0,0 +1,13 @@ +#!/usr/bin/env node +import 'source-map-support/register'; +import * as cdk from 'aws-cdk-lib'; +import { RagRefreshStack } from '../lib/rag-refresh-stack'; + +const app = new cdk.App(); + +new RagRefreshStack(app, 'RagRefreshStack', { + env: { + account: process.env.CDK_DEFAULT_ACCOUNT, + region: process.env.AWS_REGION, + }, +}); diff --git a/sfn-s3vectors-rag-refresh-cdk/cdk.json b/sfn-s3vectors-rag-refresh-cdk/cdk.json new file mode 100644 index 000000000..e6475b158 --- /dev/null +++ b/sfn-s3vectors-rag-refresh-cdk/cdk.json @@ -0,0 +1,8 @@ +{ + "app": "npx ts-node --prefer-ts-exts bin/app.ts", + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": ["aws", "aws-cn"] + } +} diff --git a/sfn-s3vectors-rag-refresh-cdk/example-pattern.json b/sfn-s3vectors-rag-refresh-cdk/example-pattern.json new file mode 100644 index 000000000..75b522bf0 --- /dev/null +++ b/sfn-s3vectors-rag-refresh-cdk/example-pattern.json @@ -0,0 +1,68 @@ +{ + "title": "Knowledge base refresh pipeline with AWS Step Functions & Amazon S3 Vectors", + "description": "Automate ingestion of new documents into an Amazon S3 Vectors knowledge base using AWS Step Functions Distributed Map with validation", + "language": "TypeScript", + "level": "300", + "framework": "AWS CDK", + "introBox": { + "headline": "How it works", + "text": [ + "When new documents land in an S3 bucket, a Step Functions workflow fans out via Distributed Map to process each document in parallel.", + "For each document, a Lambda function reads the content, generates vector embeddings using Amazon Bedrock, and stores them with PutVectors in the S3 Vectors vector bucket.", + "After ingestion completes, a validation step uses QueryVectors to confirm the new content is searchable. A Choice state either confirms success or rolls back by deleting the newly added vectors if validation fails." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/sfn-s3vectors-rag-refresh-cdk", + "templateURL": "serverless-patterns/sfn-s3vectors-rag-refresh-cdk", + "projectFolder": "sfn-s3vectors-rag-refresh-cdk", + "templateFile": "lib/rag-refresh-stack.ts" + } + }, + "resources": { + "bullets": [ + { + "text": "Amazon S3 Vectors documentation", + "link": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/vectors.html" + }, + { + "text": "AWS Step Functions Distributed Map", + "link": "https://docs.aws.amazon.com/step-functions/latest/dg/concepts-asl-use-map-state-distributed.html" + }, + { + "text": "Amazon Bedrock Embeddings", + "link": "https://docs.aws.amazon.com/bedrock/latest/userguide/embeddings.html" + }, + { + "text": "AWS CDK Developer Guide", + "link": "https://docs.aws.amazon.com/cdk/latest/guide/" + } + ] + }, + "deploy": { + "text": [ + "npm install", + "cd lambda && npm install && cd ..", + "cdk deploy" + ] + }, + "testing": { + "text": [ + "See the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "text": [ + "Delete the stack: cdk destroy." + ] + }, + "authors": [ + { + "name": "Ben Freiberg", + "image": "https://serverlessland.com/assets/images/resources/contributors/ben-freiberg.jpg", + "bio": "Ben is a Senior Solutions Architect at Amazon Web Services (AWS) based in Frankfurt, Germany.", + "linkedin": "benfreiberg" + } + ] +} \ No newline at end of file diff --git a/sfn-s3vectors-rag-refresh-cdk/lambda/embed.ts b/sfn-s3vectors-rag-refresh-cdk/lambda/embed.ts new file mode 100644 index 000000000..2f437d66d --- /dev/null +++ b/sfn-s3vectors-rag-refresh-cdk/lambda/embed.ts @@ -0,0 +1,51 @@ +import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3'; +import { BedrockRuntimeClient, InvokeModelCommand } from '@aws-sdk/client-bedrock-runtime'; +import { S3VectorsClient, PutVectorsCommand } from '@aws-sdk/client-s3vectors'; + +const s3 = new S3Client(); +const bedrock = new BedrockRuntimeClient(); +const s3vectors = new S3VectorsClient(); + +const DOCUMENT_BUCKET = process.env.DOCUMENT_BUCKET!; +const VECTOR_BUCKET_NAME = process.env.VECTOR_BUCKET_NAME!; +const VECTOR_INDEX_NAME = process.env.VECTOR_INDEX_NAME!; +const MODEL_ID = 'amazon.titan-embed-text-v2:0'; + +interface S3ItemEvent { + Key: string; +} + +export async function handler(event: S3ItemEvent) { + const { Key } = event; + + // 1. Read document from S3 + const getObj = await s3.send(new GetObjectCommand({ + Bucket: DOCUMENT_BUCKET, + Key, + })); + const text = await getObj.Body!.transformToString('utf-8'); + + // 2. Generate embedding via Bedrock Titan Embeddings V2 + const invokeResp = await bedrock.send(new InvokeModelCommand({ + modelId: MODEL_ID, + contentType: 'application/json', + accept: 'application/json', + body: JSON.stringify({ inputText: text, dimensions: 1024, normalize: true }), + })); + const embeddingResult = JSON.parse(new TextDecoder().decode(invokeResp.body)); + const embedding: number[] = embeddingResult.embedding; + + // 3. Store vector with PutVectors + const vectorKey = Key.replace(/\//g, '_'); + await s3vectors.send(new PutVectorsCommand({ + vectorBucketName: VECTOR_BUCKET_NAME, + indexName: VECTOR_INDEX_NAME, + vectors: [{ + key: vectorKey, + data: { float32: embedding }, + metadata: { source: Key }, + }], + })); + + return { vectorKey, documentKey: Key }; +} diff --git a/sfn-s3vectors-rag-refresh-cdk/lambda/package.json b/sfn-s3vectors-rag-refresh-cdk/lambda/package.json new file mode 100644 index 000000000..3b5e3d647 --- /dev/null +++ b/sfn-s3vectors-rag-refresh-cdk/lambda/package.json @@ -0,0 +1,10 @@ +{ + "name": "rag-refresh-lambdas", + "version": "1.0.0", + "main": "index.js", + "dependencies": { + "@aws-sdk/client-s3": "^3.700.0", + "@aws-sdk/client-bedrock-runtime": "^3.700.0", + "@aws-sdk/client-s3vectors": "^3.700.0" + } +} diff --git a/sfn-s3vectors-rag-refresh-cdk/lambda/rollback.ts b/sfn-s3vectors-rag-refresh-cdk/lambda/rollback.ts new file mode 100644 index 000000000..b9e953c6e --- /dev/null +++ b/sfn-s3vectors-rag-refresh-cdk/lambda/rollback.ts @@ -0,0 +1,27 @@ +import { S3VectorsClient, DeleteVectorsCommand } from '@aws-sdk/client-s3vectors'; + +const s3vectors = new S3VectorsClient(); + +const VECTOR_BUCKET_NAME = process.env.VECTOR_BUCKET_NAME!; +const VECTOR_INDEX_NAME = process.env.VECTOR_INDEX_NAME!; + +interface RollbackEvent { + vectorKeys: string[]; +} + +export async function handler(event: RollbackEvent) { + const { vectorKeys } = event; + + // DeleteVectors accepts up to 500 keys per call + const BATCH_SIZE = 500; + for (let i = 0; i < vectorKeys.length; i += BATCH_SIZE) { + const batch = vectorKeys.slice(i, i + BATCH_SIZE); + await s3vectors.send(new DeleteVectorsCommand({ + vectorBucketName: VECTOR_BUCKET_NAME, + indexName: VECTOR_INDEX_NAME, + keys: batch, + })); + } + + return { deleted: vectorKeys.length }; +} diff --git a/sfn-s3vectors-rag-refresh-cdk/lambda/tsconfig.json b/sfn-s3vectors-rag-refresh-cdk/lambda/tsconfig.json new file mode 100644 index 000000000..8d85f87f2 --- /dev/null +++ b/sfn-s3vectors-rag-refresh-cdk/lambda/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "commonjs", + "moduleResolution": "node", + "lib": ["es2022"], + "outDir": ".", + "rootDir": ".", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true + }, + "include": ["*.ts"], + "exclude": ["node_modules"] +} diff --git a/sfn-s3vectors-rag-refresh-cdk/lambda/validate.ts b/sfn-s3vectors-rag-refresh-cdk/lambda/validate.ts new file mode 100644 index 000000000..77f45656b --- /dev/null +++ b/sfn-s3vectors-rag-refresh-cdk/lambda/validate.ts @@ -0,0 +1,62 @@ +import { BedrockRuntimeClient, InvokeModelCommand } from '@aws-sdk/client-bedrock-runtime'; +import { S3VectorsClient, QueryVectorsCommand } from '@aws-sdk/client-s3vectors'; +import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3'; + +const bedrock = new BedrockRuntimeClient(); +const s3vectors = new S3VectorsClient(); +const s3 = new S3Client(); + +const VECTOR_BUCKET_NAME = process.env.VECTOR_BUCKET_NAME!; +const VECTOR_INDEX_NAME = process.env.VECTOR_INDEX_NAME!; +const MODEL_ID = 'amazon.titan-embed-text-v2:0'; + +interface ResultWriterEvent { + ResultWriterDetails: { Bucket: string; Key: string }; +} + +export async function handler(event: ResultWriterEvent) { + // Read the Distributed Map result manifest from S3 + const { Bucket, Key } = event.ResultWriterDetails; + const manifestResp = await s3.send(new GetObjectCommand({ Bucket, Key })); + const manifest = JSON.parse(await manifestResp.Body!.transformToString()); + + // Read succeeded results file(s) to extract vector keys + const destBucket = manifest.DestinationBucket; + const vectorKeys: string[] = []; + for (const result of manifest.ResultFiles?.SUCCEEDED ?? []) { + const fileResp = await s3.send(new GetObjectCommand({ Bucket: destBucket, Key: result.Key })); + const results = JSON.parse(await fileResp.Body!.transformToString()); + for (const r of results) { + const output = typeof r.Output === 'string' ? JSON.parse(r.Output) : r.Output; + if (output?.vectorKey) vectorKeys.push(output.vectorKey); + } + } + + if (vectorKeys.length === 0) { + return { valid: false, vectorKeys }; + } + + // Generate a probe embedding and query the index + const probeText = 'vector storage and embeddings for AI applications'; + const invokeResp = await bedrock.send(new InvokeModelCommand({ + modelId: MODEL_ID, + contentType: 'application/json', + accept: 'application/json', + body: JSON.stringify({ inputText: probeText, dimensions: 1024, normalize: true }), + })); + const probeEmbedding: number[] = JSON.parse(new TextDecoder().decode(invokeResp.body)).embedding; + + const queryResp = await s3vectors.send(new QueryVectorsCommand({ + vectorBucketName: VECTOR_BUCKET_NAME, + indexName: VECTOR_INDEX_NAME, + queryVector: { float32: probeEmbedding }, + topK: 5, + returnMetadata: true, + })); + + // Validate: at least one newly ingested vector appears in results + const returnedKeys = new Set(queryResp.vectors?.map(v => v.key) ?? []); + const found = vectorKeys.some(k => returnedKeys.has(k)); + + return { valid: found, vectorKeys }; +} diff --git a/sfn-s3vectors-rag-refresh-cdk/lib/rag-refresh-stack.ts b/sfn-s3vectors-rag-refresh-cdk/lib/rag-refresh-stack.ts new file mode 100644 index 000000000..b3ade6c8b --- /dev/null +++ b/sfn-s3vectors-rag-refresh-cdk/lib/rag-refresh-stack.ts @@ -0,0 +1,250 @@ +import * as cdk from 'aws-cdk-lib'; +import * as s3 from 'aws-cdk-lib/aws-s3'; +import * as s3vectors from 'aws-cdk-lib/aws-s3vectors'; +import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import * as iam from 'aws-cdk-lib/aws-iam'; +import * as logs from 'aws-cdk-lib/aws-logs'; +import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; +import * as path from 'path'; +import { Construct } from 'constructs'; + +// Titan Text Embeddings V2 produces 1024-dimensional vectors by default +const EMBEDDING_DIMENSION = 1024; + +export class RagRefreshStack extends cdk.Stack { + constructor(scope: Construct, id: string, props?: cdk.StackProps) { + super(scope, id, props); + + // --- S3 bucket for source documents --- + const documentBucket = new s3.Bucket(this, 'DocumentBucket', { + removalPolicy: cdk.RemovalPolicy.DESTROY, + autoDeleteObjects: true, + }); + + // --- S3 Vectors resources --- + const vectorBucket = new s3vectors.CfnVectorBucket(this, 'VectorBucket', { + vectorBucketName: `rag-vectors-${cdk.Aws.ACCOUNT_ID}-${cdk.Aws.REGION}`, + }); + + const vectorIndex = new s3vectors.CfnIndex(this, 'VectorIndex', { + vectorBucketName: vectorBucket.vectorBucketName!, + indexName: 'knowledge-base', + dataType: 'float32', + dimension: EMBEDDING_DIMENSION, + distanceMetric: 'cosine', + }); + vectorIndex.addDependency(vectorBucket); + + // --- Lambda: embed & store vectors --- + const embedFunction = new NodejsFunction(this, 'EmbedFunction', { + functionName: 'ragEmbedAndStore', + runtime: lambda.Runtime.NODEJS_22_X, + entry: path.join(__dirname, '../lambda/embed.ts'), + handler: 'handler', + timeout: cdk.Duration.minutes(5), + memorySize: 512, + environment: { + DOCUMENT_BUCKET: documentBucket.bucketName, + VECTOR_BUCKET_NAME: vectorBucket.vectorBucketName!, + VECTOR_INDEX_NAME: vectorIndex.indexName!, + }, + }); + + documentBucket.grantRead(embedFunction); + embedFunction.addToRolePolicy(new iam.PolicyStatement({ + actions: ['bedrock:InvokeModel'], + resources: [ + 'arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0', + ], + })); + embedFunction.addToRolePolicy(new iam.PolicyStatement({ + actions: ['s3vectors:PutVectors'], + resources: ['*'], + })); + + // --- Lambda: validate vectors via QueryVectors --- + const validateFunction = new NodejsFunction(this, 'ValidateFunction', { + functionName: 'ragValidateVectors', + runtime: lambda.Runtime.NODEJS_22_X, + entry: path.join(__dirname, '../lambda/validate.ts'), + handler: 'handler', + timeout: cdk.Duration.minutes(1), + memorySize: 256, + environment: { + VECTOR_BUCKET_NAME: vectorBucket.vectorBucketName!, + VECTOR_INDEX_NAME: vectorIndex.indexName!, + }, + }); + + documentBucket.grantRead(validateFunction); + validateFunction.addToRolePolicy(new iam.PolicyStatement({ + actions: ['bedrock:InvokeModel'], + resources: [ + 'arn:aws:bedrock:*::foundation-model/amazon.titan-embed-text-v2:0', + ], + })); + validateFunction.addToRolePolicy(new iam.PolicyStatement({ + actions: ['s3vectors:QueryVectors', 's3vectors:GetVectors'], + resources: ['*'], + })); + + // --- Lambda: rollback (delete vectors) --- + const rollbackFunction = new NodejsFunction(this, 'RollbackFunction', { + functionName: 'ragRollbackVectors', + runtime: lambda.Runtime.NODEJS_22_X, + entry: path.join(__dirname, '../lambda/rollback.ts'), + handler: 'handler', + timeout: cdk.Duration.minutes(2), + memorySize: 256, + environment: { + VECTOR_BUCKET_NAME: vectorBucket.vectorBucketName!, + VECTOR_INDEX_NAME: vectorIndex.indexName!, + }, + }); + + rollbackFunction.addToRolePolicy(new iam.PolicyStatement({ + actions: ['s3vectors:DeleteVectors'], + resources: ['*'], + })); + + // --- Step Functions workflow (JSONata) --- + + const definition = { + QueryLanguage: 'JSONata', + StartAt: 'ProcessDocuments', + States: { + ProcessDocuments: { + Type: 'Map', + ItemProcessor: { + ProcessorConfig: { + Mode: 'DISTRIBUTED', + ExecutionType: 'STANDARD', + }, + StartAt: 'EmbedAndStore', + States: { + EmbedAndStore: { + Type: 'Task', + Resource: 'arn:aws:states:::lambda:invoke', + Arguments: { + FunctionName: embedFunction.functionArn, + Payload: '{% $states.input %}', + }, + Output: { + vectorKey: '{% $states.result.Payload.vectorKey %}', + documentKey: '{% $states.result.Payload.documentKey %}', + }, + End: true, + }, + }, + }, + ItemReader: { + Resource: 'arn:aws:states:::s3:listObjectsV2', + Arguments: { + Bucket: documentBucket.bucketName, + Prefix: 'documents/', + }, + }, + MaxConcurrency: 40, + ResultWriter: { + Resource: 'arn:aws:states:::s3:putObject', + Arguments: { + Bucket: documentBucket.bucketName, + Prefix: 'results/', + }, + }, + Next: 'ValidateIngestion', + }, + ValidateIngestion: { + Type: 'Task', + Resource: 'arn:aws:states:::lambda:invoke', + Arguments: { + FunctionName: validateFunction.functionArn, + Payload: '{% $states.input %}', + }, + Output: { + valid: '{% $states.result.Payload.valid %}', + vectorKeys: '{% $states.result.Payload.vectorKeys %}', + }, + Next: 'ValidationPassed', + }, + ValidationPassed: { + Type: 'Choice', + Choices: [ + { + Condition: '{% $states.input.valid %}', + Next: 'IngestionSucceeded', + }, + ], + Default: 'RollbackVectors', + }, + IngestionSucceeded: { + Type: 'Succeed', + }, + RollbackVectors: { + Type: 'Task', + Resource: 'arn:aws:states:::lambda:invoke', + Arguments: { + FunctionName: rollbackFunction.functionArn, + Payload: { + vectorKeys: '{% $states.input.vectorKeys %}', + }, + }, + Next: 'IngestionFailed', + }, + IngestionFailed: { + Type: 'Fail', + Cause: 'Validation failed — vectors rolled back', + }, + }, + }; + + const logGroup = new logs.LogGroup(this, 'StateMachineLogGroup', { + logGroupName: '/aws/stepfunctions/rag-refresh', + retention: logs.RetentionDays.ONE_WEEK, + removalPolicy: cdk.RemovalPolicy.DESTROY, + }); + + const stateMachine = new sfn.StateMachine(this, 'RagRefreshStateMachine', { + stateMachineName: 'rag-knowledge-base-refresh', + definitionBody: sfn.DefinitionBody.fromString(JSON.stringify(definition)), + timeout: cdk.Duration.hours(1), + logs: { + destination: logGroup, + level: sfn.LogLevel.ALL, + }, + }); + + // Grant the state machine permission to read the S3 bucket (for Distributed Map) + documentBucket.grantRead(stateMachine); + documentBucket.grantReadWrite(stateMachine); + + // Grant the state machine permission to invoke the Lambda functions + embedFunction.grantInvoke(stateMachine); + validateFunction.grantInvoke(stateMachine); + rollbackFunction.grantInvoke(stateMachine); + + // Distributed Map (STANDARD child executions) needs StartExecution + DescribeExecution + StopExecution on itself + // Use a constructed ARN to avoid circular dependency between the state machine and its role policy + stateMachine.addToRolePolicy(new iam.PolicyStatement({ + actions: ['states:StartExecution', 'states:DescribeExecution', 'states:StopExecution'], + resources: [`arn:aws:states:${this.region}:${this.account}:stateMachine:rag-knowledge-base-refresh`], + })); + + // --- Outputs --- + new cdk.CfnOutput(this, 'DocumentBucketName', { + value: documentBucket.bucketName, + description: 'Upload documents to s3:///documents/', + }); + + new cdk.CfnOutput(this, 'VectorBucketName', { + value: vectorBucket.vectorBucketName!, + description: 'S3 Vectors bucket name', + }); + + new cdk.CfnOutput(this, 'StateMachineArn', { + value: stateMachine.stateMachineArn, + description: 'Step Functions state machine ARN', + }); + } +} diff --git a/sfn-s3vectors-rag-refresh-cdk/package.json b/sfn-s3vectors-rag-refresh-cdk/package.json new file mode 100644 index 000000000..b7b7629a6 --- /dev/null +++ b/sfn-s3vectors-rag-refresh-cdk/package.json @@ -0,0 +1,21 @@ +{ + "name": "sfn-s3vectors-rag-refresh-cdk", + "version": "1.0.0", + "description": "Step Functions RAG knowledge base refresh pipeline with S3 Vectors and Bedrock embeddings", + "scripts": { + "build": "tsc", + "cdk": "cdk", + "deploy": "cdk deploy", + "synth": "cdk synth" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "aws-cdk": "^2.221.0", + "typescript": "^5.0.0" + }, + "dependencies": { + "aws-cdk-lib": "^2.221.0", + "constructs": "^10.0.0", + "source-map-support": "^0.5.21" + } +} diff --git a/sfn-s3vectors-rag-refresh-cdk/state-machine.png b/sfn-s3vectors-rag-refresh-cdk/state-machine.png new file mode 100644 index 0000000000000000000000000000000000000000..23b38060b20ff66c35e31db0513cd4aa05f736fe GIT binary patch literal 95058 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Û(! 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

fE*=hZLD>r`aQOoq6! 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 literal 0 HcmV?d00001 diff --git a/sfn-s3vectors-rag-refresh-cdk/tsconfig.json b/sfn-s3vectors-rag-refresh-cdk/tsconfig.json new file mode 100644 index 000000000..9ed0a3f75 --- /dev/null +++ b/sfn-s3vectors-rag-refresh-cdk/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": ["es2020"], + "declaration": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": false, + "inlineSourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "typeRoots": ["./node_modules/@types"], + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true + }, + "exclude": ["node_modules", "cdk.out", "lambda"] +}