From e102c292360323fd2d96844ad88b8a059e19cc23 Mon Sep 17 00:00:00 2001 From: Roman Myers Date: Thu, 22 Aug 2024 14:25:18 -0700 Subject: [PATCH 01/15] initial commit for Node.js layer example --- .../layer-nodejs/function/lambda_function.mjs | 17 +++++++++++++++++ sample-apps/layer-nodejs/function/response.json | 4 ++++ sample-apps/layer-nodejs/layer/1-install.sh | 1 + sample-apps/layer-nodejs/layer/2-package.sh | 3 +++ sample-apps/layer-nodejs/layer/package.json | 14 ++++++++++++++ 5 files changed, 39 insertions(+) create mode 100644 sample-apps/layer-nodejs/function/lambda_function.mjs create mode 100644 sample-apps/layer-nodejs/function/response.json create mode 100755 sample-apps/layer-nodejs/layer/1-install.sh create mode 100755 sample-apps/layer-nodejs/layer/2-package.sh create mode 100644 sample-apps/layer-nodejs/layer/package.json diff --git a/sample-apps/layer-nodejs/function/lambda_function.mjs b/sample-apps/layer-nodejs/function/lambda_function.mjs new file mode 100644 index 00000000..6cfbeb0c --- /dev/null +++ b/sample-apps/layer-nodejs/function/lambda_function.mjs @@ -0,0 +1,17 @@ +import _ from "lodash" + +export const handler = async (event) => { + + var users = [ + { 'user': 'Carlos', 'active': true }, + { 'user': 'Gil-dong', 'active': false }, + { 'user': 'Pat', 'active': false } + ]; + + let out = _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); + const response = { + statusCode: 200, + body: JSON.stringify(out + ", " + users[out].user), + }; + return response; +}; diff --git a/sample-apps/layer-nodejs/function/response.json b/sample-apps/layer-nodejs/function/response.json new file mode 100644 index 00000000..bef2cb13 --- /dev/null +++ b/sample-apps/layer-nodejs/function/response.json @@ -0,0 +1,4 @@ +{ + "statusCode": 200, + "body": "\"2, Pat\"" +} diff --git a/sample-apps/layer-nodejs/layer/1-install.sh b/sample-apps/layer-nodejs/layer/1-install.sh new file mode 100755 index 00000000..9c3be6f5 --- /dev/null +++ b/sample-apps/layer-nodejs/layer/1-install.sh @@ -0,0 +1 @@ +npm install . diff --git a/sample-apps/layer-nodejs/layer/2-package.sh b/sample-apps/layer-nodejs/layer/2-package.sh new file mode 100755 index 00000000..e8a5defc --- /dev/null +++ b/sample-apps/layer-nodejs/layer/2-package.sh @@ -0,0 +1,3 @@ +mkdir -p nodejs/node20 +cp -r node_modules nodejs/node20/ +zip -r layer_content.zip nodejs diff --git a/sample-apps/layer-nodejs/layer/package.json b/sample-apps/layer-nodejs/layer/package.json new file mode 100644 index 00000000..d2229f35 --- /dev/null +++ b/sample-apps/layer-nodejs/layer/package.json @@ -0,0 +1,14 @@ +{ + "name": "layer", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "MIT-0", + "description": "", + "dependencies": { + "lodash": "4.17.21" + } +} From 5180801616855552fbce7b6dae1142c6e46ece4a Mon Sep 17 00:00:00 2001 From: Roman Myers Date: Fri, 23 Aug 2024 12:32:44 -0700 Subject: [PATCH 02/15] minor fixes to function, remove example response --- .../layer-nodejs/function/{lambda_function.mjs => index.mjs} | 2 +- sample-apps/layer-nodejs/function/response.json | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) rename sample-apps/layer-nodejs/function/{lambda_function.mjs => index.mjs} (95%) delete mode 100644 sample-apps/layer-nodejs/function/response.json diff --git a/sample-apps/layer-nodejs/function/lambda_function.mjs b/sample-apps/layer-nodejs/function/index.mjs similarity index 95% rename from sample-apps/layer-nodejs/function/lambda_function.mjs rename to sample-apps/layer-nodejs/function/index.mjs index 6cfbeb0c..d94c925c 100644 --- a/sample-apps/layer-nodejs/function/lambda_function.mjs +++ b/sample-apps/layer-nodejs/function/index.mjs @@ -8,7 +8,7 @@ export const handler = async (event) => { { 'user': 'Pat', 'active': false } ]; - let out = _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); + let out = _.findLastIndex(users, function(o) { return o.user == 'Pat'; }); const response = { statusCode: 200, body: JSON.stringify(out + ", " + users[out].user), diff --git a/sample-apps/layer-nodejs/function/response.json b/sample-apps/layer-nodejs/function/response.json deleted file mode 100644 index bef2cb13..00000000 --- a/sample-apps/layer-nodejs/function/response.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "statusCode": 200, - "body": "\"2, Pat\"" -} From 82de7eccffb35931ccd07a1f79e403ab5b060dca Mon Sep 17 00:00:00 2001 From: Alexander Yu Date: Tue, 27 Aug 2024 10:43:26 -0700 Subject: [PATCH 03/15] Remove unnecessary generated files in layer-python --- sample-apps/layer-python/function-numpy/response.json | 1 - sample-apps/layer-python/function/response.json | 1 - sample-apps/layer-python/layer/create_layer/pyvenv.cfg | 5 ----- 3 files changed, 7 deletions(-) delete mode 100644 sample-apps/layer-python/function-numpy/response.json delete mode 100644 sample-apps/layer-python/function/response.json delete mode 100644 sample-apps/layer-python/layer/create_layer/pyvenv.cfg diff --git a/sample-apps/layer-python/function-numpy/response.json b/sample-apps/layer-python/function-numpy/response.json deleted file mode 100644 index a93c1cef..00000000 --- a/sample-apps/layer-python/function-numpy/response.json +++ /dev/null @@ -1 +0,0 @@ -{"errorMessage": "Unable to import module 'lambda_function': No module named 'numpy'", "errorType": "Runtime.ImportModuleError", "requestId": "31c0a568-b1e1-4e63-8f76-1ddc89eea07c", "stackTrace": []} \ No newline at end of file diff --git a/sample-apps/layer-python/function/response.json b/sample-apps/layer-python/function/response.json deleted file mode 100644 index 7a7e22f9..00000000 --- a/sample-apps/layer-python/function/response.json +++ /dev/null @@ -1 +0,0 @@ -{"statusCode": 200, "body": "{\"current_user_url\":\"https://api.github.com/user\",\"current_user_authorizations_html_url\":\"https://github.com/settings/connections/applications{/client_id}\",\"authorizations_url\":\"https://api.github.com/authorizations\",\"code_search_url\":\"https://api.github.com/search/code?q={query}{&page,per_page,sort,order}\",\"commit_search_url\":\"https://api.github.com/search/commits?q={query}{&page,per_page,sort,order}\",\"emails_url\":\"https://api.github.com/user/emails\",\"emojis_url\":\"https://api.github.com/emojis\",\"events_url\":\"https://api.github.com/events\",\"feeds_url\":\"https://api.github.com/feeds\",\"followers_url\":\"https://api.github.com/user/followers\",\"following_url\":\"https://api.github.com/user/following{/target}\",\"gists_url\":\"https://api.github.com/gists{/gist_id}\",\"hub_url\":\"https://api.github.com/hub\",\"issue_search_url\":\"https://api.github.com/search/issues?q={query}{&page,per_page,sort,order}\",\"issues_url\":\"https://api.github.com/issues\",\"keys_url\":\"https://api.github.com/user/keys\",\"label_search_url\":\"https://api.github.com/search/labels?q={query}&repository_id={repository_id}{&page,per_page}\",\"notifications_url\":\"https://api.github.com/notifications\",\"organization_url\":\"https://api.github.com/orgs/{org}\",\"organization_repositories_url\":\"https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort}\",\"organization_teams_url\":\"https://api.github.com/orgs/{org}/teams\",\"public_gists_url\":\"https://api.github.com/gists/public\",\"rate_limit_url\":\"https://api.github.com/rate_limit\",\"repository_url\":\"https://api.github.com/repos/{owner}/{repo}\",\"repository_search_url\":\"https://api.github.com/search/repositories?q={query}{&page,per_page,sort,order}\",\"current_user_repositories_url\":\"https://api.github.com/user/repos{?type,page,per_page,sort}\",\"starred_url\":\"https://api.github.com/user/starred{/owner}{/repo}\",\"starred_gists_url\":\"https://api.github.com/gists/starred\",\"topic_search_url\":\"https://api.github.com/search/topics?q={query}{&page,per_page}\",\"user_url\":\"https://api.github.com/users/{user}\",\"user_organizations_url\":\"https://api.github.com/user/orgs\",\"user_repositories_url\":\"https://api.github.com/users/{user}/repos{?type,page,per_page,sort}\",\"user_search_url\":\"https://api.github.com/search/users?q={query}{&page,per_page,sort,order}\"}"} \ No newline at end of file diff --git a/sample-apps/layer-python/layer/create_layer/pyvenv.cfg b/sample-apps/layer-python/layer/create_layer/pyvenv.cfg deleted file mode 100644 index daa133da..00000000 --- a/sample-apps/layer-python/layer/create_layer/pyvenv.cfg +++ /dev/null @@ -1,5 +0,0 @@ -home = /opt/homebrew/opt/python@3.11/bin -include-system-site-packages = false -version = 3.11.6 -executable = /opt/homebrew/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/bin/python3.11 -command = /opt/homebrew/opt/python@3.11/bin/python3.11 -m venv /Users/yualexan/AWSDocProjects/aws-lambda-developer-guide/sample-apps/layer-python/layer/create_layer From ae661fbe43f64d506c5527520c727ea12e74f256 Mon Sep 17 00:00:00 2001 From: Roman Myers Date: Tue, 24 Sep 2024 14:14:58 -0700 Subject: [PATCH 04/15] Initial commit for TypeScript layer example --- .../layer-typescript/function/index.ts | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 sample-apps/layer-typescript/function/index.ts diff --git a/sample-apps/layer-typescript/function/index.ts b/sample-apps/layer-typescript/function/index.ts new file mode 100644 index 00000000..83ecea6e --- /dev/null +++ b/sample-apps/layer-typescript/function/index.ts @@ -0,0 +1,28 @@ +import { Handler } from 'aws-lambda'; +import * as _ from 'lodash'; + +type User = { + user: string; + active: boolean; +} + +type UserResult = { + statusCode: number; + body: string; +} + +const users: User[] = [ + { 'user': 'Carlos', 'active': true }, + { 'user': 'Gil-dong', 'active': false }, + { 'user': 'Pat', 'active': false } +]; + +export const handler: Handler = async (): Promise => { + + let out = _.findLastIndex(users, (user: User) => { return user.user == 'Pat'; }); + const response = { + statusCode: 200, + body: JSON.stringify(out + ", " + users[out].user), + }; + return response; +}; From 36cf3d525ce4d594a52bdaac348bfd36246e01ae Mon Sep 17 00:00:00 2001 From: Roman Myers Date: Thu, 26 Sep 2024 14:10:55 -0700 Subject: [PATCH 05/15] Add package.json for TypeScript function example --- .../layer-typescript/function/package.json | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 sample-apps/layer-typescript/function/package.json diff --git a/sample-apps/layer-typescript/function/package.json b/sample-apps/layer-typescript/function/package.json new file mode 100644 index 00000000..1857273d --- /dev/null +++ b/sample-apps/layer-typescript/function/package.json @@ -0,0 +1,20 @@ +{ + "name": "lambda-typescript-layer-example", + "version": "1.0.0", + "main": "dist/index.js", + "scripts": { + "prebuild": "rm -rf dist", + "build": "tsc index.ts --module nodenext --lib es2020 --outDir dist/", + "postbuild": "cd dist && zip -r index.zip index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "MIT-0", + "description": "", + "devDependencies": { + "@types/aws-lambda": "^8.10.145", + "@types/lodash": "^4.17.9", + "lodash": "^4.17.21", + "typescript": "^5.6.2" + } +} From 903543fcc93be3fa65ff091e40da34663c3be175 Mon Sep 17 00:00:00 2001 From: Roman Myers Date: Thu, 26 Sep 2024 14:36:20 -0700 Subject: [PATCH 06/15] Initial commit for Ruby layer example --- sample-apps/layer-ruby/function/lambda_function.rb | 8 ++++++++ sample-apps/layer-ruby/layer/1-install.sh | 3 +++ sample-apps/layer-ruby/layer/2-package.sh | 3 +++ sample-apps/layer-ruby/layer/Gemfile | 5 +++++ 4 files changed, 19 insertions(+) create mode 100644 sample-apps/layer-ruby/function/lambda_function.rb create mode 100755 sample-apps/layer-ruby/layer/1-install.sh create mode 100755 sample-apps/layer-ruby/layer/2-package.sh create mode 100644 sample-apps/layer-ruby/layer/Gemfile diff --git a/sample-apps/layer-ruby/function/lambda_function.rb b/sample-apps/layer-ruby/function/lambda_function.rb new file mode 100644 index 00000000..2c6d85d3 --- /dev/null +++ b/sample-apps/layer-ruby/function/lambda_function.rb @@ -0,0 +1,8 @@ +require 'json' +require 'tzinfo' + +def lambda_handler(event:, context:) + tz = TZInfo::Timezone.get('America/New_York') + { statusCode: 200, body: tz.to_local(Time.utc(2018, 2, 1, 12, 30, 0)) } +end + diff --git a/sample-apps/layer-ruby/layer/1-install.sh b/sample-apps/layer-ruby/layer/1-install.sh new file mode 100755 index 00000000..eaf29ac1 --- /dev/null +++ b/sample-apps/layer-ruby/layer/1-install.sh @@ -0,0 +1,3 @@ +bundle config set --local path 'vendor/bundle' +bundle install + diff --git a/sample-apps/layer-ruby/layer/2-package.sh b/sample-apps/layer-ruby/layer/2-package.sh new file mode 100755 index 00000000..305a5b7b --- /dev/null +++ b/sample-apps/layer-ruby/layer/2-package.sh @@ -0,0 +1,3 @@ +mkdir -p ruby/gems/3.3.0 +cp -r vendor/bundle/ruby/3.3.0/* ruby/gems/3.3.0/ +zip -r layer_content.zip ruby diff --git a/sample-apps/layer-ruby/layer/Gemfile b/sample-apps/layer-ruby/layer/Gemfile new file mode 100644 index 00000000..64ad6202 --- /dev/null +++ b/sample-apps/layer-ruby/layer/Gemfile @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +gem "tzinfo" From ad07fed2f680192374a055432a811d4de99e8666 Mon Sep 17 00:00:00 2001 From: Roman Myers Date: Tue, 15 Oct 2024 14:01:41 -0700 Subject: [PATCH 07/15] refactor sample apps to reflect the shared nodejs runtime --- sample-apps/layer-nodejs/{function => function-js}/index.mjs | 0 .../function => layer-nodejs/function-ts}/index.ts | 0 .../function => layer-nodejs/function-ts}/package.json | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename sample-apps/layer-nodejs/{function => function-js}/index.mjs (100%) rename sample-apps/{layer-typescript/function => layer-nodejs/function-ts}/index.ts (100%) rename sample-apps/{layer-typescript/function => layer-nodejs/function-ts}/package.json (100%) diff --git a/sample-apps/layer-nodejs/function/index.mjs b/sample-apps/layer-nodejs/function-js/index.mjs similarity index 100% rename from sample-apps/layer-nodejs/function/index.mjs rename to sample-apps/layer-nodejs/function-js/index.mjs diff --git a/sample-apps/layer-typescript/function/index.ts b/sample-apps/layer-nodejs/function-ts/index.ts similarity index 100% rename from sample-apps/layer-typescript/function/index.ts rename to sample-apps/layer-nodejs/function-ts/index.ts diff --git a/sample-apps/layer-typescript/function/package.json b/sample-apps/layer-nodejs/function-ts/package.json similarity index 100% rename from sample-apps/layer-typescript/function/package.json rename to sample-apps/layer-nodejs/function-ts/package.json From 1264c4911ded9547b0091d518ec15d39495b720f Mon Sep 17 00:00:00 2001 From: Ben Blanton Date: Thu, 17 Oct 2024 23:41:36 +0000 Subject: [PATCH 08/15] Update blank-python runtime --- sample-apps/blank-python/README.md | 25 +++++++++++++++++-------- sample-apps/blank-python/template.yml | 4 ++-- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/sample-apps/blank-python/README.md b/sample-apps/blank-python/README.md index 52ae49f0..98d059b2 100644 --- a/sample-apps/blank-python/README.md +++ b/sample-apps/blank-python/README.md @@ -11,29 +11,35 @@ The project source includes function code and supporting resources: Use the following instructions to deploy the sample application. # Requirements -- [Python 3.7](https://www.python.org/downloads/). Sample also works with Python 3.8 and 3.9. +- [Python 3.11](https://www.python.org/downloads/). Sample also works with Python 3.9. - The Bash shell. For Linux and macOS, this is included by default. In Windows 10, you can install the [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) to get a Windows-integrated version of Ubuntu and Bash. - [The AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) v1.17 or newer. # Setup Download or clone this repository. - $ git clone https://github.com/awsdocs/aws-lambda-developer-guide.git - $ cd aws-lambda-developer-guide/sample-apps/blank-python + git clone https://github.com/awsdocs/aws-lambda-developer-guide.git + cd aws-lambda-developer-guide/sample-apps/blank-python To create a new bucket for deployment artifacts, run `1-create-bucket.sh`. - blank-python$ ./1-create-bucket.sh + ./1-create-bucket.sh + +Example output: + make_bucket: lambda-artifacts-a5e491dbb5b22e0d To build a Lambda layer that contains the function's runtime dependencies, run `2-build-layer.sh`. Packaging dependencies in a layer reduces the size of the deployment package that you upload when you modify your code. - blank-python$ ./2-build-layer.sh + ./2-build-layer.sh # Deploy To deploy the application, run `3-deploy.sh`. - blank-python$ ./3-deploy.sh + ./3-deploy.sh + +Example output: + Uploading to e678bc216e6a0d510d661ca9ae2fd941 9519118 / 9519118.0 (100.00%) Successfully packaged artifacts and wrote output template to file out.yml. Waiting for changeset to be created.. @@ -45,7 +51,10 @@ This script uses AWS CloudFormation to deploy the Lambda functions and an IAM ro # Test To invoke the function, run `4-invoke.sh`. - blank-python$ ./4-invoke.sh + ./4-invoke.sh + +Example output: + { "StatusCode": 200, "ExecutedVersion": "$LATEST" @@ -65,4 +74,4 @@ Choose a node in the main function graph. Then choose **View traces** to see a l # Cleanup To delete the application, run `5-cleanup.sh`. - blank-python$ ./5-cleanup.sh + ./5-cleanup.sh \ No newline at end of file diff --git a/sample-apps/blank-python/template.yml b/sample-apps/blank-python/template.yml index d2b27aee..dc5024a6 100644 --- a/sample-apps/blank-python/template.yml +++ b/sample-apps/blank-python/template.yml @@ -6,7 +6,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: lambda_function.lambda_handler - Runtime: python3.8 + Runtime: python3.11 CodeUri: function/. Description: Call the AWS Lambda API Timeout: 10 @@ -25,4 +25,4 @@ Resources: Description: Dependencies for the blank-python sample app. ContentUri: package/. CompatibleRuntimes: - - python3.8 + - python3.11 \ No newline at end of file From 2ab8107df88fb0b96640d7c64d63aaec6d19281c Mon Sep 17 00:00:00 2001 From: Alexander Yu Date: Wed, 18 Dec 2024 13:13:15 -0800 Subject: [PATCH 09/15] .NET app updates for blank-csharp, blank-csharp-with-layer --- .gitignore | 1 + sample-apps/blank-csharp-with-layer/README.md | 186 +++++++++--------- .../aws-lambda-tools-defaults.json | 40 ++-- .../src/blank-csharp/blank-csharp.csproj | 30 +-- sample-apps/blank-csharp/README.md | 132 ++++++------- .../aws-lambda-tools-defaults.json | 38 ++-- .../src/blank-csharp/blank-csharp.csproj | 30 +-- .../{template.yml => template.yaml} | 38 ++-- 8 files changed, 248 insertions(+), 247 deletions(-) create mode 100644 .gitignore rename sample-apps/blank-csharp/{template.yml => template.yaml} (80%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5509140f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.DS_Store diff --git a/sample-apps/blank-csharp-with-layer/README.md b/sample-apps/blank-csharp-with-layer/README.md index eac563d9..638db2da 100644 --- a/sample-apps/blank-csharp-with-layer/README.md +++ b/sample-apps/blank-csharp-with-layer/README.md @@ -1,93 +1,93 @@ -# Blank function with layer (C#) - -![Architecture](/sample-apps/blank-csharp/images/sample-blank-csharp.png) - -The project source includes function code and supporting resources: - -- `src/blank-csharp` - A C# .NET Core function. -- `1-create-bucket.sh`, `2-deploy.sh`, etc. - Shell scripts that use the AWS CLI to deploy and manage the application. - -Use the following instructions to deploy the sample application. For more information on the application's architecture and implementation, see [Managing Spot Instance Requests](https://docs.aws.amazon.com/lambda/latest/dg/services-ec2-tutorial.html) in the developer guide. - -# Requirements -- [.NET Core SDK 6.0](https://dotnet.microsoft.com/download/dotnet-core/6.0) -- [AWS extensions for .NET CLI](https://github.com/aws/aws-extensions-for-dotnet-cli). Specifically, ensure that you have [Amazon.Lambda.Tools](https://github.com/aws/aws-extensions-for-dotnet-cli#aws-lambda-amazonlambdatools) installed. -- The Bash shell. For Linux and macOS, this is included by default. In Windows 10, you can install the [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) to get a Windows-integrated version of Ubuntu and Bash. -- [The AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) v1.17 or newer. - -# Setup -Download or clone this repository. - - $ git clone https://github.com/awsdocs/aws-lambda-developer-guide.git - $ cd aws-lambda-developer-guide/sample-apps/blank-csharp - -To create a new bucket for deployment artifacts, run `1-create-bucket-and-role.sh`. - - blank-csharp$ ./1-create-bucket.sh - make_bucket: lambda-artifacts-d7aec9f2022ef2b4 - make_bucket: lambda-artifacts-d7aec9f2022ef2b4-dotnet-layer - { - "Role": { - "Path": "/", - "RoleName": "blank-csharp-role", - "RoleId": "AROA6HOIFXAKKWARP5RSC", - "Arn": "arn:aws:iam::978061735956:role/blank-csharp-role", - "CreateDate": "2023-08-22T18:12:29+00:00", - "AssumeRolePolicyDocument": { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": [ - "sts:AssumeRole" - ], - "Principal": { - "Service": [ - "lambda.amazonaws.com" - ] - } - } - ] - } - } - } - -To build a Lambda layer that contains the function's runtime dependencies, run `2-build-layer.sh`. This also uploads the layer to an S3 bucket created by the first script. - - blank-csharp$ ./2-build-layer.sh - -# Deploy -To deploy the application, run `3-deploy.sh`. - - blank-csharp$ ./3-deploy.sh - Amazon Lambda Tools for .NET Core applications (5.8.0) - ... - Created publish archive ... - Creating new Lambda function blank-csharp - New Lambda function created - -This script uses the .NET Amazon Lambda Tools to deploy the Lambda function. It uses the default settings from the `src/aws-lambda-tools-defaults.json` file. - -To invoke the function, run `4-invoke.sh`. - - blank-csharp$ ./4-invoke.sh - { - "StatusCode": 200, - "ExecutedVersion": "$LATEST" - } - {"FunctionCount":13,"TotalCodeSize":598094248} - -Let the script invoke the function a few times and then press `CRTL+C` to exit. - -The application uses AWS X-Ray to trace requests. Open the [X-Ray console](https://console.aws.amazon.com/xray/home#/service-map) to view the service map. The following service map shows the function managing spot instances in Amazon EC2. - -![Service Map](/sample-apps/blank-csharp-with-layer/images/blank-csharp-servicemap.png) - -Choose a node in the main function graph. Then choose **View traces** to see a list of traces. Choose any trace to view a timeline that breaks down the work done by the function. - -![Trace](/sample-apps/blank-csharp-with-layer/images/blank-csharp-trace.png) - -# Cleanup -To delete the application, run the cleanup script. - - blank-csharp$ ./5-cleanup.sh +# Blank function with layer (C#) + +![Architecture](/sample-apps/blank-csharp/images/sample-blank-csharp.png) + +The project source includes function code and supporting resources: + +- `src/blank-csharp` - A C# .NET Core function. +- `1-create-bucket.sh`, `2-deploy.sh`, etc. - Shell scripts that use the AWS CLI to deploy and manage the application. + +Use the following instructions to deploy the sample application. For more information on the application's architecture and implementation, see [Managing Spot Instance Requests](https://docs.aws.amazon.com/lambda/latest/dg/services-ec2-tutorial.html) in the developer guide. + +# Requirements +- [.NET Core SDK 8.0](https://dotnet.microsoft.com/download/dotnet-core/8.0) +- [AWS extensions for .NET CLI](https://github.com/aws/aws-extensions-for-dotnet-cli). Specifically, ensure that you have [Amazon.Lambda.Tools](https://github.com/aws/aws-extensions-for-dotnet-cli#aws-lambda-amazonlambdatools) installed. +- The Bash shell. For Linux and macOS, this is included by default. In Windows 10, you can install the [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) to get a Windows-integrated version of Ubuntu and Bash. +- [The AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) v1.17 or newer. + +# Setup +Download or clone this repository. + + $ git clone https://github.com/awsdocs/aws-lambda-developer-guide.git + $ cd aws-lambda-developer-guide/sample-apps/blank-csharp + +To create a new bucket for deployment artifacts, run `1-create-bucket-and-role.sh`. + + blank-csharp$ ./1-create-bucket.sh + make_bucket: lambda-artifacts-d7aec9f2022ef2b4 + make_bucket: lambda-artifacts-d7aec9f2022ef2b4-dotnet-layer + { + "Role": { + "Path": "/", + "RoleName": "blank-csharp-role", + "RoleId": "AROA6HOIFXAKKWARP5RSC", + "Arn": "arn:aws:iam::978061735956:role/blank-csharp-role", + "CreateDate": "2023-08-22T18:12:29+00:00", + "AssumeRolePolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "sts:AssumeRole" + ], + "Principal": { + "Service": [ + "lambda.amazonaws.com" + ] + } + } + ] + } + } + } + +To build a Lambda layer that contains the function's runtime dependencies, run `2-build-layer.sh`. This also uploads the layer to an S3 bucket created by the first script. + + blank-csharp$ ./2-build-layer.sh + +# Deploy +To deploy the application, run `3-deploy.sh`. + + blank-csharp$ ./3-deploy.sh + Amazon Lambda Tools for .NET Core applications (5.8.0) + ... + Created publish archive ... + Creating new Lambda function blank-csharp + New Lambda function created + +This script uses the .NET Amazon Lambda Tools to deploy the Lambda function. It uses the default settings from the `src/aws-lambda-tools-defaults.json` file. + +To invoke the function, run `4-invoke.sh`. + + blank-csharp$ ./4-invoke.sh + { + "StatusCode": 200, + "ExecutedVersion": "$LATEST" + } + {"FunctionCount":13,"TotalCodeSize":598094248} + +Let the script invoke the function a few times and then press `CRTL+C` to exit. + +The application uses AWS X-Ray to trace requests. Open the [X-Ray console](https://console.aws.amazon.com/xray/home#/service-map) to view the service map. The following service map shows the function managing spot instances in Amazon EC2. + +![Service Map](/sample-apps/blank-csharp-with-layer/images/blank-csharp-servicemap.png) + +Choose a node in the main function graph. Then choose **View traces** to see a list of traces. Choose any trace to view a timeline that breaks down the work done by the function. + +![Trace](/sample-apps/blank-csharp-with-layer/images/blank-csharp-trace.png) + +# Cleanup +To delete the application, run the cleanup script. + + blank-csharp$ ./5-cleanup.sh \ No newline at end of file diff --git a/sample-apps/blank-csharp-with-layer/src/blank-csharp/aws-lambda-tools-defaults.json b/sample-apps/blank-csharp-with-layer/src/blank-csharp/aws-lambda-tools-defaults.json index 9a237927..1149f222 100644 --- a/sample-apps/blank-csharp-with-layer/src/blank-csharp/aws-lambda-tools-defaults.json +++ b/sample-apps/blank-csharp-with-layer/src/blank-csharp/aws-lambda-tools-defaults.json @@ -1,20 +1,20 @@ -{ - "Information" : [ - "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", - "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", - - "dotnet lambda help", - - "All the command line options for the Lambda command can be specified in this file." - ], - - "profile":"default", - "region" : "us-east-1", - "configuration" : "Release", - "framework" : "net6.0", - "function-runtime":"dotnet6", - "function-memory-size" : 512, - "function-timeout" : 30, - "function-handler" : "blank-csharp::blankCsharp.Function::FunctionHandler", - "function-role" : "blank-csharp-role" -} +{ + "Information" : [ + "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", + "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", + + "dotnet lambda help", + + "All the command line options for the Lambda command can be specified in this file." + ], + + "profile":"default", + "region" : "us-east-1", + "configuration" : "Release", + "framework" : "net8.0", + "function-runtime":"dotnet8", + "function-memory-size" : 512, + "function-timeout" : 30, + "function-handler" : "blank-csharp::blankCsharp.Function::FunctionHandler", + "function-role" : "blank-csharp-role" +} diff --git a/sample-apps/blank-csharp-with-layer/src/blank-csharp/blank-csharp.csproj b/sample-apps/blank-csharp-with-layer/src/blank-csharp/blank-csharp.csproj index aa648b33..4e36256f 100644 --- a/sample-apps/blank-csharp-with-layer/src/blank-csharp/blank-csharp.csproj +++ b/sample-apps/blank-csharp-with-layer/src/blank-csharp/blank-csharp.csproj @@ -1,16 +1,16 @@ - - - net6.0 - true - Lambda - - - - - - - - - - + + + net8.0 + true + Lambda + + + + + + + + + + \ No newline at end of file diff --git a/sample-apps/blank-csharp/README.md b/sample-apps/blank-csharp/README.md index ad905416..a731ea2c 100644 --- a/sample-apps/blank-csharp/README.md +++ b/sample-apps/blank-csharp/README.md @@ -1,66 +1,66 @@ -# Blank function (C#) - -![Architecture](/sample-apps/blank-csharp/images/sample-blank-csharp.png) - -The project source includes function code and supporting resources: - -- `src/blank-csharp` - A C# .NET Core function. -- `template.yml` - An AWS CloudFormation template that creates an application. -- `1-create-bucket.sh`, `2-deploy.sh`, etc. - Shell scripts that use the AWS CLI to deploy and manage the application. - -Use the following instructions to deploy the sample application. For more information on the application's architecture and implementation, see [Managing Spot Instance Requests](https://docs.aws.amazon.com/lambda/latest/dg/services-ec2-tutorial.html) in the developer guide. - -# Requirements -- [.NET Core SDK 6.0](https://dotnet.microsoft.com/download/dotnet-core/6.0) -- [AWS extensions for .NET CLI](https://github.com/aws/aws-extensions-for-dotnet-cli) -- The Bash shell. For Linux and macOS, this is included by default. In Windows 10, you can install the [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) to get a Windows-integrated version of Ubuntu and Bash. -- [The AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) v1.17 or newer. - -# Setup -Download or clone this repository. - - $ git clone https://github.com/awsdocs/aws-lambda-developer-guide.git - $ cd aws-lambda-developer-guide/sample-apps/blank-csharp - -To create a new bucket for deployment artifacts, run `1-create-bucket.sh`. - - blank-csharp$ ./1-create-bucket.sh - make_bucket: lambda-artifacts-a5e491dbb5b22e0d - -# Deploy -To deploy the application, run `2-deploy.sh`. - - blank-csharp$ ./2-deploy.sh - Amazon Lambda Tools for .NET Core applications (4.0.0) - Executing publish command - Uploading to e678bc216e6a0d510d661ca9ae2fd941 1009985 / 1009985.0 (100.00%) - Successfully packaged artifacts and wrote output template to file out.yml. - Waiting for changeset to be created.. - Waiting for stack create/update to complete - Successfully created/updated stack - blank-csharp - -This script uses AWS CloudFormation to deploy the Lambda functions and an IAM role. If the AWS CloudFormation stack that contains the resources already exists, the script updates it with any changes to the template or function code. - -To invoke the function, run `3-invoke.sh`. - - blank-csharp$ ./3-invoke.sh - { - "StatusCode": 200, - "ExecutedVersion": "$LATEST" - } - {"FunctionCount":43,"TotalCodeSize":362867335} - -Let the script invoke the function a few times and then press `CRTL+C` to exit. - -The application uses AWS X-Ray to trace requests. Open the [X-Ray console](https://console.aws.amazon.com/xray/home#/service-map) to view the service map. The following service map shows the function managing spot instances in Amazon EC2. - -![Service Map](/sample-apps/blank-csharp/images/blank-csharp-servicemap.png) - -Choose a node in the main function graph. Then choose **View traces** to see a list of traces. Choose any trace to view a timeline that breaks down the work done by the function. - -![Trace](/sample-apps/blank-csharp/images/blank-csharp-trace.png) - -# Cleanup -To delete the application, run the cleanup script. - - blank-csharp$ ./4-cleanup.sh +# Blank function (C#) + +![Architecture](/sample-apps/blank-csharp/images/sample-blank-csharp.png) + +The project source includes function code and supporting resources: + +- `src/blank-csharp` - A C# .NET Core function. +- `template.yml` - An AWS CloudFormation template that creates an application. +- `1-create-bucket.sh`, `2-deploy.sh`, etc. - Shell scripts that use the AWS CLI to deploy and manage the application. + +Use the following instructions to deploy the sample application. For more information on the application's architecture and implementation, see [Managing Spot Instance Requests](https://docs.aws.amazon.com/lambda/latest/dg/services-ec2-tutorial.html) in the developer guide. + +# Requirements +- [.NET Core SDK 8.0](https://dotnet.microsoft.com/download/dotnet-core/8.0) +- [AWS extensions for .NET CLI](https://github.com/aws/aws-extensions-for-dotnet-cli) +- The Bash shell. For Linux and macOS, this is included by default. In Windows 10, you can install the [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) to get a Windows-integrated version of Ubuntu and Bash. +- [The AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) v1.17 or newer. + +# Setup +Download or clone this repository. + + $ git clone https://github.com/awsdocs/aws-lambda-developer-guide.git + $ cd aws-lambda-developer-guide/sample-apps/blank-csharp + +To create a new bucket for deployment artifacts, run `1-create-bucket.sh`. + + blank-csharp$ ./1-create-bucket.sh + make_bucket: lambda-artifacts-a5e491dbb5b22e0d + +# Deploy +To deploy the application, run `2-deploy.sh`. + + blank-csharp$ ./2-deploy.sh + Amazon Lambda Tools for .NET Core applications (4.0.0) + Executing publish command + Uploading to e678bc216e6a0d510d661ca9ae2fd941 1009985 / 1009985.0 (100.00%) + Successfully packaged artifacts and wrote output template to file out.yml. + Waiting for changeset to be created.. + Waiting for stack create/update to complete + Successfully created/updated stack - blank-csharp + +This script uses AWS CloudFormation to deploy the Lambda functions and an IAM role. If the AWS CloudFormation stack that contains the resources already exists, the script updates it with any changes to the template or function code. + +To invoke the function, run `3-invoke.sh`. + + blank-csharp$ ./3-invoke.sh + { + "StatusCode": 200, + "ExecutedVersion": "$LATEST" + } + {"FunctionCount":43,"TotalCodeSize":362867335} + +Let the script invoke the function a few times and then press `CRTL+C` to exit. + +The application uses AWS X-Ray to trace requests. Open the [X-Ray console](https://console.aws.amazon.com/xray/home#/service-map) to view the service map. The following service map shows the function managing spot instances in Amazon EC2. + +![Service Map](/sample-apps/blank-csharp/images/blank-csharp-servicemap.png) + +Choose a node in the main function graph. Then choose **View traces** to see a list of traces. Choose any trace to view a timeline that breaks down the work done by the function. + +![Trace](/sample-apps/blank-csharp/images/blank-csharp-trace.png) + +# Cleanup +To delete the application, run the cleanup script. + + blank-csharp$ ./4-cleanup.sh \ No newline at end of file diff --git a/sample-apps/blank-csharp/src/blank-csharp/aws-lambda-tools-defaults.json b/sample-apps/blank-csharp/src/blank-csharp/aws-lambda-tools-defaults.json index c815dcf9..8a9c7869 100644 --- a/sample-apps/blank-csharp/src/blank-csharp/aws-lambda-tools-defaults.json +++ b/sample-apps/blank-csharp/src/blank-csharp/aws-lambda-tools-defaults.json @@ -1,19 +1,19 @@ -{ - "Information" : [ - "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", - "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", - - "dotnet lambda help", - - "All the command line options for the Lambda command can be specified in this file." - ], - - "profile":"default", - "region" : "us-east-2", - "configuration" : "Release", - "framework" : "net6.0", - "function-runtime":"dotnet6", - "function-memory-size" : 512, - "function-timeout" : 30, - "function-handler" : "blank-csharp::blankCsharp.Function::FunctionHandler" -} +{ + "Information" : [ + "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", + "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", + + "dotnet lambda help", + + "All the command line options for the Lambda command can be specified in this file." + ], + + "profile":"default", + "region" : "us-east-2", + "configuration" : "Release", + "framework" : "net8.0", + "function-runtime":"dotnet8", + "function-memory-size" : 512, + "function-timeout" : 30, + "function-handler" : "blank-csharp::blankCsharp.Function::FunctionHandler" +} \ No newline at end of file diff --git a/sample-apps/blank-csharp/src/blank-csharp/blank-csharp.csproj b/sample-apps/blank-csharp/src/blank-csharp/blank-csharp.csproj index aa648b33..4e36256f 100644 --- a/sample-apps/blank-csharp/src/blank-csharp/blank-csharp.csproj +++ b/sample-apps/blank-csharp/src/blank-csharp/blank-csharp.csproj @@ -1,16 +1,16 @@ - - - net6.0 - true - Lambda - - - - - - - - - - + + + net8.0 + true + Lambda + + + + + + + + + + \ No newline at end of file diff --git a/sample-apps/blank-csharp/template.yml b/sample-apps/blank-csharp/template.yaml similarity index 80% rename from sample-apps/blank-csharp/template.yml rename to sample-apps/blank-csharp/template.yaml index 17836497..c92e6a35 100644 --- a/sample-apps/blank-csharp/template.yml +++ b/sample-apps/blank-csharp/template.yaml @@ -1,19 +1,19 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: 'AWS::Serverless-2016-10-31' -Description: An AWS Lambda application that calls the Lambda API. -Resources: - function: - Type: AWS::Serverless::Function - Properties: - Handler: blank-csharp::blankCsharp.Function::FunctionHandler - Runtime: dotnetcore3.1 - CodeUri: src/blank-csharp/bin/Release/netcoreapp3.1/blank-csharp.zip - Description: Call the AWS Lambda API - MemorySize: 256 - Timeout: 9 - # Function's execution role - Policies: - - AWSLambdaBasicExecutionRole - - AWSLambda_ReadOnlyAccess - - AWSXrayWriteOnlyAccess - Tracing: Active +AWSTemplateFormatVersion: '2010-09-09' +Transform: 'AWS::Serverless-2016-10-31' +Description: An AWS Lambda application that calls the Lambda API. +Resources: + function: + Type: AWS::Serverless::Function + Properties: + Handler: blank-csharp::blankCsharp.Function::FunctionHandler + Runtime: dotnet8 + CodeUri: src/blank-csharp/bin/Release/net8.0/blank-csharp.zip + Description: Call the AWS Lambda API + MemorySize: 256 + Timeout: 9 + # Function's execution role + Policies: + - AWSLambdaBasicExecutionRole + - AWSLambda_ReadOnlyAccess + - AWSXrayWriteOnlyAccess + Tracing: Active \ No newline at end of file From a2f0355c775fa9527d74810ef38d6a5e7957fd69 Mon Sep 17 00:00:00 2001 From: Alexander Yu Date: Tue, 7 Jan 2025 13:18:47 -0800 Subject: [PATCH 10/15] Remove .DS_Store, add gitignore --- .DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index dbb5ca59b71eb7c921814c252ce63b8d2eb92da1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!AiqG5Z!I7O(;SR3OxqAR*bC{#7l_v2aM=Jr6we3FwK@GwTDv3S%1hc@q3)v z-H4_3;6<>^gxNPcJCkMKhMg>9jC<4Qh%t*XW`H8rOlW=(97kP|n)V=a`Hqyu?0^Mq z3=heFU;y{7#d6rQ5$xIb{ma8yJ`Ph6Ld1JGPLsTFoDW{BH@3E$M$>2+_x_WZ`9)An zb1#_OV(&_bG_33(yiVfT(Aqs0SrH^zJdp`W6hp|}O_D`o=80(*cUFBYb;w|{tcIebn>nRrzcbNKqC>}agu4U9Fbd+{e(DzZn2 zsIsdpLSldzAO<#_0e$WntxaDjt&bQW27b)|o)0!CqN}k~D31|F+dC~ zGf-Du3+w;I`uqQK67`4yVql{f;EjPl@L);0wyrD=Ypo6X0E&WfrNXZiFk~r)SS-bD bP$}TI(ExNcmI}cGLO%kM25N|bKV{$()Rj&7 From 8c25ceb69ba0ed8b59daa5896e14799565a0b914 Mon Sep 17 00:00:00 2001 From: Alexander Yu Date: Thu, 9 Jan 2025 15:52:22 -0800 Subject: [PATCH 11/15] Added working example-java. Functionally the same as example-go. --- .../example-java/function/build.gradle | 28 +++++++ sample-apps/example-java/function/event.json | 5 ++ sample-apps/example-java/function/output.txt | 1 + sample-apps/example-java/function/pom.xml | 73 +++++++++++++++++++ .../src/main/java/example/OrderHandler.java | 64 ++++++++++++++++ 5 files changed, 171 insertions(+) create mode 100644 sample-apps/example-java/function/build.gradle create mode 100644 sample-apps/example-java/function/event.json create mode 100644 sample-apps/example-java/function/output.txt create mode 100644 sample-apps/example-java/function/pom.xml create mode 100644 sample-apps/example-java/function/src/main/java/example/OrderHandler.java diff --git a/sample-apps/example-java/function/build.gradle b/sample-apps/example-java/function/build.gradle new file mode 100644 index 00000000..ab6730c9 --- /dev/null +++ b/sample-apps/example-java/function/build.gradle @@ -0,0 +1,28 @@ +plugins { + id 'java' +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.amazonaws:aws-lambda-java-core:1.2.3' + implementation 'software.amazon.awssdk:s3:2.28.29' + implementation 'org.slf4j:slf4j-nop:2.0.16' +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from configurations.runtimeClasspath + } +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 +} + +build.dependsOn buildZip diff --git a/sample-apps/example-java/function/event.json b/sample-apps/example-java/function/event.json new file mode 100644 index 00000000..fefc63c3 --- /dev/null +++ b/sample-apps/example-java/function/event.json @@ -0,0 +1,5 @@ +{ + "orderId": "1200Gradle", + "amount": 359.99, + "item": "Aviation Headset" +} diff --git a/sample-apps/example-java/function/output.txt b/sample-apps/example-java/function/output.txt new file mode 100644 index 00000000..70d6318b --- /dev/null +++ b/sample-apps/example-java/function/output.txt @@ -0,0 +1 @@ +"Success" \ No newline at end of file diff --git a/sample-apps/example-java/function/pom.xml b/sample-apps/example-java/function/pom.xml new file mode 100644 index 00000000..72c3b301 --- /dev/null +++ b/sample-apps/example-java/function/pom.xml @@ -0,0 +1,73 @@ + + 4.0.0 + com.example + example-java + jar + 1.0-SNAPSHOT + example-java-function + + UTF-8 + 21 + 21 + + + + com.amazonaws + aws-lambda-java-core + 1.2.3 + + + software.amazon.awssdk + s3 + 2.28.29 + + + org.slf4j + slf4j-nop + 2.0.16 + + + + + + + maven-surefire-plugin + 3.5.2 + + + org.apache.maven.plugins + maven-shade-plugin + 3.4.1 + + false + + + *:* + + META-INF/* + META-INF/versions/** + + + + + + + package + + shade + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + 21 + + + + + \ No newline at end of file diff --git a/sample-apps/example-java/function/src/main/java/example/OrderHandler.java b/sample-apps/example-java/function/src/main/java/example/OrderHandler.java new file mode 100644 index 00000000..df50eef0 --- /dev/null +++ b/sample-apps/example-java/function/src/main/java/example/OrderHandler.java @@ -0,0 +1,64 @@ +package example; + +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.model.S3Exception; + +import java.nio.charset.StandardCharsets; + +/** + * Lambda handler for processing orders and storing receipts in S3. + */ +public class OrderHandler implements RequestHandler { + + private static final S3Client S3_CLIENT = S3Client.builder().build(); + + /** + * Record to model the input event. + */ + public record Order(String orderId, double amount, String item) {} + + @Override + public String handleRequest(Order event, Context context) { + try { + // Access environment variables + String bucketName = System.getenv("RECEIPT_BUCKET"); + if (bucketName == null || bucketName.isEmpty()) { + throw new IllegalArgumentException("RECEIPT_BUCKET environment variable is not set"); + } + + // Create the receipt content and key destination + String receiptContent = String.format("OrderID: %s\nAmount: $%.2f\nItem: %s", + event.orderId(), event.amount(), event.item()); + String key = "receipts/" + event.orderId() + ".txt"; + + // Upload the receipt to S3 + uploadReceiptToS3(bucketName, key, receiptContent); + + context.getLogger().log("Successfully processed order " + event.orderId() + + " and stored receipt in S3 bucket " + bucketName); + return "Success"; + + } catch (Exception e) { + context.getLogger().log("Failed to process order: " + e.getMessage()); + throw new RuntimeException(e); + } + } + + private void uploadReceiptToS3(String bucketName, String key, String receiptContent) { + try { + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucketName) + .key(key) + .build(); + + // Convert the receipt content to bytes and upload to S3 + S3_CLIENT.putObject(putObjectRequest, RequestBody.fromBytes(receiptContent.getBytes(StandardCharsets.UTF_8))); + } catch (S3Exception e) { + throw new RuntimeException("Failed to upload receipt to S3: " + e.awsErrorDetails().errorMessage(), e); + } + } +} From 6c2ed9b489891fe5102c49c1af322b72b29113e0 Mon Sep 17 00:00:00 2001 From: Alexander Yu Date: Wed, 22 Jan 2025 09:55:43 -0800 Subject: [PATCH 12/15] Remove extra files --- sample-apps/example-java/function/event.json | 5 ----- sample-apps/example-java/function/output.txt | 1 - 2 files changed, 6 deletions(-) delete mode 100644 sample-apps/example-java/function/event.json delete mode 100644 sample-apps/example-java/function/output.txt diff --git a/sample-apps/example-java/function/event.json b/sample-apps/example-java/function/event.json deleted file mode 100644 index fefc63c3..00000000 --- a/sample-apps/example-java/function/event.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "orderId": "1200Gradle", - "amount": 359.99, - "item": "Aviation Headset" -} diff --git a/sample-apps/example-java/function/output.txt b/sample-apps/example-java/function/output.txt deleted file mode 100644 index 70d6318b..00000000 --- a/sample-apps/example-java/function/output.txt +++ /dev/null @@ -1 +0,0 @@ -"Success" \ No newline at end of file From 9474a9d497ece911e8da5be69a44700eec50597b Mon Sep 17 00:00:00 2001 From: Alexander Yu Date: Mon, 3 Feb 2025 13:27:34 -0800 Subject: [PATCH 13/15] Remove obsolete java-events-v1sdk and java17-examples sample apps --- .../java-events-v1sdk/1-create-bucket.sh | 5 - .../java-events-v1sdk/2-build-layer.sh | 4 - sample-apps/java-events-v1sdk/3-deploy.sh | 16 -- sample-apps/java-events-v1sdk/4-invoke.sh | 28 ---- sample-apps/java-events-v1sdk/5-cleanup.sh | 38 ----- sample-apps/java-events-v1sdk/README.md | 111 -------------- sample-apps/java-events-v1sdk/build.gradle | 56 ------- sample-apps/java-events-v1sdk/event.json | 39 ----- .../events/dynamodb-record.json | 64 -------- .../events/kinesis-record.json | 36 ----- .../events/s3-notification.json | 39 ----- .../images/java-events-v1sdk-servicemap.png | Bin 51745 -> 0 bytes .../images/java-events-v1sdk-trace.png | Bin 66756 -> 0 bytes .../images/sample-java-events-v1sdk.png | Bin 7184 -> 0 bytes sample-apps/java-events-v1sdk/pom.xml | 140 ------------------ .../src/main/java/example/Handler.java | 34 ----- .../main/java/example/HandlerDynamoDB.java | 32 ---- .../src/main/java/example/HandlerKinesis.java | 29 ---- .../src/main/java/example/Util.java | 22 --- .../src/main/resources/log4j2.xml | 16 -- .../src/test/java/example/InvokeTest.java | 70 --------- .../src/test/java/example/TestContext.java | 45 ------ .../src/test/java/example/TestLogger.java | 14 -- .../src/test/resources/log4j2.xml | 14 -- .../java-events-v1sdk/template-mvn.yml | 20 --- sample-apps/java-events-v1sdk/template.yml | 30 ---- .../java17-examples/1-create-bucket.sh | 5 - sample-apps/java17-examples/2-deploy.sh | 16 -- sample-apps/java17-examples/3-invoke.sh | 38 ----- sample-apps/java17-examples/4-cleanup.sh | 38 ----- sample-apps/java17-examples/README.md | 67 --------- sample-apps/java17-examples/build.gradle | 33 ----- sample-apps/java17-examples/event.json | 5 - sample-apps/java17-examples/pom.xml | 83 ----------- .../java/example/HandlerIntegerJava17.java | 24 --- sample-apps/java17-examples/template-mvn.yml | 20 --- sample-apps/java17-examples/template.yml | 20 --- 37 files changed, 1251 deletions(-) delete mode 100755 sample-apps/java-events-v1sdk/1-create-bucket.sh delete mode 100755 sample-apps/java-events-v1sdk/2-build-layer.sh delete mode 100755 sample-apps/java-events-v1sdk/3-deploy.sh delete mode 100755 sample-apps/java-events-v1sdk/4-invoke.sh delete mode 100755 sample-apps/java-events-v1sdk/5-cleanup.sh delete mode 100644 sample-apps/java-events-v1sdk/README.md delete mode 100644 sample-apps/java-events-v1sdk/build.gradle delete mode 100644 sample-apps/java-events-v1sdk/event.json delete mode 100644 sample-apps/java-events-v1sdk/events/dynamodb-record.json delete mode 100644 sample-apps/java-events-v1sdk/events/kinesis-record.json delete mode 100644 sample-apps/java-events-v1sdk/events/s3-notification.json delete mode 100644 sample-apps/java-events-v1sdk/images/java-events-v1sdk-servicemap.png delete mode 100644 sample-apps/java-events-v1sdk/images/java-events-v1sdk-trace.png delete mode 100644 sample-apps/java-events-v1sdk/images/sample-java-events-v1sdk.png delete mode 100644 sample-apps/java-events-v1sdk/pom.xml delete mode 100644 sample-apps/java-events-v1sdk/src/main/java/example/Handler.java delete mode 100644 sample-apps/java-events-v1sdk/src/main/java/example/HandlerDynamoDB.java delete mode 100644 sample-apps/java-events-v1sdk/src/main/java/example/HandlerKinesis.java delete mode 100644 sample-apps/java-events-v1sdk/src/main/java/example/Util.java delete mode 100644 sample-apps/java-events-v1sdk/src/main/resources/log4j2.xml delete mode 100644 sample-apps/java-events-v1sdk/src/test/java/example/InvokeTest.java delete mode 100644 sample-apps/java-events-v1sdk/src/test/java/example/TestContext.java delete mode 100644 sample-apps/java-events-v1sdk/src/test/java/example/TestLogger.java delete mode 100644 sample-apps/java-events-v1sdk/src/test/resources/log4j2.xml delete mode 100644 sample-apps/java-events-v1sdk/template-mvn.yml delete mode 100644 sample-apps/java-events-v1sdk/template.yml delete mode 100755 sample-apps/java17-examples/1-create-bucket.sh delete mode 100755 sample-apps/java17-examples/2-deploy.sh delete mode 100755 sample-apps/java17-examples/3-invoke.sh delete mode 100755 sample-apps/java17-examples/4-cleanup.sh delete mode 100644 sample-apps/java17-examples/README.md delete mode 100644 sample-apps/java17-examples/build.gradle delete mode 100644 sample-apps/java17-examples/event.json delete mode 100644 sample-apps/java17-examples/pom.xml delete mode 100644 sample-apps/java17-examples/src/main/java/example/HandlerIntegerJava17.java delete mode 100644 sample-apps/java17-examples/template-mvn.yml delete mode 100644 sample-apps/java17-examples/template.yml diff --git a/sample-apps/java-events-v1sdk/1-create-bucket.sh b/sample-apps/java-events-v1sdk/1-create-bucket.sh deleted file mode 100755 index 64a5f749..00000000 --- a/sample-apps/java-events-v1sdk/1-create-bucket.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -BUCKET_ID=$(dd if=/dev/random bs=8 count=1 2>/dev/null | od -An -tx1 | tr -d ' \t\n') -BUCKET_NAME=lambda-artifacts-$BUCKET_ID -echo $BUCKET_NAME > bucket-name.txt -aws s3 mb s3://$BUCKET_NAME diff --git a/sample-apps/java-events-v1sdk/2-build-layer.sh b/sample-apps/java-events-v1sdk/2-build-layer.sh deleted file mode 100755 index 9f038396..00000000 --- a/sample-apps/java-events-v1sdk/2-build-layer.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -set -eo pipefail -gradle -q packageLibs -mv build/distributions/java-events-v1sdk.zip build/java-events-v1sdk-lib.zip \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/3-deploy.sh b/sample-apps/java-events-v1sdk/3-deploy.sh deleted file mode 100755 index 5ce8d160..00000000 --- a/sample-apps/java-events-v1sdk/3-deploy.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -set -eo pipefail -ARTIFACT_BUCKET=$(cat bucket-name.txt) -TEMPLATE=template.yml -if [ $1 ] -then - if [ $1 = mvn ] - then - TEMPLATE=template-mvn.yml - mvn package - fi -else - gradle build -i -fi -aws cloudformation package --template-file $TEMPLATE --s3-bucket $ARTIFACT_BUCKET --output-template-file out.yml -aws cloudformation deploy --template-file out.yml --stack-name java-events-v1sdk --capabilities CAPABILITY_NAMED_IAM diff --git a/sample-apps/java-events-v1sdk/4-invoke.sh b/sample-apps/java-events-v1sdk/4-invoke.sh deleted file mode 100755 index 05ddd9f8..00000000 --- a/sample-apps/java-events-v1sdk/4-invoke.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -set -eo pipefail -FUNCTION=$(aws cloudformation describe-stack-resource --stack-name java-events-v1sdk --logical-resource-id function --query 'StackResourceDetail.PhysicalResourceId' --output text) -if [ $1 ] -then - case $1 in - ddb) - PAYLOAD='fileb://events/dynamodb-record.json' - ;; - kin) - PAYLOAD='fileb://events/kinesis-record.json' - ;; - *) - echo -n "Unknown event type" - ;; - esac -fi -while true; do - if [ $PAYLOAD ] - then - aws lambda invoke --function-name $FUNCTION --payload $PAYLOAD out.json - else - aws lambda invoke --function-name $FUNCTION --payload fileb://event.json out.json - fi - cat out.json - echo "" - sleep 2 -done diff --git a/sample-apps/java-events-v1sdk/5-cleanup.sh b/sample-apps/java-events-v1sdk/5-cleanup.sh deleted file mode 100755 index 79b326e4..00000000 --- a/sample-apps/java-events-v1sdk/5-cleanup.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -set -eo pipefail -STACK=java-events-v1sdk -if [[ $# -eq 1 ]] ; then - STACK=$1 - echo "Deleting stack $STACK" -fi -FUNCTION=$(aws cloudformation describe-stack-resource --stack-name $STACK --logical-resource-id function --query 'StackResourceDetail.PhysicalResourceId' --output text) -aws cloudformation delete-stack --stack-name $STACK -echo "Deleted $STACK stack." - -if [ -f bucket-name.txt ]; then - ARTIFACT_BUCKET=$(cat bucket-name.txt) - if [[ ! $ARTIFACT_BUCKET =~ lambda-artifacts-[a-z0-9]{16} ]] ; then - echo "Bucket was not created by this application. Skipping." - else - while true; do - read -p "Delete deployment artifacts and bucket ($ARTIFACT_BUCKET)? (y/n)" response - case $response in - [Yy]* ) aws s3 rb --force s3://$ARTIFACT_BUCKET; rm bucket-name.txt; break;; - [Nn]* ) break;; - * ) echo "Response must start with y or n.";; - esac - done - fi -fi - -while true; do - read -p "Delete function log group (/aws/lambda/$FUNCTION)? (y/n)" response - case $response in - [Yy]* ) aws logs delete-log-group --log-group-name /aws/lambda/$FUNCTION; break;; - [Nn]* ) break;; - * ) echo "Response must start with y or n.";; - esac -done - -rm -f out.yml out.json -rm -rf build .gradle target diff --git a/sample-apps/java-events-v1sdk/README.md b/sample-apps/java-events-v1sdk/README.md deleted file mode 100644 index 6405882d..00000000 --- a/sample-apps/java-events-v1sdk/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# Basic function with event library types and the AWS SDK (Java) - -This sample application shows the use of the `aws-lambda-java-events` library with event types that require AWS SDK as a dependency. A separate handler class is defined for each input type. For other event types (which don't require the AWS SDK), see the `java-events` sample. - -**Note: The `java-events-v1sdk` examples are deprecated.** As of version 3.0.0 of the `aws-lambda-java-events` package, [users are no longer required to pull in SDK dependencies in order to use that library](https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-events). Please see the [`java-events` package](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/java-events) for updated examples. - -![Architecture](/sample-apps/java-events-v1sdk/images/sample-java-events-v1sdk.png) - -The project includes function code and supporting resources: -- `src/main` - A Java function. -- `src/test` - A unit test and helper classes. -- `template.yml` - An AWS CloudFormation template that creates an application. -- `build.gradle` - A Gradle build file. -- `pom.xml` - A Maven build file. -- `1-create-bucket.sh`, `2-build-layer.sh`, etc. - Shell scripts that use the AWS CLI to deploy and manage the application. - -Use the following instructions to deploy the sample application. - -# Requirements -- [Java 8 runtime environment (SE JRE)](https://www.oracle.com/java/technologies/javase-downloads.html) -- [Gradle 5](https://gradle.org/releases/) or [Maven 3](https://maven.apache.org/docs/history.html) -- The Bash shell. For Linux and macOS, this is included by default. In Windows 10, you can install the [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) to get a Windows-integrated version of Ubuntu and Bash. -- [The AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) v1.17 or newer. - -# Setup -Download or clone this repository. - - $ git clone https://github.com/awsdocs/aws-lambda-developer-guide.git - $ cd aws-lambda-developer-guide/sample-apps/java-events-v1sdk - -Run `1-create-bucket.sh` to create a new bucket for deployment artifacts. - - java-events-v1sdk$ ./1-create-bucket.sh - make_bucket: lambda-artifacts-a5e4xmplb5b22e0d - -To build a Lambda layer that contains the function's runtime dependencies, run `2-build-layer.sh`. Packaging dependencies in a layer reduces the size of the deployment package that you upload when you modify your code. - - java-events-v1sdk$ ./2-build-layer.sh - -# Deploy -Run `3-deploy.sh` to build the application with Gradle and deploy it. - - java-events-v1sdk$ ./3-deploy.sh - BUILD SUCCESSFUL in 1s - Successfully packaged artifacts and wrote output template to file out.yml. - Waiting for changeset to be created.. - Successfully created/updated stack - java-events-v1sdk - -This script uses AWS CloudFormation to deploy the Lambda functions and an IAM role. If the AWS CloudFormation stack that contains the resources already exists, the script updates it with any changes to the template or function code. - -You can also build the application with Maven. To use maven, add `mvn` to the command. - - java-events-v1sdk$ ./3-deploy.sh mvn - [INFO] Scanning for projects... - [INFO] -----------------------< com.example:java-events-v1sdk >----------------------- - [INFO] Building java-events-v1sdk-function 1.0-SNAPSHOT - [INFO] --------------------------------[ jar ]--------------------------------- - ... - -# Test -Run `4-invoke.sh` to invoke the function. - - java-events-v1sdk$ ./4-invoke.sh - { - "StatusCode": 200, - "ExecutedVersion": "$LATEST" - } - "200 OK" - -Let the script invoke the function a few times and then press `CRTL+C` to exit. - -The application uses AWS X-Ray to trace requests. Open the [X-Ray console](https://console.aws.amazon.com/xray/home#/service-map) to view the service map. - -![Service Map](/sample-apps/java-events-v1sdk/images/java-events-v1sdk-servicemap.png) - -Choose a node in the main function graph. Then choose **View traces** to see a list of traces. Choose any trace to view a timeline that breaks down the work done by the function. - -![Trace](/sample-apps/java-events-v1sdk/images/java-events-v1sdk-trace.png) - -# Configure Handler Class - -By default, the function uses a handler class named `Handler` that takes an Amazon S3 notification event as input and returns a string. The project also includes handlers that use other input and output types. The handlers are defined in the following files under `src/main/java/example`: - -- `Handler.java` - Takes `S3Event` as input. -- `HandlerDynamoDB.java` - Takes `DynamoDBEvent` as input. -- `HandlerKinesis.java` - Takes `KinesisEvent` as input. - -To use a different handler, change the value of the Handler setting in the application template (`template.yml` or `template-mvn.yaml`). For example, to use the Kinesis handler: - - Properties: - CodeUri: build/distributions/java-events-v1sdk.zip - Handler: example.HandlerKinesis - -Deploy the change, and then use the invoke script to test the new configuration. Pass the handler type key as an argument to the invoke script. - - ./4-invoke.sh kin - { - "StatusCode": 200, - "ExecutedVersion": "$LATEST" - } - "200 OK" - -The following event type keys are supported: -- none - S3 notification (`events/s3-notification.json`) -- `kin` - Kinesis record (`events/kinesis-record.json`) -- `ddb` - DynamoDB record (`events/dynamodb-record.json`) - -# Cleanup -To delete the application, run `5-cleanup.sh`. - - java-events-v1sdk$ ./5-cleanup.sh diff --git a/sample-apps/java-events-v1sdk/build.gradle b/sample-apps/java-events-v1sdk/build.gradle deleted file mode 100644 index abf8b34c..00000000 --- a/sample-apps/java-events-v1sdk/build.gradle +++ /dev/null @@ -1,56 +0,0 @@ -plugins { - id 'java' -} - -repositories { - mavenCentral() -} - -dependencies { - implementation platform('com.amazonaws:aws-xray-recorder-sdk-bom:2.4.0') - implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' - implementation 'com.amazonaws:aws-lambda-java-events:2.2.9' - implementation 'com.amazonaws:aws-java-sdk-s3:1.12.261' - implementation 'com.amazonaws:aws-java-sdk-kinesis:1.11.578' - implementation 'com.amazonaws:aws-java-sdk-dynamodb:1.11.578' - implementation 'com.amazonaws:aws-xray-recorder-sdk-core' - implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk' - implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-instrumentor' - implementation 'com.google.code.gson:gson:2.8.9' - implementation 'org.apache.logging.log4j:log4j-api:[2.17.1,)' - implementation 'org.apache.logging.log4j:log4j-core:[2.17.1,)' - implementation 'org.apache.logging.log4j:log4j-slf4j18-impl:[2.17.1,)' - runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.5.0' - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0' -} - -test { - useJUnitPlatform() -} - -task packageBig(type: Zip) { - from compileJava - from processResources - into('lib') { - from configurations.runtimeClasspath - } -} - -task packageLibs(type: Zip) { - into('java/lib') { - from configurations.runtimeClasspath - } -} - -task packageSmall(type: Zip) { - from compileJava - from processResources -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - -build.dependsOn packageSmall \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/event.json b/sample-apps/java-events-v1sdk/event.json deleted file mode 100644 index 94c28f5c..00000000 --- a/sample-apps/java-events-v1sdk/event.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "Records": [ - { - "awsRegion": "us-east-2", - "eventName": "ObjectCreated:Put", - "eventSource": "aws:s3", - "eventTime": "2020-03-08T00:30:12.456Z", - "eventVersion": "2.1", - "requestParameters": { - "sourceIPAddress": "174.255.255.156" - }, - "responseElements": { - "xAmzId2": "nBbLJPAHhdvxmplPvtCgTrWCqf/KtonyV93l9rcoMLeIWJxpS9x9P8u01+Tj0OdbAoGs+VGvEvWl/Sg1NW5uEsVO25Laq7L", - "xAmzRequestId": "AF2D7AB6002E898D" - }, - "s3": { - "configurationId": "682bbb7a-xmpl-48ca-94b1-7f77c4d6dbf0", - "bucket": { - "name": "BUCKET_NAME", - "ownerIdentity": { - "principalId": "A3XMPLFAF2AI3E" - }, - "arn": "arn:aws:s3:::BUCKET_NAME" - }, - "object": { - "key": "inbound/sample-java-s3.png", - "size": 21476, - "eTag": "d132690b6c65b6d1629721dcfb49b883", - "versionId": "", - "sequencer": "005E64A65DF093B26D" - }, - "s3SchemaVersion": "1.0" - }, - "userIdentity": { - "principalId": "AWS:AIDAINPONIXMPLT3IKHL2" - } - } - ] -} \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/events/dynamodb-record.json b/sample-apps/java-events-v1sdk/events/dynamodb-record.json deleted file mode 100644 index 74a055e8..00000000 --- a/sample-apps/java-events-v1sdk/events/dynamodb-record.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "Records": [ - { - "eventID": "1", - "eventVersion": "1.0", - "dynamodb": { - "Keys": { - "Id": { - "N": "101" - } - }, - "NewImage": { - "Message": { - "S": "New item!" - }, - "Id": { - "N": "101" - } - }, - "StreamViewType": "NEW_AND_OLD_IMAGES", - "SequenceNumber": "111", - "SizeBytes": 26 - }, - "awsRegion": "us-west-2", - "eventName": "INSERT", - "eventSourceARN": "eventsourcearn", - "eventSource": "aws:dynamodb" - }, - { - "eventID": "2", - "eventVersion": "1.0", - "dynamodb": { - "OldImage": { - "Message": { - "S": "New item!" - }, - "Id": { - "N": "101" - } - }, - "SequenceNumber": "222", - "Keys": { - "Id": { - "N": "101" - } - }, - "SizeBytes": 59, - "NewImage": { - "Message": { - "S": "This item has changed" - }, - "Id": { - "N": "101" - } - }, - "StreamViewType": "NEW_AND_OLD_IMAGES" - }, - "awsRegion": "us-west-2", - "eventName": "MODIFY", - "eventSourceARN": "sourcearn", - "eventSource": "aws:dynamodb" - } - ] -} \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/events/kinesis-record.json b/sample-apps/java-events-v1sdk/events/kinesis-record.json deleted file mode 100644 index 8bc3e069..00000000 --- a/sample-apps/java-events-v1sdk/events/kinesis-record.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "Records": [ - { - "kinesis": { - "kinesisSchemaVersion": "1.0", - "partitionKey": "1", - "sequenceNumber": "49590338271490256608559692538361571095921575989136588898", - "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==", - "approximateArrivalTimestamp": 1545084650.987 - }, - "eventSource": "aws:kinesis", - "eventVersion": "1.0", - "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898", - "eventName": "aws:kinesis:record", - "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role", - "awsRegion": "us-east-2", - "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream" - }, - { - "kinesis": { - "kinesisSchemaVersion": "1.0", - "partitionKey": "1", - "sequenceNumber": "49590338271490256608559692540925702759324208523137515618", - "data": "VGhpcyBpcyBvbmx5IGEgdGVzdC4=", - "approximateArrivalTimestamp": 1545084711.166 - }, - "eventSource": "aws:kinesis", - "eventVersion": "1.0", - "eventID": "shardId-000000000006:49590338271490256608559692540925702759324208523137515618", - "eventName": "aws:kinesis:record", - "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role", - "awsRegion": "us-east-2", - "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream" - } - ] -} \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/events/s3-notification.json b/sample-apps/java-events-v1sdk/events/s3-notification.json deleted file mode 100644 index 94c28f5c..00000000 --- a/sample-apps/java-events-v1sdk/events/s3-notification.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "Records": [ - { - "awsRegion": "us-east-2", - "eventName": "ObjectCreated:Put", - "eventSource": "aws:s3", - "eventTime": "2020-03-08T00:30:12.456Z", - "eventVersion": "2.1", - "requestParameters": { - "sourceIPAddress": "174.255.255.156" - }, - "responseElements": { - "xAmzId2": "nBbLJPAHhdvxmplPvtCgTrWCqf/KtonyV93l9rcoMLeIWJxpS9x9P8u01+Tj0OdbAoGs+VGvEvWl/Sg1NW5uEsVO25Laq7L", - "xAmzRequestId": "AF2D7AB6002E898D" - }, - "s3": { - "configurationId": "682bbb7a-xmpl-48ca-94b1-7f77c4d6dbf0", - "bucket": { - "name": "BUCKET_NAME", - "ownerIdentity": { - "principalId": "A3XMPLFAF2AI3E" - }, - "arn": "arn:aws:s3:::BUCKET_NAME" - }, - "object": { - "key": "inbound/sample-java-s3.png", - "size": 21476, - "eTag": "d132690b6c65b6d1629721dcfb49b883", - "versionId": "", - "sequencer": "005E64A65DF093B26D" - }, - "s3SchemaVersion": "1.0" - }, - "userIdentity": { - "principalId": "AWS:AIDAINPONIXMPLT3IKHL2" - } - } - ] -} \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/images/java-events-v1sdk-servicemap.png b/sample-apps/java-events-v1sdk/images/java-events-v1sdk-servicemap.png deleted file mode 100644 index 72afcfdbb24b548ec5cee3426cbfa1b2d03e967b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51745 zcmZ5{1yog0*DWeahoE!_(%l`>Tq)`9?(UKZ z+2`DIcdRwnTyw1(_C;0#1rZMs1_lNNA}Oi>1M~72{C@%d4fuU$-lqosL9mllcZ7k# zBLDY#0Z|}31%q%-5E(JJ&DXHl%!Exs;$a&|Jab$}@9-2XhBP*07+wcZH(e}ISTy^o;!tdeB~Ng!N=((}q5dvJzfnsU0%jyVqb zdY(9DE{#yM9sI1_Xy~tg@2nn#(WCPTz4a|@s7{zpL59OK4thSB!pl!E0VKY}{2%?3 z0$5LQ4MyF^Dp~{w*kmw;&;yN`WG*~E$y9Ej!|FdtLY3Yh;=r!?P=PDGEQGnX`u{gs-r}pP_8VDfuU|i~sk7{6Eb)_b`1+-TI*1@tw?kl1=8w z<^R9THUj&JlIcbX?y=+dQ5|+z^Z))_*k8iy8Im9L6JbzJA<#``nW>9`BQa&%|Gg%7 z|DbMu#86n$uXZ1hD_3khV;hkEy9>gnN%iha3IFdBnUCw&CcNC(iHVj&ByQGcAJyI= zp-u;D*BYo=tG$=1?0Wa#^{%vTUV~7i2$GezBBdV@n=M3QMMHu= zSiNh?%1P!)$=aCkYIr2l^5JA?4{>jYi{2KCf8R-W-62xDp?14KT2ff;PgBwleRnAG z7R={Z@y2Vt9G~Z7ImBi-+R?ftWaf;aDgTX~r4I7cC)UfLkYF1;7)ePM038_&UmQ(jG zAw>t_U!G~U?VLR@F*8fQ>Oy`rPoa?fA;|(IBl-AI%Fj_Kmpv_ziSkUJxtlv1+x9nR zXBt^h-`W@JUjjx#=rb`kIK!5lwwKEd*fzJ?NNDw|0aA_|*Pc~W`+c^5m3dJkBAFu6 z?IHr0A_D9p2%EWV;c4y0D2~(Po_;TzW-*ZhOqiN?FjQrnEIMtOn#ax&@KxVP!j8b+j=>yGmnnG!D2`^7{hAC^u` zS{$8Z&?Z^gMf;QlTc<=WN0C`~97&{Dpzj(G(7cv>pXb{*4l`d*c0N<^vx2LPk7;35 zb{{hd-b%SQSaxFj$?1}iL>n9EF9KH|EM3$|vr&VniW zAEXrim~M4Mw&~6?Ne7sDk}=mwvgAPL6O{T#H%G`My0ZpvtR6x?EU_-7B(^2%YxFfY za;(UVU4DqmQ14xyx^+eoOTfnai{3=x}?SDZFWNuOn8o~rb50y?Pd4A+>AQnrUF>(TDI zmvipSaLhNndV`A)ivO{%m^)`ER;|SwE3n#?^+t$Z=Fo3pd zHJSgw=W+DGHoWj-xGUci0=|ZmL2UY)eIVEK4dkV=3N|LZvI-fqC& z%rH9BxQ=22i%>gD>w?NHfsecz8MnJzYG7kz@cpsqIeKES#6Pn82#cA4YvRqY?ae^J z$NH@?pGg`sqVxjF<fyiY;clr)QsMXsf4+TDneuW%D-bE8n8l;qfxFG$xCA&DC}?c zd}u;axaYMYPmvtkj|_Cs@W#{3Kv4%b0?jzYepeGHQL?Cp(MtsVQRfKz-|Ud*LwMkw zY>_%U`)ZV!8S_0=7ZiRo9cmJ6o{CajY09H@-JQ-6a_GWAizitQmC1_ys%EK&`knlk z4TaU?g!F#jq!rxgk|zfIQZIJdz|!p&azd*l$~EYSMuvbn$KD~_n@a2^6J@)4gdQi8 znDEuq|7?Wd7?l)!v6nyQB;mj<= zNuINUo&hV#`d%r-@N9fbUe?P@l{8q@*@{$AW5yEa6m=9>=q6PaJ7DLkJO%7sEp=$% z@VFCXG+0?eEJtdbU&BiNCgbic6t>K3&g};NqPNWB=6011P0PkO^$sppN|g`cH}1yqnQ`8AQ1ryEN=ws^+P?`U|`v zGF5MiXZ0}jQ4CcFv7$^)^d-*o^+IUjZ|E@NN({Br4$C(Ud|xSM;Kq=>g9x*}4|4 zRT*-Zp#&T1RYV9Xhmq_f2AxmlsA?QNA#P z>*HmVXa7Ci;E5NJ&5+<2RT)^tEs)Azl=q!%GY&VM;LuLcc;zJDJ3G2Ki=rI4Zd}mw zm7cypq+g(D25b69_2xU_;}!P3_vkY#{P7LV?2N=N%BMbkVmt-+RsD#)otH>V#-Nu>}nB~q|dNa^Tt%dJ?H72si$R< z)0mzz-7N}Ah(!()M?@F!?aVrB<-U>%>@GI*%-yw|{P3=lkD}zObfup_N=TyL`_UYHX--Y96Y`z6uf!bsa?8HuCc6CYumciMi@y0k6(#|zB4 zcSwLhylhqocXyfU`c8ob%PTDe&poxmJ$f~LuCi!;Z))>l00W9^mM$A9t>^233&&co z_-7c|rI40m$5oMgu75rQ4^Mp2-cm;iBE;&HZM8-q$+)qX{n1F&x`haK?fN*Z`^jyG z9IT81@KQRczsdgGJ6bqam(#q?u1#K6f5P>YW{#B+TTOu<9u3C!1Q~KS^1#FDrP@W+ zp@jk;1KW=GgnSkq(pX!kKj}>?j4(+?O8zNHC0^6pzV@tpxLI)Hw5`irJOA{Gp&dJ- z^baQ+sr4G4;wAbR7GY1Znm=LwhrqzWUnYOcu0+bCoDEVa087E;8CbLDOREVHN#;E+ zGMXuKH^)8NJi2E6ja(0$4@$N%^|UEkaBlQVh-hS)ag>DQLoVix{S8~iPoMq=!o*WE z9VK-kRyKeF;2x6eyo421WgNby=&5B@x1$Bfy-6^3Q;*Ynr@^hkUy=+4FZ5Ik6qh9b zO45Sn61Tnmhf7&BeR(A|ZOUPTonNKPUR9^)>Nn$J*RpIPI|jb|?ae+>`4a~bw6%l% zhf<7N2dTv5oUpy;NWzu3PJ$J>yaV{w1usPom1upmyYkhjn4#UV!wx!g_qn@ytAB(!>}_!m)+wDUCU{mNX$FvJ(=^=3T#3hQ z-5=W+Jb&}@cemI2^e1QRcjRi3IU%E(9{y=w%)lc4Op+_@ZsK0@glwzD8>D%Y&G7SE zJO$SIR(8l-TpjxyNqIBw3Ezp9V4o-94z8nI)*y|*vK$EGtJL1%0l13+gxMdgxN^!N zJ`<-LlpZv%BB)5Sl6e}Larv6}sL*n4n{74HJWYe$PVQevxoUSFp|N@G2g{bTrdMDK z4!*EQov##Tv9D;I7<_i!;=CM-(o-!18JhY8HJ|D^R|tzsXc!i(#`~2cuCXCiLA^=- z2r>Cn3!gf2tW)B_=dWqIp7mlv4X#eIR~KSm}eM{8GuCt``!uRM1ux%tk_MBjkT&<4E_DtMtYoj&)!rppI@?sicB z)$#c_jm`^lxi9GWP16P{sd6_L&DS+8D=yHpAVgM47p78HY#Nlh^?C$u#lVhFjG`9&gsZ~N6 z##*L*f-|Sv!*pjqA(lFx8~qgm`|K}isaDyw7^Bh4b6b$2YM#E^n>A-=Nd&0gU4-^n zn9e;4DH+C%Z}UBgV38+b2}U6l`p544#MLJVZgOab_j^n}E)QdE%b3*2NtUEv7}eW4 zCZC3rW&>PjeUaP3X6Uo}10DcwBS>e~!kz41qFePJy-E=zTzbRw$A)|3g+5O(SAf%X zWSeK1*Ip4n(Y5F`&=ZCV9^8wzymf5(!%Qr2C`8q}+}bt~K;Us2vO`~U@h}a(v!Avt z#I+$`TJI=(kc^hzeAv=0pev%9TU)+KNNuR_oVo@Mei z%i_}0GN|F>{Ak6i4?`?9EAD@r)^~nJIlt!SS@Ur%-a&j;yFjdI>-f?DZ;7+IcvdR8 zkXXbekobJ$Curb%&#{z(oobP1{xg7B^(g@|X7$ex*taIU9u<#D9_zNaQi^i$-%zjF zKTfaMUiA2Pk(%rJ4;LE!-N?Y^N~^`JKklK>#7QGuYgcWP?2_~ZZ%;7S#=HTMVqJLlfHJEiwqM)ko%ry;eZ#^eno(lMdD$^jReQ5iK*ixrw z%k>qyG188l>tDYlt~y~r+a43WSJ%}3z5p_hc9jBPl+ooa-KDMq|Li_x9624BP>^dy zrbxW9Q`ZMUj=1NR6W;F;cUnWxcSJ+J3l}eSmoMSLI%sG4odxuyn*HA)5o2m zw{K_p-7PrV60Uh+kVFwX!_-#)r2ZM>e3mxQbD@jd^LFLhl=)wVH_6K1y{g(i9C>%9 z7ecXQiYLARY|PiNmotQJK+PD*SM8o0)%Y0M#f)S`zv_aLx4qZU{o(AuhoCs}!kZnK zM|}jRq`zIo=>eW#nQy=i591pwVyz^#J5^7eA5;vyb8A6lAr>3aLm6w)gBjw&!pchb zCLwpJgSr#U^Vo-{f#e#A-L2l)iN1wCK|mW|!9bPzlPEz4U)j{AQB9A! za~^=*a!+ZFwEu1olel>E&o|#UnV%kP-vGx&#^V0MO+n8RE4X@v0({AzP^aIsZkKA6 zjyu>q2`~+9#aEBcJ&X+k^Z1A3f#hlz-QJ@+>)0~whISlZ`Q112{JQ~P6Iw*6L(2u}iHjDziV47)ai^lJt zer-zt1~}0%&dVOt@?0OT8%|P3q9=ptI>qK*^TbvwQl|DEDcJnDh@;oju)J(*L?$T|ASjDHN#b)%`y=pa-+u7@@+es;(o89) z-gP&XuA4)}fuDKY$F{bWfY!h=M{qa}yH>7*%5j#Ouz?for;qawvM;n((H+-jIymcz zHma7q-LQjKoMll?Q@1y6oqQ`rFa^3&D2{jTE!=9aK7trf@-UyQHH>|MRMO<*G6z}KEYUjjJLrhP9)+D(dZKne_Gr=Blr z*+3+gtf}D5EoAv%_@SGOL*Myo1o=YY;=zrLIM_UfFufN^GqbyV!Jlw}-xla#t90%! z)fFm>v3Mx%-HPtGg3ZBp3#nmc9&hYK+D`GT1c|9kprkWm5v*4x{cg)AE!BUtpJxTU z790@;MSJW03)NuJlV$N*im+x7rxY&in+o7S4y&wk>v3kd$vri@z7@#J^}R8!01?#? zhNI{6(HB~fI=$wlTO(RO_qiHM*z!d-49DYd6Aa`2htIYDOeniS9 z8n==o>B=sQKx6lc4bp<93O#uxucqEtxW;^nw_hr|nizA%D9+2u`rvC|@ie!+ZFDSr zGVN!TVm@Npn95+>NClvz9h3>hzIRgGSxajr7+k8tVkGy9Vzl*0qCabNa~6b>o$c2~ zH*l;F9##f=cAt$(rJYoWsGE^^vbhqY8CfB@sNK9TF<8?im#d~`!0%!M&t~RJzx8lJ!xr_UWm);TzpfIp?e4u@+*L2EDOIXQdY%SF9D2s zbrw?|cR3oicwE5>bVb`(06KoQl+ag6wQte>y%HASVaDn?Y*mz5jNTIeKRVnUBHv&M z5c~1?ULA(5OU_*3#hA4_ftZ3n!Tb{?Ghc#j0>Q_n^-rU)(8#Jz?KbL=j?9)cgLq%VreQEzs?T98mPLc)GHpq459bJhX}tQtKVdFs#f3?}mM zN(X5PmlE7RtziMH%7*!yoU}t$b~t{HVddv(Sw$%3e7z@}ebwmn{2I?fY)e?qe6xGa z5nFMoLtA@PI<+PjRGH|X`$mB*T){EteX{|OML@EwLo~XAd02TY^;QKAtUE2L$cJKy zwSk?Hk)4=wH5u}ap9KUZBo%i13c|MDqGMW+{Ru3O1tf3rrO_vFt-`k{IVIgsZ~(bs zJhB62=6aJ9+O-h?rtS~2L5HgL7eH-dWsBN6(Y_(?*IeYet$03p{$rsD7p$+B@}bO5 zmx2NVgS;p8_E+X3iLTcp)tY`5d#p}^Q3eB#@UkR6zhVGR{x4cpK_f>kj)Ax9jto|O zKs?hi=l7Gl2q25ajUP@#Boc+H+(UHQqDF~)uFemfZmtb+C|oZl^AVu1Vz2MKj)waB zN2MhaL`tevTKy~fo^K0nxeC`o7l`E&i^7}H+zuWU6*WXE&q z2@!+P;Wx2B^-z3`cAit5*bz87;Inel(C_-W{T&Dm=&T^U-YOyfbKVS|_OqWXgN`e- zdNhyN)MV$>&D+R0x5`ly;qBYEIJ5*WDIgdkT_3fYS9&~&GfZwqSsZFaXzk%75u-Qe zvvd9h)ZKg`Al08ZrR|_ewUd2zM8pr*PidKO2|q3p0(`Q2GdVj1fThkX7f-XN`_U2F z?g6oA!pYxYAiOx#EQW?fZ8la2h&d_k)+z~R_{`t-M2MrA{We`5!^%$4U90w`eF&Xj#Ns45+o z)I)$MyeE;^7g@gd4r}xDHzpb;Hhx5TMazpHc~?BdX*@$=iaYM79c?kvONLf&y$pv8 zAFuK6@*rg+#WF7v zS7PNZ`UWqe;O#!HMb(kn2x24`GvUyrQ)$QY`ZrT-XQ@6ec?ot*q0R~9pXA?lc6C;2 zl&PH<=%$9BbN{sEv~9Z}p_I)uosCkMR1{&HS0+m?KqSg_{}}+1TF&j>#&KOn3|IXw z5Lq_Tv6Ih-vuF@yJ;_$*&bijG9-8_{N&JkUX-OURnGc9X1Fp01_Iddkbq9n_H>h9K zwIy6kXiz0~mHX!7tAn0!jaz2zi2zzoetH$XeQfIJB@06JN!jOB^VLhHM7UI--E=W= z$24kxD_Z*T854<0ibg~2N6)5{9J`^7e2KDJO2iY&Pr1wNK^m9oUc<%*1f&IFDL>qz zeDm^#phJ}~1bYI3hQ!cNyM6qM$;pMN?b&0G_Ft9cB+=>AJ!bh)WCLj@CB~hs054!) ze60)9DMzmTL4%l*b)jd%-DCd?0xvVwa`!se{st*=%gESnb6lWBfRQ*|VC>InzxD~M zS_Tc5w1XN!lR48y`i7C5ais``T3+{)urEJ=>?E9Aaf- zK|4DRQ5Y_#-|*6rzz#nwrR}%*(?QIF#Ua81#t^YzsFu@I)x-JzTGuBlVY3Gtw-Tni zd&I~tYP6&f4Bh^Dsh{*O5q8sY^RwHT=kyU?!hp#4GU6dA27MdZ0_~~nbrJH$@sMIq z56^siL0VuS*8*=-QJJmD%2w0C(;E?4X*|!#I)C$QNyJ1ryuA$65y$n`&2r2eaKedi z_G8Ik$8g2SV|_m>@0_%jq5DBsg+4Mq?v#GvT?^`W{)7pYzm!oq0OJiIg8*hJQ9X!& zBs_cFCy6oHX~=H5Fj(|Iy#TpnlxN-8sF+0Ce=hHav@A~^y(6?jsb%|f`0{YN*Z^Z- z^;T|pTG0z3U)m{`yR*ZxkMqrTg&ay^dEV90 zbzvFcL#*@w&?mQ9v^1eju~B~;GO+b9uk6xrR*48I>q(ufE<&GeNtKG9Mh-GlttTDe zgVrR%m%M^NcY*$HT>260^-UvMGfmRvu$}=1KGq1(Bss-}&lD|2RMP-W;Sb7x|vmZAF~CH)l< zK@;PA;G66(TQfkxz_Bo^TE53$%Wwp92SNuG)L%b^U~mqSgts|!&5l8gJrvvZ5E>P= zdD!#0T>AvsMUu9ToFvm45@Z%U`pq?pR)n5pG2laB+u9v-aj+&6g7lZ=WCbrdS(op| z$^I<_gY~vOY$&ps74Y-=t}tk(C*(74BmJd;cpM)f^9yya%|$ir;m;v_*~T*Lwz1TA za$Ak`LXNNaoHpZgbNxk%1zh&)umy6N`9(!x6B849A$2rq*OH)+0xF@!xnBe)dmAiy zz<%K?UD+W4tt;jOCFj$%PG*)Y#D1()ASp9c|iw@n>zMON%~1?zf;-*=4AxQ z*3XS(PE7j704uSv>)gAn2&(&H^4#C60^%7{>#BNqa=1O*1V@w17_^JFEDo+>TFn{k zOcWB-0>@4blPEyl^31GFFT{DZsl*`$<>PE4vtSgNkhl^CIf8r1d)4uu_4OBjA5I+i ze^Z;72xte9P*4O1z@eRQ#>qhwu^0N9>8oOHDs;i=;3jA0x-`T~IP`q3@9Z17-!{iF zmxwj;YRVir;|8^SKu)D+j-i>~zjsV@p^Z;*c7(BFQ`0VY=18EGO_Y?Cf!lIL$(Xn} zg;$4}=nV-8P#Mu&)H=PzS)D9`%UMn?^puql)4AXE*aX(<*kp*Qa2Bb&3!+brprW52 zZj@5iDl9Y@+J5O!&7yMUJQF}VWF^P2uBD4YL1B%_4;a*kF>bL%X}G@EzIQB+EDV*=H6I7?omd?MCyx6fH zCecU;nUIAMDLKO3FH{8h(lm<{CSFcCF=cw(B5Jexq8*zQity|hbYdwN6Q1z%J5E9< zS!`@VXF1_wVY%hHgEJxAb-d%QAHStNmF4Hy_k&Qx#^1WpayL_U8$6);*zE=OZhE<) z_jHLXoDS5JYv}C_QR?H!aoyu9HUJJS^VU~2QboH8a)~)xzw&fRfI1{b@VyqX5Pg}t zUcHx!D;{fP5mIs1<1bQJtp;&!ExRQ=N!m38#TP#asLH?G5#K%6NakGiic8e-K$v2y znop=p`nGJ-cW`yS9>It~OgvU)*f+y9So^P>YgtA)A(IZIie<%Dpg9Sv@sS89bFt(I zU2N3hL!`z5bmb@I)LpfInDb^7AFQ ze)tz&!XP(vKo5$E`C^=07Iqh?N%#vD>Fa4FQ>T?n)5DwF3Bjj>BTklA%9n>oC@^7X z_V2cL=*-O`$smXGt?6;5jQ00SiMdQ_ zkLLfL{MbhX^bjFoVk*lIIOgY+p3hZY>EXONX}LfZ5fR}cpydslv*LII2j_mX?0Wb2 zrk&UU`%==9t8vr`R37DxgGP&dKyg}BgR^r^gk%or0$3$*TuS&sRr9}4cCp;K)gMou zx5n%}`CQYAXrwSO6{lJr{z80QAIbhj@^oWzFmr}Ib}JRy5aKx*Z$+ed_N%mJwSg#W z@;Q;pX?|Xw$e~w}W;jl=s7wdWZ_SZFYTfDm!_*_xy&WGuO@gD3{^+8f=)9WMeLqZM zmk_6$2_<(iO_B^jivdl$_33AwtKIpq7!(sTG%QSG(lWPztfrvl+jfbylFGDvqal7Y zzn5Drn(+wtQS2tq6mAlJPsyDb{>d7`1We_z%J+sFSv1Ek_7`83tG=K&GdHy)lvGqi zH#PCR6H~YEq=#Ts(>ZPpz7Gxwfj|(-j!h%76>t)J!paeq)bmVDLSyf!L1P_^7XC?Z znLF67(%tVUtkQ2fOlqLX8BISUQ5x(T!}CjK3oV;ItB5Z^J?HAI7>s7G%apW=vg)#u zORNd480p(0`U5~^78COeSrGHhyJgl_Rx(uZ|Jevj5195WeFM;sLMG_4q4aTJVDwML z-}TijeAkRhFg-=E;ny<{k3$j9y&(mo_IA(Z_7lFB|z9`kUfgoPor=$vRLeua`Dw679ZN3bqiL9SAHFqoL|Q>0pu zN=iVdOzfRKU9~^m0El}*hYHlp6B7j9r!Nc)4GPW8vhOT-{~FT?wKZ0L1>m*r;$B#6 zo!eT2uZ>o=xojRyMoEG4PbG@X*!va3U`iVp{NFq)R+>pVj-I4tMao2+26)J;q%=Oy z*fzhs)yKi=;n5?_c^!@6t5G5bC8f19k6DH}b|?XnoQcwpZS`CVJ)X8T-zC)wsfuR3Jshx?%SuSesPYaA5-9^%;b!| zMMkX68KT7|p%2X?#j~+#YtO_aLf1)&cv>cK}ii^AZY}3L#hvNU(8EEfv<2uWPzgKz&mlb3+zJF#Jebpm&N8q7{ zMpThFxbMN!d~Z|px4U=yr^H*Es#OP~xBRXL=C8vZkf++X$;djD;OzC8E#J;INy^Dl z3J4Hc;~Hw)_AwzF7#a=?BaiI!pf~)`G^*)(~1J~utaqJc22;?jKmWT_bJP2;maeyzhJ&0NmM7@RhNGc5^j63C!$Qd)Z3 z%Ld4Mzfd6!eUXh6%rcm-0@OU&^sziEMVe@_l#LzrU*u_Wtld~@HE7AWo=k=;2L*A@ zsZ{^Vf;=AHaJ!zd*tnXJw*e7j4U4y$%)X1=PYStFQ*}sgX_-~pa~mcu(2jDV4xQH2 zDdO_dsm^*axcq>YXv#W;B3S>6j*hH?!fsixi=wa_vI_YZZ3$K<(4#37B?(Vazim9p z+T37ZVHGO#$+el^>FRP~iube%-%&kwzP9FDwm)BRumr#ZJtr%#fd?7sP}7t0^lolL zv-TCh{xHkY_xEMtkZ+z1is&b<#fqZ4V%ydZ#YLDV-Ko*h7+>MaM$=?PJJw zY(`3F{QjH$MD9ZdLC%N})T6G0D~Go1l(t`4F)6CsS`9B)r7@$o4VT#811?QF^cQyI zK?~%j`YEF7ABFFa)#cws5%P*VIIsw;4r(N|>M&AMQxovI9F~_%!76^E$52KkI}SEy zI!Hxx5EW)}cP0j{Tc0}htKJ^Km)RGg(3d@~`d-{TE(<;)Ew?@qdonOHM0KGZQqZ#} zBfXynVHZ>F^6>%!?FQ0D6v13y%TQM{r7R1Mu;H@dVXWxlM^JAf3yZxQ&H-a% zpxw708u;yEZ$+E$emKd9+5RKGVRwsqg43YTWXlZE; zbGF~fl&Tz5_ZGdl^%6LA;bm+&efj!zR%;9-$pUT3Ey=H2Tbctwrm5WV?%X&y__$m& z(PVd+@ey_Iou#CV^p!`8R*Tlio?~L8U1JLC4x?}BWlm4=`JXKB@9(fDW+r;_iZv)G z69tUO$hl)Bh(sCbX%~ASgzeLe{d|c`E;e!3bZ^B;%;;Q?Q&80&)HE z;=}Oz+?T7x#B~Q{`scCLr;pF4Q`qL_*3WZ}qd^!o-1E5q>{?8Dxmsfx>D3I)aEQvsA92PX~#C~UoxAf+Jx}5TQI?#nv za|q*%?h7a`=6im;0H+D=kM{oEaJ?hO<)o9Wk+mmx?8^+5tr(JHfhq)Jh+_vFj9Og z(#2U=Tx9BIw726I*r0}bNK45v1F`g^tVN+Gwwzww1>Yg)xd^4AZEj15Z%D1QV@CVg zKwIsPk=-Q{92{I&RFu`;P7HzGZV3K0Y!NkVyJ3ORI$=Ao}Eg(wCXXfRVQc%DU zy#0lCJL=jNKnA(Ix{_B^?25$a^!GNSHHfEI+xnyovg$-E9!m7J8&EB@s9kqyHn*|a zE~{TzA5LZk@1UpkyTQj>2|_BTDVdudmt4{&LNjGhnf&b$`Fj&qAui7RZZmFkYisT1!F?l=(+#|m($dK2=_3yht)d9H zJO4gC1UP*kqJ&_qsqjMIahZo<-HbaqW&~wZ6&8oDo)iFK>iXKHy1JT*hK7`t^}=zM zz|K+td8)g+8`PbI$?V%_W`wN0G4u7$Z?U8Fs?=_`q$*B-4P1cOLk!$1VsYEZRG}^B z`~HIXKE7t5rJ0GVJ1$81TSKuT24~hu>k_Q8tDB-6v1x#mMb66aOpj)(Tv#36V)x70 zT!&dnyn$X>Io3ECP)G)?hEJNB_(4HI@7}#bCn9Rg^#(95z|RCbU92XY&oaIF8+nI8 zd18KAO5cYeoOEh_xeJbREH*t^+^G8`!r^eCD$<%f)%~Pv3ZSUH*(!s9VWNsP;|%Ud zY`_DTbGiS0zDi1YU2J@8)O6Dsb}e!Z57wYRJ`%sHct2V?>ieP3OY9q_Hmr!(%F27k$J-Ku_iy9lq<>gV>x?Zugs^ve-@vtI-W@c3I@bS4_j|p`Do+sWN zyS7IZGaOi>BAV+XlfwSBUUoIJZ=XLnRTn5RcBL+B3(xkVtI`@ATRP%6IKvx?+=^RV zy1!ZE2dv(wU69GgeeEgE7`J3Pyc~Qptaf5?QOd)Er>Ccw+$N2lheMS9{jfRk1&zU(uoRhw%!rDS)O(JC+A z2vFRaSI`nw+MJ{@?&<3}@BSFFw|lsq!-_rM?CB{|P7BCuxi>MI!} zg0ng&CkLcI6AKHU<>lXkBh5_hfZP5I(R+gjBmB{x6X0KNR#DLIu4LQ!C8k+Q@9NW2 zyWL*{@@PS?q;;A0%&CNgl5Y>1@-M_*H(I)XEg_Xg`5y2a#qO?EDs6?aGiF)?-g`SWKz?5PGi zFy`^Mrp}p*pk8JvF|~hX&sha;)*^>f&X9^dySe#hOWu=ouC6deY`~_B zcCHnm80$0pOsb$QAvT7I`D|a{+oF~ON|&CC%XMAck-(j&cMaUN%h>AiiEDH8*rHF- zPSE0!A@>6Z@+&cUpsWA=ZED87)01aav$S*KM3=er*X1OHZpf`w2f6EZ&R(4kOM1%4 z!2v3j$Y6i8z>bK7G%z?w%5Z$$eo-Ejp^1rElD!V^$9#No!7!>_np;wzDG^1m84HKT z#3S$v@b!DRU~bPWXz4en&aPJ|+CV(>y+O4&NO9Wao zMfCVD+vv8uz1w_!u)S)Vh`e&&%Il5t$E8`&Wg>=bkG1}J({jZer$0TTefj3(=g1D> z;^*tu@0rgnJ0DI@@(*|d0s`DxSEBiS9ixIlYPGrfML|JWT)dZXl{Uib!V&bxQur7e zs>;|m@)JDo(#`UEP}4JHd-bW5s?eU=2z8q`C2%DvNGBGQ7?dxJZv2&=}U zlMWE%M@B|6)yX$ZCS99FZ?**zAD%QbA6kwC?;MA!@C0312M7rWv=mzEAO4Pbm*;Yx z%06g>$z_<@jGi?ubMI`sn;03v)-TFfSsfB$y0#N>*(QA@9Vk5S9evNHT~K~T6FE|* zMvvukLPgH{@qGbnIN<9$C%)&jvYGAO6L2?*F^M&|j@-$6hYRY1MUL;;>a=p&_Gm(g z=2~+%7Y*d+K?XygisXJ1pa>MB94}95bzE~x_d?erlUFcbO)NevEX|HoW4MYz5j1yM z65$^W&4Z(q=NmSv@(T*wk7{S_nwRH}GQI07s1W}Z^Mi#94L{b_*7jF_%ce3*!NQrX zCm!f|8C9(>oak1Tvu&+k)ynz zbte{Vd{V%d7pSloOEBgmLIX&4>(v&0g|*s(DlQ=rmzg=XJ(3z0-gI%&^pxQB%XZi8 zYAaq#$Cj1VvBh_t&ij?f;bLq0QJy9M=fZwTmjr8aPTqi(za*nNg=Ewu8HI%%?AlP{ zy7+fBo;w^2TIK7%8>J4ZXw}avo0AG9iFg_k!Ix)gXiB&*J2Fr*8=Bcp3~bY7YUwG? zIu|sr|5%3fU{N(O4wwZ;wf*XoP*GL}(doW1Y_QBo{jZu-lX*&J>g8(Kvduppy|AEx zO33pw+q)DldbN3uhxDVjN#eGK>snA}Wp?ELw#?WF&oGpXUiS0I(2(Z2=fM|izq5$^ zKoc|krt)@BjehK*Y4W`9AC$~#vBGDrC&Q$s4&(FMgehRu%5N$U%TKTbJtFiOn53kg z^EypIBVz8CD9Au=bR?rBr{lhpg~+b^wQf1N+}MF`AHqCMuKPc)EFDTqKE1tm?A<#FT}*ey1Tvp!VZ5Lv;N~c zVtUJY>Av}FdeXMB!Bg?->YA@jFz!c%PCjm>Wbi= zbwbyhSCCg(k^Nmt)w0mmBCEDFZZg|nIo)3IUC`vZutPN~m*Za+<=U(7SVv^ce*>@w zyo@J|b(7)V8X-4qMgFK{o=NjlN8XNCz`gP)`j$D#7FnWNvF^lkLN(tK*B%p|UHS8; zsEkac?z8&*vQ*)at+0ARy(oRQo#iZCnDuH~Iwqy;X~!$HnE3eGe0kkG_U3rFJq(ivOW0a1ro_dMzUo7* zYB1Y5V#T((zkgs(l_ubANNh=?OVQ*lEG_S=+ih1wUoQ5{d!2jpHQ9G|GHl6i=zn?v z5K~X?P2>AEgp`&2{rw9I3;#?=5a(rQ8z@6~-7a3MLu1Jh68Fsx0$V|C6IlOk&7*3HE4@Y#Mrl-+!Gx|2WDlpXI zd_~Welk<@qs8)-Zm>mF8aUQ`@HUxU{t4vyDFY+qIB^ z{{9XljfYO$s0PB}(F|SP--7OxOSDM4yy7Uahkd9m1S+{2`+1-|9rleH$TspD^Q@P3Har|H zPkuMR;f$=mQf&w;KWNZm02GRfntJW5kGP^{_mK=?cn*eB_m5?j<)jWNJ2x!-RUIoi;6aTx+#*m9 zrT$XdfW#^PE(j3d(>cTFD$}uyn=(URL2>n8R!mtN^b_Z^ufP5;+P<=@%JBJGrBML^ zrTfs`DJYF}cXxwyOG!7

%h5cOxa;-QCZ{?_Zzbd7*3RTK9dj^)7&2 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 b4gVPvi|gl1m{#?N0SG)@{an^LB{Ts588CSX diff --git a/sample-apps/java-events-v1sdk/images/java-events-v1sdk-trace.png b/sample-apps/java-events-v1sdk/images/java-events-v1sdk-trace.png deleted file mode 100644 index 4f921833a633c03d8650a218a2b825d702898adf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66756 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 bdFB5=X-7f@_f-ZizCiM_Dl%nK#-INe_z%q5 diff --git a/sample-apps/java-events-v1sdk/pom.xml b/sample-apps/java-events-v1sdk/pom.xml deleted file mode 100644 index 14683a39..00000000 --- a/sample-apps/java-events-v1sdk/pom.xml +++ /dev/null @@ -1,140 +0,0 @@ - - 4.0.0 - com.example - java-events-v1sdk - jar - 1.0-SNAPSHOT - java-events-v1sdk-function - - UTF-8 - 1.8 - 1.8 - - - - com.amazonaws - aws-lambda-java-core - 1.2.1 - - - com.amazonaws - aws-lambda-java-events - 2.2.9 - - - com.amazonaws - aws-lambda-java-log4j2 - 1.5.0 - - - com.google.code.gson - gson - 2.8.9 - - - org.apache.logging.log4j - log4j-api - [2.17.1,) - - - org.apache.logging.log4j - log4j-core - [2.17.1,) - - - org.apache.logging.log4j - log4j-slf4j18-impl - [2.17.1,) - - - com.amazonaws - aws-java-sdk-s3 - 1.12.261 - - - com.amazonaws - aws-java-sdk-kinesis - 1.11.578 - - - com.amazonaws - aws-java-sdk-dynamodb - 1.11.578 - - - com.amazonaws - aws-xray-recorder-sdk-aws-sdk-core - 2.4.0 - - - com.amazonaws - aws-xray-recorder-sdk-aws-sdk - 2.4.0 - - - com.amazonaws - aws-xray-recorder-sdk-aws-sdk-instrumentor - 2.4.0 - - - org.junit.jupiter - junit-jupiter-api - 5.6.0 - test - - - org.junit.jupiter - junit-jupiter-engine - 5.6.0 - test - - - - - - - maven-surefire-plugin - 2.22.2 - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.2 - - false - - - - package - - shade - - - - - - - - - - - - com.github.edwgiz - maven-shade-plugin.log4j2-cachefile-transformer - [2.17.1,) - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 1.8 - 1.8 - - - - - \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/src/main/java/example/Handler.java b/sample-apps/java-events-v1sdk/src/main/java/example/Handler.java deleted file mode 100644 index 6ec8c54d..00000000 --- a/sample-apps/java-events-v1sdk/src/main/java/example/Handler.java +++ /dev/null @@ -1,34 +0,0 @@ -package example; - -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.amazonaws.services.lambda.runtime.events.S3Event; - -import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -// Handler value: example.Handler -public class Handler implements RequestHandler{ - private static final Logger logger = LoggerFactory.getLogger(Handler.class); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - @Override - public String handleRequest(S3Event event, Context context) - { - String response = new String("200 OK"); - S3EventNotificationRecord record = event.getRecords().get(0); - String srcBucket = record.getS3().getBucket().getName(); - // Object key may have spaces or unicode non-ASCII characters. - String srcKey = record.getS3().getObject().getUrlDecodedKey(); - logger.info("RECORD: " + record); - logger.info("SOURCE BUCKET: " + srcBucket); - logger.info("SOURCE KEY: " + srcKey); - // log execution details - Util.logEnvironment(event, context, gson); - return response; - } -} \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/src/main/java/example/HandlerDynamoDB.java b/sample-apps/java-events-v1sdk/src/main/java/example/HandlerDynamoDB.java deleted file mode 100644 index da0c0281..00000000 --- a/sample-apps/java-events-v1sdk/src/main/java/example/HandlerDynamoDB.java +++ /dev/null @@ -1,32 +0,0 @@ -package example; - -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.amazonaws.services.lambda.runtime.events.DynamodbEvent; -import com.amazonaws.services.lambda.runtime.events.DynamodbEvent.DynamodbStreamRecord; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -// Handler value: example.HandlerDynamoDB -public class HandlerDynamoDB implements RequestHandler{ - private static final Logger logger = LoggerFactory.getLogger(HandlerDynamoDB.class); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - @Override - public String handleRequest(DynamodbEvent event, Context context) - { - String response = new String("200 OK"); - for (DynamodbStreamRecord record : event.getRecords()){ - logger.info(record.getEventID()); - logger.info(record.getEventName()); - logger.info(record.getDynamodb().toString()); - } - logger.info("Successfully processed " + event.getRecords().size() + " records."); - // log execution details - Util.logEnvironment(event, context, gson); - return response; - } -} \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/src/main/java/example/HandlerKinesis.java b/sample-apps/java-events-v1sdk/src/main/java/example/HandlerKinesis.java deleted file mode 100644 index e46720df..00000000 --- a/sample-apps/java-events-v1sdk/src/main/java/example/HandlerKinesis.java +++ /dev/null @@ -1,29 +0,0 @@ -package example; - -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.amazonaws.services.lambda.runtime.events.KinesisEvent; -import com.amazonaws.services.lambda.runtime.events.KinesisEvent.KinesisEventRecord; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -// Handler value: example.HandleKinesis -public class HandlerKinesis implements RequestHandler{ - private static final Logger logger = LoggerFactory.getLogger(HandlerKinesis.class); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - @Override - public String handleRequest(KinesisEvent event, Context context) - { - String response = new String("200 OK"); - for(KinesisEventRecord record : event.getRecords()) { - logger.info(gson.toJson(record.getKinesis().getData())); - } - // log execution details - Util.logEnvironment(event, context, gson); - return response; - } -} \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/src/main/java/example/Util.java b/sample-apps/java-events-v1sdk/src/main/java/example/Util.java deleted file mode 100644 index feb7475b..00000000 --- a/sample-apps/java-events-v1sdk/src/main/java/example/Util.java +++ /dev/null @@ -1,22 +0,0 @@ -package example; - -import com.amazonaws.services.lambda.runtime.Context; - -import com.google.gson.Gson; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class Util { - private static final Logger logger = LoggerFactory.getLogger(Util.class); - - public static void logEnvironment(Object event, Context context, Gson gson) - { - // log execution details - logger.info("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv())); - logger.info("CONTEXT: " + gson.toJson(context)); - // log event details - logger.info("EVENT: " + gson.toJson(event)); - logger.info("EVENT TYPE: " + event.getClass().toString()); - } -} \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/src/main/resources/log4j2.xml b/sample-apps/java-events-v1sdk/src/main/resources/log4j2.xml deleted file mode 100644 index 6c830a00..00000000 --- a/sample-apps/java-events-v1sdk/src/main/resources/log4j2.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n - - - - - - - - - - - \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/src/test/java/example/InvokeTest.java b/sample-apps/java-events-v1sdk/src/test/java/example/InvokeTest.java deleted file mode 100644 index 60ed4a8e..00000000 --- a/sample-apps/java-events-v1sdk/src/test/java/example/InvokeTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package example; - -import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; - -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.events.S3Event; -import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord; -import com.amazonaws.services.s3.event.S3EventNotification.RequestParametersEntity; -import com.amazonaws.services.s3.event.S3EventNotification.ResponseElementsEntity; -import com.amazonaws.services.s3.event.S3EventNotification.S3Entity; -import com.amazonaws.services.s3.event.S3EventNotification.UserIdentityEntity; -import com.amazonaws.services.s3.event.S3EventNotification.S3BucketEntity; -import com.amazonaws.services.s3.event.S3EventNotification.S3ObjectEntity; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.lang.Long; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.io.IOException; - -import com.amazonaws.xray.AWSXRay; -import com.amazonaws.xray.AWSXRayRecorderBuilder; -import com.amazonaws.xray.strategy.sampling.NoSamplingStrategy; - -class InvokeTest { - - public InvokeTest() { - AWSXRayRecorderBuilder builder = AWSXRayRecorderBuilder.standard(); - builder.withSamplingStrategy(new NoSamplingStrategy()); - AWSXRay.setGlobalRecorder(builder.build()); - } - - @Test - void invokeTest() throws IOException { - AWSXRay.beginSegment("java-s3-test"); - String bucket = new String(Files.readAllLines(Paths.get("bucket-name.txt")).get(0)); - S3EventNotificationRecord record = new S3EventNotificationRecord("us-east-2", - "ObjectCreated:Put", - "aws:s3", - "2020-03-08T00:30:12.456Z", - "2.1", - new RequestParametersEntity("174.255.255.156"), - new ResponseElementsEntity("nBbLJPAHhdvxmplPvtCgTrWCqf/KtonyV93l9rcoMLeIWJxpS9x9P8u01+Tj0OdbAoGs+VGvEvWl/Sg1NW5uEsVO25Laq7L", "AF2D7AB6002E898D"), - new S3Entity("682bbb7a-xmpl-48ca-94b1-7f77c4d6dbf0", - new S3BucketEntity(bucket, - new UserIdentityEntity("A3XMPLFAF2AI3E"), - "arn:aws:s3:::" + bucket), - new S3ObjectEntity("inbound/sample-java-s3.png", - new Long(21476), - "d132690b6c65b6d1629721dcfb49b883", - "", - "005E64A65DF093B26D"), - "1.0"), - new UserIdentityEntity("AWS:AIDAINPONIXMPLT3IKHL2")); - ArrayList records = new ArrayList(); - records.add(record); - S3Event event = new S3Event(records); - - Context context = new TestContext(); - Handler handler = new Handler(); - String result = handler.handleRequest(event, context); - assertTrue(result.contains("200 OK")); - AWSXRay.endSegment(); - } - -} diff --git a/sample-apps/java-events-v1sdk/src/test/java/example/TestContext.java b/sample-apps/java-events-v1sdk/src/test/java/example/TestContext.java deleted file mode 100644 index 69e0af00..00000000 --- a/sample-apps/java-events-v1sdk/src/test/java/example/TestContext.java +++ /dev/null @@ -1,45 +0,0 @@ -package example; - -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.CognitoIdentity; -import com.amazonaws.services.lambda.runtime.ClientContext; -import com.amazonaws.services.lambda.runtime.LambdaLogger; - -public class TestContext implements Context{ - - public TestContext() {} - public String getAwsRequestId(){ - return new String("495b12a8-xmpl-4eca-8168-160484189f99"); - } - public String getLogGroupName(){ - return new String("/aws/lambda/my-function"); - } - public String getLogStreamName(){ - return new String("2020/02/26/[$LATEST]704f8dxmpla04097b9134246b8438f1a"); - } - public String getFunctionName(){ - return new String("my-function"); - } - public String getFunctionVersion(){ - return new String("$LATEST"); - } - public String getInvokedFunctionArn(){ - return new String("arn:aws:lambda:us-east-2:123456789012:function:my-function"); - } - public CognitoIdentity getIdentity(){ - return null; - } - public ClientContext getClientContext(){ - return null; - } - public int getRemainingTimeInMillis(){ - return 300000; - } - public int getMemoryLimitInMB(){ - return 512; - } - public LambdaLogger getLogger(){ - return new TestLogger(); - } - -} \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/src/test/java/example/TestLogger.java b/sample-apps/java-events-v1sdk/src/test/java/example/TestLogger.java deleted file mode 100644 index 1d3c8efc..00000000 --- a/sample-apps/java-events-v1sdk/src/test/java/example/TestLogger.java +++ /dev/null @@ -1,14 +0,0 @@ -package example; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.amazonaws.services.lambda.runtime.LambdaLogger; - -public class TestLogger implements LambdaLogger { - private static final Logger logger = LoggerFactory.getLogger(TestLogger.class); - public void log(String message){ - logger.info(message); - } - public void log(byte[] message){ - logger.info(new String(message)); - } -} diff --git a/sample-apps/java-events-v1sdk/src/test/resources/log4j2.xml b/sample-apps/java-events-v1sdk/src/test/resources/log4j2.xml deleted file mode 100644 index 3b69545f..00000000 --- a/sample-apps/java-events-v1sdk/src/test/resources/log4j2.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/sample-apps/java-events-v1sdk/template-mvn.yml b/sample-apps/java-events-v1sdk/template-mvn.yml deleted file mode 100644 index 6cabcd01..00000000 --- a/sample-apps/java-events-v1sdk/template-mvn.yml +++ /dev/null @@ -1,20 +0,0 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: 'AWS::Serverless-2016-10-31' -Description: An AWS Lambda application that calls the Lambda API. -Resources: - function: - Type: AWS::Serverless::Function - Properties: - CodeUri: target/java-events-v1sdk-1.0-SNAPSHOT.jar - Handler: example.Handler - Runtime: java8 - Description: Java function - MemorySize: 512 - Timeout: 15 - # Function's execution role - Policies: - - AWSLambdaBasicExecutionRole - - AWSLambda_ReadOnlyAccess - - AWSXrayWriteOnlyAccess - - AWSLambdaVPCAccessExecutionRole - Tracing: Active diff --git a/sample-apps/java-events-v1sdk/template.yml b/sample-apps/java-events-v1sdk/template.yml deleted file mode 100644 index b1f59be5..00000000 --- a/sample-apps/java-events-v1sdk/template.yml +++ /dev/null @@ -1,30 +0,0 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: 'AWS::Serverless-2016-10-31' -Description: An AWS Lambda application that calls the Lambda API. -Resources: - function: - Type: AWS::Serverless::Function - Properties: - CodeUri: build/distributions/java-events-v1sdk.zip - Handler: example.Handler - Runtime: java8 - Description: Java function - MemorySize: 512 - Timeout: 15 - # Function's execution role - Policies: - - AWSLambdaBasicExecutionRole - - AWSLambda_ReadOnlyAccess - - AWSXrayWriteOnlyAccess - - AWSLambdaVPCAccessExecutionRole - Tracing: Active - Layers: - - !Ref libs - libs: - Type: AWS::Serverless::LayerVersion - Properties: - LayerName: java-events-v1sdk-lib - Description: Dependencies for the Java S3 sample app. - ContentUri: build/java-events-v1sdk-lib.zip - CompatibleRuntimes: - - java8 diff --git a/sample-apps/java17-examples/1-create-bucket.sh b/sample-apps/java17-examples/1-create-bucket.sh deleted file mode 100755 index 64a5f749..00000000 --- a/sample-apps/java17-examples/1-create-bucket.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -BUCKET_ID=$(dd if=/dev/random bs=8 count=1 2>/dev/null | od -An -tx1 | tr -d ' \t\n') -BUCKET_NAME=lambda-artifacts-$BUCKET_ID -echo $BUCKET_NAME > bucket-name.txt -aws s3 mb s3://$BUCKET_NAME diff --git a/sample-apps/java17-examples/2-deploy.sh b/sample-apps/java17-examples/2-deploy.sh deleted file mode 100755 index 73723ab9..00000000 --- a/sample-apps/java17-examples/2-deploy.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -set -eo pipefail -ARTIFACT_BUCKET=$(cat bucket-name.txt) -TEMPLATE=template.yml -if [ $1 ] -then - if [ $1 = mvn ] - then - TEMPLATE=template-mvn.yml - mvn package - fi -else - gradle build -i -fi -aws cloudformation package --template-file $TEMPLATE --s3-bucket $ARTIFACT_BUCKET --output-template-file out.yml -aws cloudformation deploy --template-file out.yml --stack-name java17-examples --capabilities CAPABILITY_NAMED_IAM diff --git a/sample-apps/java17-examples/3-invoke.sh b/sample-apps/java17-examples/3-invoke.sh deleted file mode 100755 index 7ff3bf1b..00000000 --- a/sample-apps/java17-examples/3-invoke.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -set -eo pipefail -FUNCTION=$(aws cloudformation describe-stack-resource --stack-name java17-examples --logical-resource-id function --query 'StackResourceDetail.PhysicalResourceId' --output text) -if [ $1 ] -then - case $1 in - string) - PAYLOAD='"MYSTRING"' - ;; - - int | integer) - PAYLOAD=12345 - ;; - - list) - PAYLOAD='[24,25,26]' - ;; - - divide) - PAYLOAD='[235241,17]' - ;; - - *) - echo -n "Unknown event type" - ;; - esac -fi -while true; do - if [ $PAYLOAD ] - then - aws lambda invoke --function-name $FUNCTION --payload $PAYLOAD out.json - else - aws lambda invoke --function-name $FUNCTION --payload fileb://event.json out.json - fi - cat out.json - echo "" - sleep 2 -done diff --git a/sample-apps/java17-examples/4-cleanup.sh b/sample-apps/java17-examples/4-cleanup.sh deleted file mode 100755 index 45bb0df8..00000000 --- a/sample-apps/java17-examples/4-cleanup.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -set -eo pipefail -STACK=java17-examples -if [[ $# -eq 1 ]] ; then - STACK=$1 - echo "Deleting stack $STACK" -fi -FUNCTION=$(aws cloudformation describe-stack-resource --stack-name $STACK --logical-resource-id function --query 'StackResourceDetail.PhysicalResourceId' --output text) -aws cloudformation delete-stack --stack-name $STACK -echo "Deleted $STACK stack." - -if [ -f bucket-name.txt ]; then - ARTIFACT_BUCKET=$(cat bucket-name.txt) - if [[ ! $ARTIFACT_BUCKET =~ lambda-artifacts-[a-z0-9]{16} ]] ; then - echo "Bucket was not created by this application. Skipping." - else - while true; do - read -p "Delete deployment artifacts and bucket ($ARTIFACT_BUCKET)? (y/n)" response - case $response in - [Yy]* ) aws s3 rb --force s3://$ARTIFACT_BUCKET; rm bucket-name.txt; break;; - [Nn]* ) break;; - * ) echo "Response must start with y or n.";; - esac - done - fi -fi - -while true; do - read -p "Delete function log group (/aws/lambda/$FUNCTION)? (y/n)" response - case $response in - [Yy]* ) aws logs delete-log-group --log-group-name /aws/lambda/$FUNCTION; break;; - [Nn]* ) break;; - * ) echo "Response must start with y or n.";; - esac -done - -rm -f out.yml out.json -rm -rf build .gradle target diff --git a/sample-apps/java17-examples/README.md b/sample-apps/java17-examples/README.md deleted file mode 100644 index 9d0ab1ad..00000000 --- a/sample-apps/java17-examples/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# Basic function with minimal dependencies (Java) - -![Architecture](/sample-apps/java-basic/images/sample-java-basic.png) - -The project source includes function code and supporting resources: -- `src/main` - A Java function. -- `src/test` - A unit test and helper classes. -- `template.yml` - An AWS CloudFormation template that creates an application. -- `build.gradle` - A Gradle build file. -- `pom.xml` - A Maven build file. -- `1-create-bucket.sh`, `2-deploy.sh`, etc. - Shell scripts that use the AWS CLI to deploy and manage the application. - -Use the following instructions to deploy the sample application. - -# Requirements -- [Java 17 runtime environment (SE JRE)](https://www.oracle.com/java/technologies/javase-downloads.html) -- [Gradle 5](https://gradle.org/releases/) or [Maven 3](https://maven.apache.org/docs/history.html) -- The Bash shell. For Linux and macOS, this is included by default. In Windows 10, you can install the [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) to get a Windows-integrated version of Ubuntu and Bash. -- [The AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) v1.17 or newer. - -# Setup -Download or clone this repository. - - $ git clone https://github.com/awsdocs/aws-lambda-developer-guide.git - $ cd aws-lambda-developer-guide/sample-apps/java17-examples - -To create a new bucket for deployment artifacts, run `1-create-bucket.sh`. - - java17-examples$ ./1-create-bucket.sh - make_bucket: lambda-artifacts-a5e4xmplb5b22e0d - -# Deploy -To deploy the application, run `2-deploy.sh`. - - java17-examples$ ./2-deploy.sh - BUILD SUCCESSFUL in 1s - Successfully packaged artifacts and wrote output template to file out.yml. - Waiting for changeset to be created.. - Successfully created/updated stack - java17-examples - -This script uses AWS CloudFormation to deploy the Lambda functions and an IAM role. If the AWS CloudFormation stack that contains the resources already exists, the script updates it with any changes to the template or function code. - -You can also build the application with Maven. To use maven, add `mvn` to the command. - - java17-examples$ ./2-deploy.sh mvn - [INFO] Scanning for projects... - [INFO] -----------------------< com.example:java17-examples >----------------------- - [INFO] Building java17-examples-function 1.0-SNAPSHOT - [INFO] --------------------------------[ jar ]--------------------------------- - ... - -# Test -To invoke the function, run `3-invoke.sh`. - - java17-examples$ ./3-invoke.sh - { - "StatusCode": 200, - "ExecutedVersion": "$LATEST" - } - 21 - -Let the script invoke the function a few times and then press `CRTL+C` to exit. - -# Cleanup -To delete the application, run `4-cleanup.sh`. - - java17-examples$ ./4-cleanup.sh diff --git a/sample-apps/java17-examples/build.gradle b/sample-apps/java17-examples/build.gradle deleted file mode 100644 index 6f4b7f25..00000000 --- a/sample-apps/java17-examples/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ -plugins { - id 'java' -} - -repositories { - mavenCentral() -} - -dependencies { - implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' - implementation 'org.slf4j:slf4j-nop:2.0.6' - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' -} - -test { - useJUnitPlatform() -} - -task buildZip(type: Zip) { - from compileJava - from processResources - into('lib') { - from configurations.runtimeClasspath - } -} - -java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 -} - -build.dependsOn buildZip diff --git a/sample-apps/java17-examples/event.json b/sample-apps/java17-examples/event.json deleted file mode 100644 index 8d9c02d0..00000000 --- a/sample-apps/java17-examples/event.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "x": 1, - "y": 20, - "message": "Hello World!" -} diff --git a/sample-apps/java17-examples/pom.xml b/sample-apps/java17-examples/pom.xml deleted file mode 100644 index 73a9fcf7..00000000 --- a/sample-apps/java17-examples/pom.xml +++ /dev/null @@ -1,83 +0,0 @@ - - 4.0.0 - com.example - java17-examples - jar - 1.0-SNAPSHOT - java17-examples-function - - UTF-8 - 17 - 17 - - - - com.amazonaws - aws-lambda-java-core - 1.2.1 - - - org.slf4j - slf4j-nop - 2.0.6 - - - org.junit.jupiter - junit-jupiter-api - 5.8.2 - test - - - org.junit.jupiter - junit-jupiter-engine - 5.8.2 - test - - - - - - - maven-surefire-plugin - 2.22.2 - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.2 - - false - - - *:* - - module-info.class - META-INF/* - META-INF/versions/** - META-INF/services/** - - - - - - - package - - shade - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 17 - 17 - - - - - \ No newline at end of file diff --git a/sample-apps/java17-examples/src/main/java/example/HandlerIntegerJava17.java b/sample-apps/java17-examples/src/main/java/example/HandlerIntegerJava17.java deleted file mode 100644 index c64d4097..00000000 --- a/sample-apps/java17-examples/src/main/java/example/HandlerIntegerJava17.java +++ /dev/null @@ -1,24 +0,0 @@ -package example; - -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.LambdaLogger; -import com.amazonaws.services.lambda.runtime.RequestHandler; - -// Handler value: example.HandlerInteger -public class HandlerIntegerJava17 implements RequestHandler{ - - @Override - /* - * Takes in an InputRecord, which contains two integers and a String. - * Logs the String, then returns the sum of the two Integers. - */ - public Integer handleRequest(IntegerRecord event, Context context) - { - LambdaLogger logger = context.getLogger(); - logger.log("String found: " + event.message()); - return event.x() + event.y(); - } -} - -record IntegerRecord(int x, int y, String message) { -} diff --git a/sample-apps/java17-examples/template-mvn.yml b/sample-apps/java17-examples/template-mvn.yml deleted file mode 100644 index 392f1031..00000000 --- a/sample-apps/java17-examples/template-mvn.yml +++ /dev/null @@ -1,20 +0,0 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: 'AWS::Serverless-2016-10-31' -Description: An AWS Lambda application that calls the Lambda API. -Resources: - function: - Type: AWS::Serverless::Function - Properties: - CodeUri: target/java17-examples-1.0-SNAPSHOT.jar - Handler: example.HandlerIntegerJava17 - Runtime: java17 - Description: Java function - MemorySize: 2048 - Timeout: 10 - # Function's execution role - Policies: - - AWSLambdaBasicExecutionRole - - AWSLambda_ReadOnlyAccess - - AWSXrayWriteOnlyAccess - - AWSLambdaVPCAccessExecutionRole - Tracing: Active diff --git a/sample-apps/java17-examples/template.yml b/sample-apps/java17-examples/template.yml deleted file mode 100644 index 42fc6085..00000000 --- a/sample-apps/java17-examples/template.yml +++ /dev/null @@ -1,20 +0,0 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: 'AWS::Serverless-2016-10-31' -Description: An AWS Lambda application that calls the Lambda API. -Resources: - function: - Type: AWS::Serverless::Function - Properties: - CodeUri: build/distributions/java17-examples.zip - Handler: example.HandlerIntegerJava17 - Runtime: java17 - Description: Java function - MemorySize: 2048 - Timeout: 10 - # Function's execution role - Policies: - - AWSLambdaBasicExecutionRole - - AWSLambda_ReadOnlyAccess - - AWSXrayWriteOnlyAccess - - AWSLambdaVPCAccessExecutionRole - Tracing: Active From c5d6eb753b44046e1d0880b2713018de6f0205da Mon Sep 17 00:00:00 2001 From: Alexander Yu Date: Mon, 24 Feb 2025 16:00:10 -0800 Subject: [PATCH 14/15] Add C# receipt handler example in example-csharp --- .../ExampleCS/src/ExampleCS/ExampleCS.csproj | 18 +++++ .../ExampleCS/src/ExampleCS/Function.cs | 68 +++++++++++++++++++ .../ExampleCS/src/ExampleCS/Readme.md | 49 +++++++++++++ .../ExampleCS/aws-lambda-tools-defaults.json | 16 +++++ .../ExampleCS.Tests/ExampleCS.Tests.csproj | 18 +++++ .../test/ExampleCS.Tests/FunctionTest.cs | 20 ++++++ 6 files changed, 189 insertions(+) create mode 100644 sample-apps/example-csharp/ExampleCS/src/ExampleCS/ExampleCS.csproj create mode 100644 sample-apps/example-csharp/ExampleCS/src/ExampleCS/Function.cs create mode 100644 sample-apps/example-csharp/ExampleCS/src/ExampleCS/Readme.md create mode 100644 sample-apps/example-csharp/ExampleCS/src/ExampleCS/aws-lambda-tools-defaults.json create mode 100644 sample-apps/example-csharp/ExampleCS/test/ExampleCS.Tests/ExampleCS.Tests.csproj create mode 100644 sample-apps/example-csharp/ExampleCS/test/ExampleCS.Tests/FunctionTest.cs diff --git a/sample-apps/example-csharp/ExampleCS/src/ExampleCS/ExampleCS.csproj b/sample-apps/example-csharp/ExampleCS/src/ExampleCS/ExampleCS.csproj new file mode 100644 index 00000000..a57cd339 --- /dev/null +++ b/sample-apps/example-csharp/ExampleCS/src/ExampleCS/ExampleCS.csproj @@ -0,0 +1,18 @@ + + + net8.0 + enable + enable + true + Lambda + + true + + true + + + + + + + \ No newline at end of file diff --git a/sample-apps/example-csharp/ExampleCS/src/ExampleCS/Function.cs b/sample-apps/example-csharp/ExampleCS/src/ExampleCS/Function.cs new file mode 100644 index 00000000..b1142dba --- /dev/null +++ b/sample-apps/example-csharp/ExampleCS/src/ExampleCS/Function.cs @@ -0,0 +1,68 @@ +using System; +using System.Text; +using System.Threading.Tasks; +using Amazon.Lambda.Core; +using Amazon.S3; +using Amazon.S3.Model; + +// Assembly attribute to enable Lambda function logging +[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] + +namespace ExampleLambda; + +public class Order +{ + public string OrderId { get; set; } = string.Empty; + public double Amount { get; set; } + public string Item { get; set; } = string.Empty; +} + +public class OrderHandler +{ + private static readonly AmazonS3Client s3Client = new(); + + public async Task HandleRequest(Order order, ILambdaContext context) + { + try + { + string? bucketName = Environment.GetEnvironmentVariable("RECEIPT_BUCKET"); + if (string.IsNullOrWhiteSpace(bucketName)) + { + throw new ArgumentException("RECEIPT_BUCKET environment variable is not set"); + } + + string receiptContent = $"OrderID: {order.OrderId}\nAmount: ${order.Amount:F2}\nItem: {order.Item}"; + string key = $"receipts/{order.OrderId}.txt"; + + await UploadReceiptToS3(bucketName, key, receiptContent); + + context.Logger.LogInformation($"Successfully processed order {order.OrderId} and stored receipt in S3 bucket {bucketName}"); + return "Success"; + } + catch (Exception ex) + { + context.Logger.LogError($"Failed to process order: {ex.Message}"); + throw; + } + } + + private async Task UploadReceiptToS3(string bucketName, string key, string receiptContent) + { + try + { + var putRequest = new PutObjectRequest + { + BucketName = bucketName, + Key = key, + ContentBody = receiptContent, + ContentType = "text/plain" + }; + + await s3Client.PutObjectAsync(putRequest); + } + catch (AmazonS3Exception ex) + { + throw new Exception($"Failed to upload receipt to S3: {ex.Message}", ex); + } + } +} diff --git a/sample-apps/example-csharp/ExampleCS/src/ExampleCS/Readme.md b/sample-apps/example-csharp/ExampleCS/src/ExampleCS/Readme.md new file mode 100644 index 00000000..422393ec --- /dev/null +++ b/sample-apps/example-csharp/ExampleCS/src/ExampleCS/Readme.md @@ -0,0 +1,49 @@ +# AWS Lambda Empty Function Project + +This starter project consists of: +* Function.cs - class file containing a class with a single function handler method +* aws-lambda-tools-defaults.json - default argument settings for use with Visual Studio and command line deployment tools for AWS + +You may also have a test project depending on the options selected. + +The generated function handler is a simple method accepting a string argument that returns the uppercase equivalent of the input string. Replace the body of this method, and parameters, to suit your needs. + +## Here are some steps to follow from Visual Studio: + +To deploy your function to AWS Lambda, right click the project in Solution Explorer and select *Publish to AWS Lambda*. + +To view your deployed function open its Function View window by double-clicking the function name shown beneath the AWS Lambda node in the AWS Explorer tree. + +To perform testing against your deployed function use the Test Invoke tab in the opened Function View window. + +To configure event sources for your deployed function, for example to have your function invoked when an object is created in an Amazon S3 bucket, use the Event Sources tab in the opened Function View window. + +To update the runtime configuration of your deployed function use the Configuration tab in the opened Function View window. + +To view execution logs of invocations of your function use the Logs tab in the opened Function View window. + +## Here are some steps to follow to get started from the command line: + +Once you have edited your template and code you can deploy your application using the [Amazon.Lambda.Tools Global Tool](https://github.com/aws/aws-extensions-for-dotnet-cli#aws-lambda-amazonlambdatools) from the command line. + +Install Amazon.Lambda.Tools Global Tools if not already installed. +``` + dotnet tool install -g Amazon.Lambda.Tools +``` + +If already installed check if new version is available. +``` + dotnet tool update -g Amazon.Lambda.Tools +``` + +Execute unit tests +``` + cd "ExampleCS/test/ExampleCS.Tests" + dotnet test +``` + +Deploy function to AWS Lambda +``` + cd "ExampleCS/src/ExampleCS" + dotnet lambda deploy-function +``` diff --git a/sample-apps/example-csharp/ExampleCS/src/ExampleCS/aws-lambda-tools-defaults.json b/sample-apps/example-csharp/ExampleCS/src/ExampleCS/aws-lambda-tools-defaults.json new file mode 100644 index 00000000..a9757798 --- /dev/null +++ b/sample-apps/example-csharp/ExampleCS/src/ExampleCS/aws-lambda-tools-defaults.json @@ -0,0 +1,16 @@ +{ + "Information": [ + "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", + "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", + "dotnet lambda help", + "All the command line options for the Lambda command can be specified in this file." + ], + "profile": "default", + "region": "us-east-1", + "configuration": "Release", + "function-architecture": "x86_64", + "function-runtime": "dotnet8", + "function-memory-size": 512, + "function-timeout": 30, + "function-handler": "ExampleCS::ExampleLambda.OrderHandler::HandleRequest" +} \ No newline at end of file diff --git a/sample-apps/example-csharp/ExampleCS/test/ExampleCS.Tests/ExampleCS.Tests.csproj b/sample-apps/example-csharp/ExampleCS/test/ExampleCS.Tests/ExampleCS.Tests.csproj new file mode 100644 index 00000000..4aa7182a --- /dev/null +++ b/sample-apps/example-csharp/ExampleCS/test/ExampleCS.Tests/ExampleCS.Tests.csproj @@ -0,0 +1,18 @@ + + + net8.0 + enable + enable + true + + + + + + + + + + + + \ No newline at end of file diff --git a/sample-apps/example-csharp/ExampleCS/test/ExampleCS.Tests/FunctionTest.cs b/sample-apps/example-csharp/ExampleCS/test/ExampleCS.Tests/FunctionTest.cs new file mode 100644 index 00000000..07640759 --- /dev/null +++ b/sample-apps/example-csharp/ExampleCS/test/ExampleCS.Tests/FunctionTest.cs @@ -0,0 +1,20 @@ +using Xunit; +using Amazon.Lambda.Core; +using Amazon.Lambda.TestUtilities; + +namespace ExampleCS.Tests; + +public class FunctionTest +{ + [Fact] + public void TestToUpperFunction() + { + + // Invoke the lambda function and confirm the string was upper cased. + var function = new Function(); + var context = new TestLambdaContext(); + var upperCase = function.FunctionHandler("hello world", context); + + Assert.Equal("HELLO WORLD", upperCase); + } +} From 74236c7fb215515cce5bae86bf1ff06d6a6e82a2 Mon Sep 17 00:00:00 2001 From: Alexander Yu Date: Mon, 17 Mar 2025 11:51:06 -0700 Subject: [PATCH 15/15] Update layer-python app to use Python3.13 --- sample-apps/layer-python/layer/1-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample-apps/layer-python/layer/1-install.sh b/sample-apps/layer-python/layer/1-install.sh index 97f79f97..c9d93b81 100755 --- a/sample-apps/layer-python/layer/1-install.sh +++ b/sample-apps/layer-python/layer/1-install.sh @@ -1,3 +1,3 @@ -python3.11 -m venv create_layer +python3.13 -m venv create_layer source create_layer/bin/activate pip install -r requirements.txt