diff --git a/aws-lambda/pom.xml b/aws-lambda/pom.xml
new file mode 100644
index 0000000000..878e4db109
--- /dev/null
+++ b/aws-lambda/pom.xml
@@ -0,0 +1,99 @@
+
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+
+ com.baeldung
+ aws-lambda
+ 0.1.0-SNAPSHOT
+ jar
+ aws-lambda
+
+
+
+
+ com.amazonaws
+ aws-java-sdk-dynamodb
+ 1.11.241
+
+
+ com.amazonaws
+ aws-java-sdk-core
+ 1.11.241
+
+
+ com.amazonaws
+ aws-lambda-java-core
+ ${aws-lambda-java-core.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ com.amazonaws
+ aws-lambda-java-events
+ ${aws-lambda-java-events.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ com.google.code.gson
+ gson
+ ${gson.version}
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+ com.googlecode.json-simple
+ json-simple
+ ${json-simple.version}
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ ${maven-shade-plugin.version}
+
+ false
+
+
+
+ package
+
+ shade
+
+
+
+
+
+
+
+ 1.1.1
+ 20180130
+ 2.5
+ 1.3.0
+ 1.2.0
+ 2.8.2
+ 1.11.241
+ 3.0.0
+ 2.10
+
+
\ No newline at end of file
diff --git a/aws/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java b/aws-lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java
rename to aws-lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java
diff --git a/aws/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java b/aws-lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java
rename to aws-lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java
diff --git a/aws/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java b/aws-lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java
rename to aws-lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java
diff --git a/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java b/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java
new file mode 100644
index 0000000000..328915c028
--- /dev/null
+++ b/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java
@@ -0,0 +1,166 @@
+package com.baeldung.lambda.apigateway;
+
+import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
+import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
+import com.amazonaws.services.dynamodbv2.document.*;
+import com.amazonaws.services.dynamodbv2.document.spec.PutItemSpec;
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
+import com.baeldung.lambda.apigateway.model.Person;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+
+import java.io.*;
+
+public class APIDemoHandler implements RequestStreamHandler {
+
+ private JSONParser parser = new JSONParser();
+ private static final String DYNAMODB_TABLE_NAME = System.getenv("TABLE_NAME");
+
+ @Override
+ public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
+
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+ JSONObject responseJson = new JSONObject();
+
+ AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient();
+ DynamoDB dynamoDb = new DynamoDB(client);
+
+ try {
+ JSONObject event = (JSONObject) parser.parse(reader);
+
+ if (event.get("body") != null) {
+
+ Person person = new Person((String) event.get("body"));
+
+ dynamoDb.getTable(DYNAMODB_TABLE_NAME)
+ .putItem(new PutItemSpec().withItem(new Item().withNumber("id", person.getId())
+ .withString("firstName", person.getFirstName())
+ .withString("lastName", person.getLastName()).withNumber("age", person.getAge())
+ .withString("address", person.getAddress())));
+ }
+
+ JSONObject responseBody = new JSONObject();
+ responseBody.put("message", "New item created");
+
+ JSONObject headerJson = new JSONObject();
+ headerJson.put("x-custom-header", "my custom header value");
+
+ responseJson.put("statusCode", 200);
+ responseJson.put("headers", headerJson);
+ responseJson.put("body", responseBody.toString());
+
+ } catch (ParseException pex) {
+ responseJson.put("statusCode", 400);
+ responseJson.put("exception", pex);
+ }
+
+ OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");
+ writer.write(responseJson.toString());
+ writer.close();
+ }
+
+ public void handleGetByPathParam(InputStream inputStream, OutputStream outputStream, Context context)
+ throws IOException {
+
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+ JSONObject responseJson = new JSONObject();
+
+ AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient();
+ DynamoDB dynamoDb = new DynamoDB(client);
+
+ Item result = null;
+ try {
+ JSONObject event = (JSONObject) parser.parse(reader);
+ JSONObject responseBody = new JSONObject();
+
+ if (event.get("pathParameters") != null) {
+
+ JSONObject pps = (JSONObject) event.get("pathParameters");
+ if (pps.get("id") != null) {
+
+ int id = Integer.parseInt((String) pps.get("id"));
+ result = dynamoDb.getTable(DYNAMODB_TABLE_NAME).getItem("id", id);
+ }
+
+ }
+ if (result != null) {
+
+ Person person = new Person(result.toJSON());
+ responseBody.put("Person", person);
+ responseJson.put("statusCode", 200);
+ } else {
+
+ responseBody.put("message", "No item found");
+ responseJson.put("statusCode", 404);
+ }
+
+ JSONObject headerJson = new JSONObject();
+ headerJson.put("x-custom-header", "my custom header value");
+
+ responseJson.put("headers", headerJson);
+ responseJson.put("body", responseBody.toString());
+
+ } catch (ParseException pex) {
+ responseJson.put("statusCode", 400);
+ responseJson.put("exception", pex);
+ }
+
+ OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");
+ writer.write(responseJson.toString());
+ writer.close();
+ }
+
+ public void handleGetByQueryParam(InputStream inputStream, OutputStream outputStream, Context context)
+ throws IOException {
+
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+ JSONObject responseJson = new JSONObject();
+
+ AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient();
+ DynamoDB dynamoDb = new DynamoDB(client);
+
+ Item result = null;
+ try {
+ JSONObject event = (JSONObject) parser.parse(reader);
+ JSONObject responseBody = new JSONObject();
+
+ if (event.get("queryStringParameters") != null) {
+
+ JSONObject qps = (JSONObject) event.get("queryStringParameters");
+ if (qps.get("id") != null) {
+
+ int id = Integer.parseInt((String) qps.get("id"));
+ result = dynamoDb.getTable(DYNAMODB_TABLE_NAME).getItem("id", id);
+ }
+ }
+
+ if (result != null) {
+
+ Person person = new Person(result.toJSON());
+ responseBody.put("Person", person);
+ responseJson.put("statusCode", 200);
+ } else {
+
+ responseBody.put("message", "No item found");
+ responseJson.put("statusCode", 404);
+ }
+
+ JSONObject headerJson = new JSONObject();
+ headerJson.put("x-custom-header", "my custom header value");
+
+ responseJson.put("headers", headerJson);
+ responseJson.put("body", responseBody.toString());
+
+ } catch (ParseException pex) {
+ responseJson.put("statusCode", 400);
+ responseJson.put("exception", pex);
+ }
+
+ OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");
+ writer.write(responseJson.toString());
+ writer.close();
+ }
+
+}
diff --git a/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java b/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java
new file mode 100644
index 0000000000..3be7b261cd
--- /dev/null
+++ b/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java
@@ -0,0 +1,68 @@
+package com.baeldung.lambda.apigateway.model;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+public class Person {
+
+ private int id;
+ private String firstName;
+ private String lastName;
+ private int age;
+ private String address;
+
+ public Person(String json) {
+ Gson gson = new Gson();
+ Person request = gson.fromJson(json, Person.class);
+ this.id = request.getId();
+ this.firstName = request.getFirstName();
+ this.lastName = request.getLastName();
+ this.age = request.getAge();
+ this.address = request.getAddress();
+ }
+
+ public String toString() {
+ final Gson gson = new GsonBuilder().setPrettyPrinting().create();
+ return gson.toJson(this);
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+}
diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java b/aws-lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java
rename to aws-lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java
diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java b/aws-lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java
rename to aws-lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java
diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java b/aws-lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java
similarity index 100%
rename from aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java
rename to aws-lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java
diff --git a/pom.xml b/pom.xml
index 39419ec035..edb60f0fac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,6 +18,7 @@
atomix
apache-cayenne
aws
+ aws-lambda
akka-streams
algorithms
annotations