From 231a98911bbc00e763d90e2ee4c2f8fcebefff65 Mon Sep 17 00:00:00 2001 From: sandykumar93 Date: Thu, 19 Sep 2024 15:09:08 +0530 Subject: [PATCH 1/7] new pattern: lambda response streaming with dynamodb --- .../README.md | 92 +++++++++++++++++++ .../example-pattern.json | 50 ++++++++++ .../src/index.mjs | 53 +++++++++++ .../template.yaml | 51 ++++++++++ 4 files changed, 246 insertions(+) create mode 100644 lambda-streaming-ttfb-write-sam-with-dynamodb/README.md create mode 100644 lambda-streaming-ttfb-write-sam-with-dynamodb/example-pattern.json create mode 100644 lambda-streaming-ttfb-write-sam-with-dynamodb/src/index.mjs create mode 100644 lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md b/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md new file mode 100644 index 000000000..aa07b6257 --- /dev/null +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md @@ -0,0 +1,92 @@ +# Lambda Response streaming: Streaming incremental DynamoDB Query results. + +This pattern shows how to use Lambda response streaming to improve time-to-first byte using the write() For more information on the feature, see the [launch blog post](https://aws.amazon.com/blogs/compute/introducing-aws-lambda-response-streaming/). + +This pattern shows how to use Lambda response streaming to incrementally retrieve and stream DynamoDB query / scan results using the write() method. Instead of waiting for the entire query / scan operation to complete, the Lambda function streams data in batches by setting a limit on the number of items per query and sending each batch as soon as it's retrieved. This improves the time-to-first-byte (TTFB) by streaming results to the client as they become available. + +For more information on the Lambda response streaming feature, see the [launch blog post](https://aws.amazon.com/blogs/compute/introducing-aws-lambda-response-streaming/). + +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](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) installed and configured +- [Git Installed](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) +- [AWS Serverless Application Model](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) (AWS SAM) installed + +## Deployment Instructions + +1. Create a new directory, navigate to that directory in a terminal and clone the GitHub repository: + +``` +git clone https://github.com/aws-samples/serverless-patterns +``` + +1. Change directory to the pattern directory: + + ``` + cd lambda-streaming-ttfb-write-sam-with-dynamodb + ``` + +1. From the command line, use AWS SAM to deploy the AWS resources for the pattern as specified in the template.yml file: + + ``` + sam deploy -g --stack-name lambda-streaming-ttfb-write-sam-with-dynamodb + ``` + +1. During the prompts: + + - Enter a stack name + - Enter the desired AWS Region - AWS CLI default region is recommended if you are planning to run the test (test.sh) script + - Allow SAM CLI to create IAM roles with the required permissions. + +1. Once you have run `sam deploy --guided` mode once and saved arguments to a configuration file `samconfig.toml`, you can use `sam deploy` in future to use these defaults. + +AWS SAM deploys a Lambda function with streaming support and a function URL + +![AWS SAM deploy --g](https://d2908q01vomqb2.cloudfront.net/1b6453892473a467d07372d45eb05abc2031647a/2023/03/31/AWS-SAM-deploy-g.png) + +The AWS SAM output returns a Lambda function URL. + +![AWS SAM resources](https://d2908q01vomqb2.cloudfront.net/1b6453892473a467d07372d45eb05abc2031647a/2023/03/31/AWS-SAM-resources.png) + +## How it works + +The service interaction in this pattern uses AWS Lambda's response streaming capability to stream data in batches from Amazon DynamoDB. Instead of retrieving all query / scan results at once, the Lambda function processes the query incrementally, retrieving and sending results as they become available. Here are the details of the interaction: + +1. Client Request + A client sends a request to the Lambda URL, asking for specific data from a DynamoDB table. +2. Lambda Function Initialization : + When the Lambda function is invoked, it initializes a connection to DynamoDB and prepares to run a query operation. The query includes a limit parameter, which restricts the number of items retrieved in each batch. +3. Querying + The Lambda function begins querying DynamoDB using the defined limit (e.g., 100 items per batch). DynamoDB will return only a limited set of results instead of the entire result set at once. +4. Response Streaming + As soon as a batch of results is retrieved, the Lambda function uses the `write()` method of Lambda's streaming API to send the data to the client. This happens immediately, without waiting for the entire query operation to complete. +5. Pagination Handling + If DynamoDB returns a LastEvaluatedKey (which indicates that more data is available), the Lambda function automatically continues querying the next batch of data. Each batch is streamed to the client as it becomes available. +6. Final Response + The Lambda function continues this process, retrieving a batch from DynamoDB and streaming it to the client until all data is fetched. Once DynamoDB returns no more data (i.e., no LastEvaluatedKey), the function sends the final batch and closes the stream. + +## Testing + +1. Use curl with your AWS credentials to view the streaming response as the url uses AWS Identity and Access Management (IAM) for authorization. Replace the URL and Region parameters for your deployment. + + ``` + curl --request GET https://.lambda-url..on.aws/ --user AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY --aws-sigv4 'aws:amz::lambda' + ``` + +You can see the gradual display of the streamed response. + +## Cleanup + +1. Delete the stack, Enter `Y` to confirm deleting the stack and folder. + ``` + sam delete + ``` + +--- + +Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: MIT-0 diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/example-pattern.json b/lambda-streaming-ttfb-write-sam-with-dynamodb/example-pattern.json new file mode 100644 index 000000000..e87a06216 --- /dev/null +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/example-pattern.json @@ -0,0 +1,50 @@ +{ + "title": "Lambda Response streaming: Streaming incremental DynamoDB Query results.", + "description": "This pattern uses Lambda response streaming to incrementally retrieve and stream DynamoDB results in batches, reducing time-to-first-byte (TTFB) by sending data as it's retrieved.", + "language": "nodejs", + "level": "200", + "framework": "SAM", + "introBox": { + "headline": "How it works", + "text": [ + "The service interaction in this pattern uses AWS Lambda's response streaming capability to stream data in batches from Amazon DynamoDB. Instead of retrieving all query / scan results at once, the Lambda function processes the query incrementally, retrieving and sending results as they become available." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/lambda-streaming-ttfb-write-sam-with-dynamodb", + "templateURL": "serverless-patterns/lambda-streaming-ttfb-write-sam-with-dynamodb", + "projectFolder": "lambda-streaming-ttfb-write-sam-with-dynamodb", + "templateFile": "lambda-streaming-ttfb-write-sam-with-dynamodb/src/template.yaml" + } + }, + "resources": { + "bullets": [ + { + "text": "Configure Lambda Function Response Streaming", + "link": "https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html" + }, + { + "text": "DynamoDB Read and Write Operations", + "link": "https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/read-write-operations.html#read-operation-consumption" + } + ] + }, + "deploy": { + "text": ["sam deploy"] + }, + "testing": { + "text": ["See the GitHub repo for detailed testing instructions."] + }, + "cleanup": { + "text": ["Delete the stack: sam delete."] + }, + "authors": [ + { + "name": "Sandeep Kumar P", + "image": "https://media.licdn.com/dms/image/v2/D5603AQFs4Yt815MOaw/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1695457883755?e=1732147200&v=beta&t=C-bNWZXdsiHnCh4n3S377BXlhMQVl1fl-iJKkwkwDpU", + "bio": "Principal Solutions Architect at AntStack", + "linkedin": "https://www.linkedin.com/in/sandykumar93/" + } + ] +} diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/src/index.mjs b/lambda-streaming-ttfb-write-sam-with-dynamodb/src/index.mjs new file mode 100644 index 000000000..db82ef7df --- /dev/null +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/src/index.mjs @@ -0,0 +1,53 @@ +import { DynamoDBClient, ScanCommand } from "@aws-sdk/client-dynamodb"; +import { unmarshall } from "@aws-sdk/util-dynamodb"; +const dynamodb = new DynamoDBClient(); +const tableName = process.env.DDB_TABLE_NAME; + +export const handler = awslambda.streamifyResponse( + async (event, responseStream, context) => { + const httpResponseMetadata = { + statusCode: 200, + headers: { + "Content-Type": "text/html", + }, + }; + + responseStream = awslambda.HttpResponseStream.from( + responseStream, + httpResponseMetadata + ); + + let counter = 0; + await scanDynamoDBTable(); + + async function scanDynamoDBTable(startKey = null) { + // Scan table with the required parameters + const scan = new ScanCommand({ + TableName: tableName, + ExclusiveStartKey: startKey, + Limit: 200, + }); + + const data = await dynamodb.send(scan); + + // Convert the items from DDB JSON to regular JSON + data.Items = data.Items.map((item) => { + return unmarshall(item); + }); + + // Send the scan result to the stream + responseStream.write(data.Items); + + counter += 1; + + // If there are more items to scan, recursively call the scanDynamoDBTable function with the last evaluated key + if (data.LastEvaluatedKey && counter < 10) { + console.log(counter); + return scanDynamoDBTable(data.LastEvaluatedKey); + } + + // End stream + responseStream.end(); + } + } +); diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml b/lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml new file mode 100644 index 000000000..3251fb623 --- /dev/null +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml @@ -0,0 +1,51 @@ +AWSTemplateFormatVersion: "2010-09-09" +Transform: AWS::Serverless-2016-10-31 +Description: (uksb-1tthgi812) (tag:lambda-streaming-ttfb-write-sam-with-dynamodb) Serverless Patterns - Lambda Streaming Response with DynamoDB +Resources: + StreamingFunction2: + Type: AWS::Serverless::Function + Properties: + CodeUri: src/ + Handler: index.handler + Runtime: nodejs20.x + Timeout: 30 + MemorySize: 512 + AutoPublishAlias: live + Environment: + Variables: + DDB_TABLE_NAME: !Ref DDBTable + FunctionUrlConfig: + AuthType: AWS_IAM + InvokeMode: RESPONSE_STREAM + Policies: + - DynamoDBReadPolicy: + TableName: !GetAtt DDBTable.Arn + + DDBTable: + Type: AWS::DynamoDB::Table + Properties: + TableName: StreamingFunction + BillingMode: PAY_PER_REQUEST + AttributeDefinitions: + - AttributeName: model + AttributeType: S + - AttributeName: identifier + AttributeType: S + KeySchema: + - AttributeName: model + KeyType: HASH + - AttributeName: identifier + KeyType: RANGE + MyFunctionUrl: + Type: AWS::Lambda::Url + Properties: + TargetFunctionArn: !Ref StreamingFunction2 + AuthType: AWS_IAM + InvokeMode: RESPONSE_STREAM +Outputs: + StreamingFunction: + Description: "Streaming Lambda Function ARN" + Value: !GetAtt StreamingFunction2.Arn + StreamingFunctionURL: + Description: "Streaming Lambda Function URL" + Value: !GetAtt MyFunctionUrl.FunctionUrl From 769cc03e60f997afe5b7b7dc701c56997de44f49 Mon Sep 17 00:00:00 2001 From: sandykumar93 Date: Thu, 19 Sep 2024 15:12:24 +0530 Subject: [PATCH 2/7] cleanup: minor reosurce name fix --- lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml b/lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml index 3251fb623..1431edae1 100644 --- a/lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml @@ -2,7 +2,7 @@ AWSTemplateFormatVersion: "2010-09-09" Transform: AWS::Serverless-2016-10-31 Description: (uksb-1tthgi812) (tag:lambda-streaming-ttfb-write-sam-with-dynamodb) Serverless Patterns - Lambda Streaming Response with DynamoDB Resources: - StreamingFunction2: + StreamingFunction: Type: AWS::Serverless::Function Properties: CodeUri: src/ @@ -39,13 +39,13 @@ Resources: MyFunctionUrl: Type: AWS::Lambda::Url Properties: - TargetFunctionArn: !Ref StreamingFunction2 + TargetFunctionArn: !Ref StreamingFunction AuthType: AWS_IAM InvokeMode: RESPONSE_STREAM Outputs: StreamingFunction: Description: "Streaming Lambda Function ARN" - Value: !GetAtt StreamingFunction2.Arn + Value: !GetAtt StreamingFunction.Arn StreamingFunctionURL: Description: "Streaming Lambda Function URL" Value: !GetAtt MyFunctionUrl.FunctionUrl From 57fa7a37af2ea380e703b73749ddc90c306c5fe6 Mon Sep 17 00:00:00 2001 From: sandykumar93 Date: Thu, 19 Sep 2024 15:16:32 +0530 Subject: [PATCH 3/7] cleanup: readme changes --- lambda-streaming-ttfb-write-sam-with-dynamodb/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md b/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md index aa07b6257..cb9129394 100644 --- a/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md @@ -1,7 +1,5 @@ # Lambda Response streaming: Streaming incremental DynamoDB Query results. -This pattern shows how to use Lambda response streaming to improve time-to-first byte using the write() For more information on the feature, see the [launch blog post](https://aws.amazon.com/blogs/compute/introducing-aws-lambda-response-streaming/). - This pattern shows how to use Lambda response streaming to incrementally retrieve and stream DynamoDB query / scan results using the write() method. Instead of waiting for the entire query / scan operation to complete, the Lambda function streams data in batches by setting a limit on the number of items per query and sending each batch as soon as it's retrieved. This improves the time-to-first-byte (TTFB) by streaming results to the client as they become available. For more information on the Lambda response streaming feature, see the [launch blog post](https://aws.amazon.com/blogs/compute/introducing-aws-lambda-response-streaming/). From 1c288c8e308bfea96754f6bd11b86b7946065ef1 Mon Sep 17 00:00:00 2001 From: sandykumar93 Date: Thu, 19 Sep 2024 15:22:31 +0530 Subject: [PATCH 4/7] feat: add AWS Partner blog --- .../example-pattern.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/example-pattern.json b/lambda-streaming-ttfb-write-sam-with-dynamodb/example-pattern.json index e87a06216..cbe8f6e63 100644 --- a/lambda-streaming-ttfb-write-sam-with-dynamodb/example-pattern.json +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/example-pattern.json @@ -20,6 +20,10 @@ }, "resources": { "bullets": [ + { + "text": "Supercharging User Experience with AWS Lambda Response Streaming", + "link": "https://aws.amazon.com/blogs/apn/supercharging-user-experience-with-aws-lambda-response-streaming/" + }, { "text": "Configure Lambda Function Response Streaming", "link": "https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html" From aac99afbf2aadf9e149bed711fe4df0dd473f013 Mon Sep 17 00:00:00 2001 From: sandykumar93 Date: Tue, 24 Sep 2024 12:40:30 +0530 Subject: [PATCH 5/7] fix: addressing comment changes, add lambda to dump data to dynamodb --- .../README.md | 22 +++++-- .../example-pattern.json | 4 +- .../src/data-dump/README.md | 3 + .../src/data-dump/data.json.gz | Bin 0 -> 82676 bytes .../src/data-dump/index.mjs | 56 ++++++++++++++++++ .../src/{ => streaming-function}/index.mjs | 1 - .../template.yaml | 49 ++++++++------- 7 files changed, 106 insertions(+), 29 deletions(-) create mode 100644 lambda-streaming-ttfb-write-sam-with-dynamodb/src/data-dump/README.md create mode 100644 lambda-streaming-ttfb-write-sam-with-dynamodb/src/data-dump/data.json.gz create mode 100644 lambda-streaming-ttfb-write-sam-with-dynamodb/src/data-dump/index.mjs rename lambda-streaming-ttfb-write-sam-with-dynamodb/src/{ => streaming-function}/index.mjs (97%) diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md b/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md index cb9129394..1dceba7e2 100644 --- a/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md @@ -1,4 +1,4 @@ -# Lambda Response streaming: Streaming incremental DynamoDB Query results. +# AWS Lambda Response streaming: Streaming incremental Amazon DynamoDB Query results. This pattern shows how to use Lambda response streaming to incrementally retrieve and stream DynamoDB query / scan results using the write() method. Instead of waiting for the entire query / scan operation to complete, the Lambda function streams data in batches by setting a limit on the number of items per query and sending each batch as soon as it's retrieved. This improves the time-to-first-byte (TTFB) by streaming results to the client as they become available. @@ -36,7 +36,7 @@ git clone https://github.com/aws-samples/serverless-patterns 1. During the prompts: - Enter a stack name - - Enter the desired AWS Region - AWS CLI default region is recommended if you are planning to run the test (test.sh) script + - Enter the desired AWS Region - Allow SAM CLI to create IAM roles with the required permissions. 1. Once you have run `sam deploy --guided` mode once and saved arguments to a configuration file `samconfig.toml`, you can use `sam deploy` in future to use these defaults. @@ -60,7 +60,7 @@ The service interaction in this pattern uses AWS Lambda's response streaming cap 3. Querying The Lambda function begins querying DynamoDB using the defined limit (e.g., 100 items per batch). DynamoDB will return only a limited set of results instead of the entire result set at once. 4. Response Streaming - As soon as a batch of results is retrieved, the Lambda function uses the `write()` method of Lambda's streaming API to send the data to the client. This happens immediately, without waiting for the entire query operation to complete. + As soon as a batch of results is retrieved, the function uses Lambda's streaming API `write()` method to send the data to the client. This happens immediately, without waiting for the entire query operation to complete. 5. Pagination Handling If DynamoDB returns a LastEvaluatedKey (which indicates that more data is available), the Lambda function automatically continues querying the next batch of data. Each batch is streamed to the client as it becomes available. 6. Final Response @@ -68,13 +68,23 @@ The service interaction in this pattern uses AWS Lambda's response streaming cap ## Testing -1. Use curl with your AWS credentials to view the streaming response as the url uses AWS Identity and Access Management (IAM) for authorization. Replace the URL and Region parameters for your deployment. +1. Run the data dump function to populate the DynamoDB table. + + Use curl with your AWS credentials as the url uses AWS Identity and Access Management (IAM) for authorization. Replace the URL and Region parameters for your deployment. + + ``` + curl --request GET https://.lambda-url..on.aws/ --user AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY --aws-sigv4 'aws:amz::lambda' + ``` + +2. Run the streaming function to view the streaming response. + + Use curl with your AWS credentials to view the streaming response as the url uses AWS Identity and Access Management (IAM) for authorization. Replace the URL and Region parameters for your deployment. ``` - curl --request GET https://.lambda-url..on.aws/ --user AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY --aws-sigv4 'aws:amz::lambda' + curl --request GET https://.lambda-url..on.aws/ --user AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY --aws-sigv4 'aws:amz::lambda' ``` -You can see the gradual display of the streamed response. + You can see the gradual display of the streamed response. ## Cleanup diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/example-pattern.json b/lambda-streaming-ttfb-write-sam-with-dynamodb/example-pattern.json index cbe8f6e63..53e2ef957 100644 --- a/lambda-streaming-ttfb-write-sam-with-dynamodb/example-pattern.json +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/example-pattern.json @@ -1,6 +1,6 @@ { - "title": "Lambda Response streaming: Streaming incremental DynamoDB Query results.", - "description": "This pattern uses Lambda response streaming to incrementally retrieve and stream DynamoDB results in batches, reducing time-to-first-byte (TTFB) by sending data as it's retrieved.", + "title": "AWS Lambda Response streaming: Streaming incremental Amazon DynamoDB Query results.", + "description": "This pattern uses AWS Lambda response streaming to incrementally retrieve and stream Amazon DynamoDB results in batches, reducing time-to-first-byte (TTFB) by sending data as it's retrieved.", "language": "nodejs", "level": "200", "framework": "SAM", diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/src/data-dump/README.md b/lambda-streaming-ttfb-write-sam-with-dynamodb/src/data-dump/README.md new file mode 100644 index 000000000..52be1bd1c --- /dev/null +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/src/data-dump/README.md @@ -0,0 +1,3 @@ +# Data Source Information + +The data source is a gzipped JSON file containing a list of items. The file is zipped from a subset of [Spotify Dataset](https://www.kaggle.com/datasets/yamaerenay/spotify-dataset-19212020-600k-tracks?select=tracks.csv) dataset containing 2000 items. diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/src/data-dump/data.json.gz b/lambda-streaming-ttfb-write-sam-with-dynamodb/src/data-dump/data.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..de8d8282f471b86d3ed0b66db0b9c4d67302166d GIT binary patch literal 82676 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
YR$ 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%0A}SmFU;N`Q{lDJ_oucL4 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 z { + const gunzip = zlib.createGunzip(); + const input = fs.createReadStream(gzFilePath); + let data = ""; + await pipelineAsync(input, gunzip, async (source) => { + for await (const chunk of source) { + data += chunk; + } + }); + return JSON.parse(data); +}; + +// Function to dump JSON data to DynamoDB +const dumpToDynamoDB = async (jsonData) => { + const promises = jsonData.map(async (item) => { + console.log(`Dumping item ${JSON.stringify(item)}`); + const command = new PutItemCommand({ + TableName: tableName, + Item: marshall(item), + }); + return dynamodb.send(command); + }); + await Promise.all(promises); +}; + +export const handler = async (event) => { + try { + const gzFilePath = "data.json.gz"; + const jsonData = await readAndUnzipJson(gzFilePath); + await dumpToDynamoDB(jsonData); + + return { + statusCode: 200, + body: "Data dump successful", + }; + } catch (error) { + console.error("Error:", error); + return { + statusCode: 500, + body: JSON.stringify({ error: "Failed to process the data" }), + }; + } +}; diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/src/index.mjs b/lambda-streaming-ttfb-write-sam-with-dynamodb/src/streaming-function/index.mjs similarity index 97% rename from lambda-streaming-ttfb-write-sam-with-dynamodb/src/index.mjs rename to lambda-streaming-ttfb-write-sam-with-dynamodb/src/streaming-function/index.mjs index db82ef7df..14fcc96d0 100644 --- a/lambda-streaming-ttfb-write-sam-with-dynamodb/src/index.mjs +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/src/streaming-function/index.mjs @@ -42,7 +42,6 @@ export const handler = awslambda.streamifyResponse( // If there are more items to scan, recursively call the scanDynamoDBTable function with the last evaluated key if (data.LastEvaluatedKey && counter < 10) { - console.log(counter); return scanDynamoDBTable(data.LastEvaluatedKey); } diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml b/lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml index 1431edae1..59a072091 100644 --- a/lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/template.yaml @@ -2,10 +2,30 @@ AWSTemplateFormatVersion: "2010-09-09" Transform: AWS::Serverless-2016-10-31 Description: (uksb-1tthgi812) (tag:lambda-streaming-ttfb-write-sam-with-dynamodb) Serverless Patterns - Lambda Streaming Response with DynamoDB Resources: + # AWS Lambda Function to dump data to Amazon DynamoDB + DataDumpFunction: + Type: AWS::Serverless::Function + Properties: + CodeUri: src/data-dump/ + Handler: index.handler + Runtime: nodejs20.x + Timeout: 30 + MemorySize: 512 + AutoPublishAlias: live + Environment: + Variables: + DDB_TABLE_NAME: !Ref DDBTable + FunctionUrlConfig: + AuthType: AWS_IAM + InvokeMode: BUFFERED + Policies: + - DynamoDBCrudPolicy: + TableName: !Ref DDBTable + # AWS Lambda Function to Stream data from Amazon DynamoDB StreamingFunction: Type: AWS::Serverless::Function Properties: - CodeUri: src/ + CodeUri: src/streaming-function/ Handler: index.handler Runtime: nodejs20.x Timeout: 30 @@ -19,33 +39,22 @@ Resources: InvokeMode: RESPONSE_STREAM Policies: - DynamoDBReadPolicy: - TableName: !GetAtt DDBTable.Arn - + TableName: !Ref DDBTable + # Amazon DynamoDB Table DDBTable: Type: AWS::DynamoDB::Table Properties: - TableName: StreamingFunction BillingMode: PAY_PER_REQUEST AttributeDefinitions: - - AttributeName: model - AttributeType: S - - AttributeName: identifier + - AttributeName: id AttributeType: S KeySchema: - - AttributeName: model + - AttributeName: id KeyType: HASH - - AttributeName: identifier - KeyType: RANGE - MyFunctionUrl: - Type: AWS::Lambda::Url - Properties: - TargetFunctionArn: !Ref StreamingFunction - AuthType: AWS_IAM - InvokeMode: RESPONSE_STREAM Outputs: - StreamingFunction: - Description: "Streaming Lambda Function ARN" - Value: !GetAtt StreamingFunction.Arn + DataDumpFunctionURL: + Description: "Data Dump Lambda Function URL" + Value: !GetAtt DataDumpFunctionUrl.FunctionUrl StreamingFunctionURL: Description: "Streaming Lambda Function URL" - Value: !GetAtt MyFunctionUrl.FunctionUrl + Value: !GetAtt StreamingFunctionUrl.FunctionUrl From e7d39cd038f454b50a38552a568f03f73b8b6f1c Mon Sep 17 00:00:00 2001 From: ellisms <114107920+ellisms@users.noreply.github.com> Date: Tue, 24 Sep 2024 08:27:02 -0400 Subject: [PATCH 6/7] publishing file --- ...treaming-ttfb-write-sam-with-dynamodb.json | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 lambda-streaming-ttfb-write-sam-with-dynamodb/lambda-streaming-ttfb-write-sam-with-dynamodb.json diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/lambda-streaming-ttfb-write-sam-with-dynamodb.json b/lambda-streaming-ttfb-write-sam-with-dynamodb/lambda-streaming-ttfb-write-sam-with-dynamodb.json new file mode 100644 index 000000000..901b705d7 --- /dev/null +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/lambda-streaming-ttfb-write-sam-with-dynamodb.json @@ -0,0 +1,79 @@ +{ + "title": "AWS Lambda Response streaming: Amazon DynamoDB Query results.", + "description": "This pattern uses AWS Lambda response streaming to stream Amazon DynamoDB results in batches, reducing time-to-first-byte (TTFB).", + "language": "Node.js", + "level": "200", + "framework": "SAM", + "introBox": { + "headline": "How it works", + "text": [ + "The service interaction in this pattern uses AWS Lambda's response streaming capability to stream data in batches from Amazon DynamoDB. Instead of retrieving all results at once, the Lambda function processes the query incrementally, retrieving and sending results as they become available." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/lambda-streaming-ttfb-write-sam-with-dynamodb", + "templateURL": "serverless-patterns/lambda-streaming-ttfb-write-sam-with-dynamodb", + "projectFolder": "lambda-streaming-ttfb-write-sam-with-dynamodb", + "templateFile": "template.yaml" + } + }, + "resources": { + "bullets": [ + { + "text": "Supercharging User Experience with AWS Lambda Response Streaming", + "link": "https://aws.amazon.com/blogs/apn/supercharging-user-experience-with-aws-lambda-response-streaming/" + }, + { + "text": "Configure Lambda Function Response Streaming", + "link": "https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html" + }, + { + "text": "DynamoDB Read and Write Operations", + "link": "https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/read-write-operations.html#read-operation-consumption" + } + ] + }, + "deploy": { + "text": [ + "sam deploy" + ] + }, + "testing": { + "text": [ + "See the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "text": [ + "Delete the stack: sam delete." + ] + }, + "authors": [ + { + "name": "Sandeep Kumar P", + "image": "https://media.licdn.com/dms/image/v2/D5603AQFs4Yt815MOaw/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1695457883755?e=1732147200&v=beta&t=C-bNWZXdsiHnCh4n3S377BXlhMQVl1fl-iJKkwkwDpU", + "bio": "Principal Solutions Architect at AntStack", + "linkedin": "sandykumar93" + } + ], + "patternArch": { + "icon1": { + "x": 30, + "y": 50, + "service": "lambda", + "label": "AWS Lambda" + }, + "icon2": { + "x": 60, + "y": 50, + "service": "dynamodb", + "label": "Amazon DynamoDB" + }, + "line1": { + "from": "icon1", + "to": "icon2", + "label": "Query" + } + } +} From 443f04e97ba03c5751adc8018b5a53d564f82664 Mon Sep 17 00:00:00 2001 From: Sandy Date: Tue, 24 Sep 2024 18:00:02 +0530 Subject: [PATCH 7/7] fix: update readme based on suggestion Co-authored-by: ellisms <114107920+ellisms@users.noreply.github.com> --- lambda-streaming-ttfb-write-sam-with-dynamodb/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md b/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md index 1dceba7e2..c2094612a 100644 --- a/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md +++ b/lambda-streaming-ttfb-write-sam-with-dynamodb/README.md @@ -39,7 +39,7 @@ git clone https://github.com/aws-samples/serverless-patterns - Enter the desired AWS Region - Allow SAM CLI to create IAM roles with the required permissions. -1. Once you have run `sam deploy --guided` mode once and saved arguments to a configuration file `samconfig.toml`, you can use `sam deploy` in future to use these defaults. +1. After running `sam deploy --guided` mode once and saving arguments to a configuration file `samconfig.toml`, you can use `sam deploy` in future to use these defaults. AWS SAM deploys a Lambda function with streaming support and a function URL