diff --git a/sample-apps/blank-java/build.gradle b/sample-apps/blank-java/build.gradle index f5c3aa9e..77ecd978 100644 --- a/sample-apps/blank-java/build.gradle +++ b/sample-apps/blank-java/build.gradle @@ -7,22 +7,16 @@ repositories { } dependencies { - implementation platform('software.amazon.awssdk:bom:2.10.73') + implementation platform('software.amazon.awssdk:bom:2.10.72') implementation platform('com.amazonaws:aws-xray-recorder-sdk-bom:2.4.0') implementation 'software.amazon.awssdk:lambda' implementation 'com.amazonaws:aws-xray-recorder-sdk-core' - implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-core' - implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2' - implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2-instrumentor' implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' implementation 'com.amazonaws:aws-lambda-java-events:2.2.9' - implementation 'org.apache.logging.log4j:log4j-api:[2.17.1,)' - implementation 'org.apache.logging.log4j:log4j-core:[2.17.1,)' - runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:[2.17.1,)' - runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.5.0' + implementation 'org.slf4j:slf4j-nop:2.0.6' testImplementation 'com.amazonaws:aws-lambda-java-tests:1.1.1' - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' } test { @@ -53,8 +47,8 @@ task packageSkinny(type: Zip) { } java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } build.dependsOn packageSkinny diff --git a/sample-apps/blank-java/pom.xml b/sample-apps/blank-java/pom.xml index 3b8bb0f7..fee37587 100644 --- a/sample-apps/blank-java/pom.xml +++ b/sample-apps/blank-java/pom.xml @@ -8,8 +8,8 @@ blank-java-function UTF-8 - 1.8 - 1.8 + 11 + 11 @@ -23,24 +23,9 @@ 2.2.9 - com.amazonaws - aws-lambda-java-log4j2 - 1.5.0 - - - 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,) + org.slf4j + slf4j-nop + 2.0.6 software.amazon.awssdk @@ -52,31 +37,16 @@ aws-xray-recorder-sdk-core 2.4.0 - - com.amazonaws - aws-xray-recorder-sdk-aws-sdk-core - 2.4.0 - - - com.amazonaws - aws-xray-recorder-sdk-aws-sdk-v2 - 2.4.0 - - - com.amazonaws - aws-xray-recorder-sdk-aws-sdk-v2-instrumentor - 2.4.0 - org.junit.jupiter junit-jupiter-api - 5.6.0 + 5.8.2 test org.junit.jupiter junit-jupiter-engine - 5.6.0 + 5.8.2 test @@ -99,6 +69,17 @@ 3.2.2 false + + + *:* + + module-info.class + META-INF/* + META-INF/versions/** + META-INF/services/** + + + @@ -106,29 +87,16 @@ 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 + 11 + 11 diff --git a/sample-apps/blank-java/src/main/java/example/Handler.java b/sample-apps/blank-java/src/main/java/example/Handler.java index e7afe6d1..296b5eff 100644 --- a/sample-apps/blank-java/src/main/java/example/Handler.java +++ b/sample-apps/blank-java/src/main/java/example/Handler.java @@ -1,13 +1,11 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import software.amazon.awssdk.services.lambda.LambdaClient; import software.amazon.awssdk.services.lambda.model.GetAccountSettingsResponse; import software.amazon.awssdk.services.lambda.model.LambdaException; @@ -15,20 +13,19 @@ // Handler value: example.Handler public class Handler implements RequestHandler, String> { - private static final Logger logger = LoggerFactory.getLogger(Handler.class); private static final LambdaClient lambdaClient = LambdaClient.builder().build(); @Override public String handleRequest(Map event, Context context) { - logger.info("ENVIRONMENT VARIABLES: " + System.getenv()); - logger.info("EVENT: " + event); + LambdaLogger logger = context.getLogger(); + logger.log("Handler invoked"); GetAccountSettingsResponse response = null; try { response = lambdaClient.getAccountSettings(); } catch(LambdaException e) { - System.err.println(e.getMessage()); + logger.log(e.getMessage()); } return response != null ? "Total code size for your account is " + response.accountLimit().totalCodeSize() + " bytes" : "Error"; } diff --git a/sample-apps/blank-java/src/main/resources/log4j2.xml b/sample-apps/blank-java/src/main/resources/log4j2.xml deleted file mode 100644 index b9a6c317..00000000 --- a/sample-apps/blank-java/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/blank-java/template-mvn.yml b/sample-apps/blank-java/template-mvn.yml index a2c3d5d6..3e058e55 100644 --- a/sample-apps/blank-java/template-mvn.yml +++ b/sample-apps/blank-java/template-mvn.yml @@ -7,9 +7,9 @@ Resources: Properties: CodeUri: target/blank-java-1.0-SNAPSHOT.jar Handler: example.Handler::handleRequest - Runtime: java8 + Runtime: java11 Description: Java function - MemorySize: 512 + MemorySize: 2048 Timeout: 10 # Function's execution role Policies: @@ -18,3 +18,13 @@ Resources: - AWSXrayWriteOnlyAccess - AWSLambdaVPCAccessExecutionRole Tracing: Active + Layers: + - !Ref libs + libs: + Type: AWS::Serverless::LayerVersion + Properties: + LayerName: blank-java-lib + Description: Dependencies for the blank-java sample app. + ContentUri: build/blank-java-lib.zip + CompatibleRuntimes: + - java11 \ No newline at end of file diff --git a/sample-apps/blank-java/template.yml b/sample-apps/blank-java/template.yml index 748d3b7e..6e43d190 100644 --- a/sample-apps/blank-java/template.yml +++ b/sample-apps/blank-java/template.yml @@ -7,9 +7,9 @@ Resources: Properties: CodeUri: build/distributions/blank-java.zip Handler: example.Handler::handleRequest - Runtime: java8 + Runtime: java11 Description: Java function - MemorySize: 512 + MemorySize: 2048 Timeout: 10 # Function's execution role Policies: @@ -27,4 +27,4 @@ Resources: Description: Dependencies for the blank-java sample app. ContentUri: build/blank-java-lib.zip CompatibleRuntimes: - - java8 \ No newline at end of file + - java11 \ No newline at end of file diff --git a/sample-apps/java-basic/README.md b/sample-apps/java-basic/README.md index 2eac0425..7013c37d 100644 --- a/sample-apps/java-basic/README.md +++ b/sample-apps/java-basic/README.md @@ -95,7 +95,7 @@ To use a different handler, change the value of the Handler setting in the appli CodeUri: build/distributions/java-basic.zip Handler: example.HandlerList -Deploy the change, and then use the invoke script to test the new configuration. For handlers, that don't take a JSON object as input, pass the type (`string`, `int` or `list`) as an argument to the invoke script. +Deploy the change, and then use the invoke script to test the new configuration. For handlers, that don't take a JSON object as input, pass the type (`string`, `int`, `list`, or `divide`) as an argument to the invoke script. ./3-invoke.sh list { diff --git a/sample-apps/java-basic/build.gradle b/sample-apps/java-basic/build.gradle index f2688f40..d0cbba47 100644 --- a/sample-apps/java-basic/build.gradle +++ b/sample-apps/java-basic/build.gradle @@ -8,11 +8,9 @@ repositories { dependencies { implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' - testImplementation 'org.apache.logging.log4j:log4j-api:[2.17.1,)' - testImplementation 'org.apache.logging.log4j:log4j-core:[2.17.1,)' - testImplementation 'org.apache.logging.log4j:log4j-slf4j18-impl:[2.17.1,)' - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0' + 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 { @@ -28,8 +26,8 @@ task buildZip(type: Zip) { } java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } build.dependsOn buildZip diff --git a/sample-apps/java-basic/pom.xml b/sample-apps/java-basic/pom.xml index 4e280a67..a762955f 100644 --- a/sample-apps/java-basic/pom.xml +++ b/sample-apps/java-basic/pom.xml @@ -8,8 +8,8 @@ java-basic-function UTF-8 - 1.8 - 1.8 + 11 + 11 @@ -18,35 +18,22 @@ 1.2.1 - org.apache.logging.log4j - log4j-api - [2.17.1,) - test + org.slf4j + slf4j-nop + 2.0.6 - org.apache.logging.log4j - log4j-core - [2.17.1,) - test - - - org.apache.logging.log4j - log4j-slf4j18-impl - [2.17.1,) - test - - org.junit.jupiter junit-jupiter-api - 5.6.0 + 5.8.2 test - - + + org.junit.jupiter junit-jupiter-engine - 5.6.0 + 5.8.2 test - + @@ -61,6 +48,17 @@ 3.2.2 false + + + *:* + + module-info.class + META-INF/* + META-INF/versions/** + META-INF/services/** + + + @@ -76,8 +74,8 @@ maven-compiler-plugin 3.8.1 - 1.8 - 1.8 + 11 + 11 diff --git a/sample-apps/java-basic/src/main/java/example/Handler.java b/sample-apps/java-basic/src/main/java/example/Handler.java index f8b3ea81..5bb2090e 100644 --- a/sample-apps/java-basic/src/main/java/example/Handler.java +++ b/sample-apps/java-basic/src/main/java/example/Handler.java @@ -1,8 +1,8 @@ package example; import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.LambdaLogger; +import com.amazonaws.services.lambda.runtime.RequestHandler; import java.util.Map; @@ -13,8 +13,6 @@ public class Handler implements RequestHandler, Void>{ public Void handleRequest(Map event, Context context) { LambdaLogger logger = context.getLogger(); - logger.log("ENVIRONMENT VARIABLES: " + System.getenv()); - logger.log("EVENT: " + event); logger.log("EVENT TYPE: " + event.getClass()); return null; } diff --git a/sample-apps/java-basic/src/main/java/example/HandlerDivide.java b/sample-apps/java-basic/src/main/java/example/HandlerDivide.java index e70f2b90..1498b612 100644 --- a/sample-apps/java-basic/src/main/java/example/HandlerDivide.java +++ b/sample-apps/java-basic/src/main/java/example/HandlerDivide.java @@ -1,14 +1,16 @@ package example; import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.LambdaLogger; +import com.amazonaws.services.lambda.runtime.RequestHandler; import java.util.List; // Handler value: example.HandlerDivide public class HandlerDivide implements RequestHandler, Integer>{ - + /* + * Takes a list of two integers and divides them. + */ @Override public Integer handleRequest(List event, Context context) { diff --git a/sample-apps/java-basic/src/main/java/example/HandlerInteger.java b/sample-apps/java-basic/src/main/java/example/HandlerInteger.java index 1bff73d5..8cac870f 100644 --- a/sample-apps/java-basic/src/main/java/example/HandlerInteger.java +++ b/sample-apps/java-basic/src/main/java/example/HandlerInteger.java @@ -1,18 +1,20 @@ package example; import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.LambdaLogger; +import com.amazonaws.services.lambda.runtime.RequestHandler; // Handler value: example.HandlerInteger public class HandlerInteger implements RequestHandler{ @Override + /* + * Takes an Integer as input, adds 1, and returns it. + */ public Integer handleRequest(Integer event, Context context) { LambdaLogger logger = context.getLogger(); - logger.log("EVENT: " + event); logger.log("EVENT TYPE: " + event.getClass().toString()); - return context.getRemainingTimeInMillis(); + return event + 1; } } \ No newline at end of file diff --git a/sample-apps/java-basic/src/main/java/example/HandlerList.java b/sample-apps/java-basic/src/main/java/example/HandlerList.java index 8721cfbf..d5b05884 100644 --- a/sample-apps/java-basic/src/main/java/example/HandlerList.java +++ b/sample-apps/java-basic/src/main/java/example/HandlerList.java @@ -1,8 +1,8 @@ package example; import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.LambdaLogger; +import com.amazonaws.services.lambda.runtime.RequestHandler; import java.util.List; @@ -10,11 +10,13 @@ public class HandlerList implements RequestHandler, Integer>{ @Override + /* + * Takes a list of Integers and returns its sum. + */ public Integer handleRequest(List event, Context context) { LambdaLogger logger = context.getLogger(); - logger.log("EVENT: " + event); logger.log("EVENT TYPE: " + event.getClass().toString()); - return context.getRemainingTimeInMillis() ; + return event.stream().mapToInt(Integer::intValue).sum(); } } \ No newline at end of file diff --git a/sample-apps/java-basic/src/main/java/example/HandlerStream.java b/sample-apps/java-basic/src/main/java/example/HandlerStream.java index c106dabe..e8006c8b 100644 --- a/sample-apps/java-basic/src/main/java/example/HandlerStream.java +++ b/sample-apps/java-basic/src/main/java/example/HandlerStream.java @@ -1,6 +1,7 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; import java.io.InputStream; @@ -11,8 +12,13 @@ public class HandlerStream implements RequestStreamHandler { @Override + /* + * Takes an InputStream and an OutputStream. Reads from the InputStream, + * and copies all characters to the OutputStream. + */ public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { + LambdaLogger logger = context.getLogger(); int nextChar; try { while ((nextChar = inputStream.read()) != -1) { @@ -23,7 +29,7 @@ public void handleRequest(InputStream inputStream, OutputStream outputStream, Co } finally { inputStream.close(); String finalString = outputStream.toString(); - System.out.println(finalString); + logger.log("Final string result: " + finalString); outputStream.close(); } } diff --git a/sample-apps/java-basic/src/main/java/example/HandlerString.java b/sample-apps/java-basic/src/main/java/example/HandlerString.java index ae329af6..029bbc9c 100644 --- a/sample-apps/java-basic/src/main/java/example/HandlerString.java +++ b/sample-apps/java-basic/src/main/java/example/HandlerString.java @@ -1,18 +1,20 @@ package example; import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.LambdaLogger; +import com.amazonaws.services.lambda.runtime.RequestHandler; // Handler value: example.HandlerString -public class HandlerString implements RequestHandler{ +public class HandlerString implements RequestHandler{ @Override - public Integer handleRequest(String event, Context context) + /* + * Takes a String as input, and converts all characters to lowercase. + */ + public String handleRequest(String event, Context context) { LambdaLogger logger = context.getLogger(); - logger.log("EVENT: " + event); logger.log("EVENT TYPE: " + event.getClass().toString()); - return context.getRemainingTimeInMillis(); + return event.toLowerCase(); } } \ No newline at end of file diff --git a/sample-apps/java-basic/src/main/java/example/HandlerWeatherData.java b/sample-apps/java-basic/src/main/java/example/HandlerWeatherData.java index fb250b36..06f1ca7a 100644 --- a/sample-apps/java-basic/src/main/java/example/HandlerWeatherData.java +++ b/sample-apps/java-basic/src/main/java/example/HandlerWeatherData.java @@ -1,18 +1,27 @@ package example; import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.LambdaLogger; +import com.amazonaws.services.lambda.runtime.RequestHandler; // Handler value: example.HandlerWeatherData public class HandlerWeatherData implements RequestHandler{ @Override + /* + * Takes in a WeatherData event object and updates its attributes with dummy values. + * Returns the updated WeatherData object. + */ public WeatherData handleRequest(WeatherData event, Context context) { LambdaLogger logger = context.getLogger(); - logger.log("EVENT: " + event); logger.log("EVENT TYPE: " + event.getClass().toString()); + + event.setHumidityPct(50.5); + event.setPressureHPa(1005); + event.setWindKmh(28); + // Assumes temperature of event is already set + event.setTemperatureK(event.getTemperatureK() + 2); return event; } } \ No newline at end of file diff --git a/sample-apps/java-basic/src/main/java/example/InputLengthException.java b/sample-apps/java-basic/src/main/java/example/InputLengthException.java index 6dea47c2..ee62bb9c 100644 --- a/sample-apps/java-basic/src/main/java/example/InputLengthException.java +++ b/sample-apps/java-basic/src/main/java/example/InputLengthException.java @@ -6,4 +6,4 @@ public class InputLengthException extends RuntimeException { public InputLengthException(String errorMessage) { super(errorMessage); } -} \ No newline at end of file +} diff --git a/sample-apps/java-basic/src/test/java/example/InvokeTest.java b/sample-apps/java-basic/src/test/java/example/InvokeTest.java index fccbf910..23d079df 100644 --- a/sample-apps/java-basic/src/test/java/example/InvokeTest.java +++ b/sample-apps/java-basic/src/test/java/example/InvokeTest.java @@ -1,6 +1,9 @@ package example; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import org.junit.jupiter.api.Test; import com.amazonaws.services.lambda.runtime.Context; @@ -8,19 +11,88 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.HashMap; +import java.util.List; class InvokeTest { private static final Logger logger = LoggerFactory.getLogger(InvokeTest.class); @Test - void invokeTest() { - logger.info("Invoke TEST"); - HashMap event = new HashMap(); + void testHandler() { + logger.info("Invoke TEST - Handler"); + var event = new HashMap(); Context context = new TestContext(); Handler handler = new Handler(); - String result = handler.handleRequest(event, context); - assertTrue(result.contains("200 OK")); + assertNull(handler.handleRequest(event, context)); } + @Test + void testHandlerDivide() { + logger.info("Invoke TEST - HandlerDivide"); + var event = List.of(20, 5); + Context context = new TestContext(); + HandlerDivide handler = new HandlerDivide(); + assertEquals(4, handler.handleRequest(event, context)); + } + + @Test + void testHandlerInteger() { + logger.info("Invoke TEST - HandlerInteger"); + Integer event = 1; + Context context = new TestContext(); + HandlerInteger handler = new HandlerInteger(); + assertEquals(2, handler.handleRequest(event, context)); + } + + @Test + void testHandlerList() { + logger.info("Invoke TEST - HandlerList"); + var event = List.of(1, 2, 3, 4); + Context context = new TestContext(); + HandlerList handler = new HandlerList(); + assertEquals(10, handler.handleRequest(event, context)); + } + + @Test + void testHandlerStream() throws IOException { + logger.info("Invoke TEST - HandlerStream"); + String inputStr = "Hello world"; + byte[] inputBytes = inputStr.getBytes(); + ByteArrayInputStream inputStream = new ByteArrayInputStream(inputBytes); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + Context context = new TestContext(); + HandlerStream handler = new HandlerStream(); + handler.handleRequest(inputStream, outputStream, context); + byte[] outputBytes = outputStream.toByteArray(); + assertArrayEquals(inputBytes, outputBytes); + String outputStr = new String(outputBytes, StandardCharsets.UTF_8); + assertEquals(inputStr, outputStr); + } + + @Test + void testHandlerString() { + logger.info("Invoke TEST - HandlerString"); + String event = "HeLlO wOrLd"; + Context context = new TestContext(); + HandlerString handler = new HandlerString(); + assertEquals("hello world", handler.handleRequest(event, context)); + } + + @Test + void testHandlerWeatherData() { + logger.info("Invoke TEST - HandlerWeatherData"); + WeatherData inputData = new WeatherData(); + inputData.setTemperatureK(298); + Context context = new TestContext(); + HandlerWeatherData handler = new HandlerWeatherData(); + WeatherData outputData = handler.handleRequest(inputData, context); + assertNotNull(outputData.getHumidityPct()); + assertNotNull(outputData.getPressureHPa()); + assertNotNull(outputData.getWindKmh()); + assertEquals(300, outputData.getTemperatureK()); + } } diff --git a/sample-apps/java-basic/template-mvn.yml b/sample-apps/java-basic/template-mvn.yml index 0fdaaf91..b083f3f6 100644 --- a/sample-apps/java-basic/template-mvn.yml +++ b/sample-apps/java-basic/template-mvn.yml @@ -7,9 +7,9 @@ Resources: Properties: CodeUri: target/java-basic-1.0-SNAPSHOT.jar Handler: example.Handler - Runtime: java8 + Runtime: java11 Description: Java function - MemorySize: 512 + MemorySize: 2048 Timeout: 10 # Function's execution role Policies: diff --git a/sample-apps/java-basic/template.yml b/sample-apps/java-basic/template.yml index 5cec6e28..b82fa0aa 100644 --- a/sample-apps/java-basic/template.yml +++ b/sample-apps/java-basic/template.yml @@ -7,9 +7,9 @@ Resources: Properties: CodeUri: build/distributions/java-basic.zip Handler: example.Handler - Runtime: java8 + Runtime: java11 Description: Java function - MemorySize: 512 + MemorySize: 2048 Timeout: 10 # Function's execution role Policies: diff --git a/sample-apps/java-events/3-invoke.sh b/sample-apps/java-events/3-invoke.sh index 5df2a8ef..c4bf8c43 100755 --- a/sample-apps/java-events/3-invoke.sh +++ b/sample-apps/java-events/3-invoke.sh @@ -16,6 +16,9 @@ then sns) PAYLOAD='file://events/sns-notification.json' ;; + cdn) + PAYLOAD='file://events/cloudfront.json' + ;; cfg) PAYLOAD='file://events/config-rule.json' ;; diff --git a/sample-apps/java-events/build.gradle b/sample-apps/java-events/build.gradle index a4e58ea4..acec6a6d 100644 --- a/sample-apps/java-events/build.gradle +++ b/sample-apps/java-events/build.gradle @@ -9,12 +9,11 @@ repositories { dependencies { implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' implementation 'com.amazonaws:aws-lambda-java-events:3.11.0' - implementation 'com.google.code.gson:gson:2.8.6' - 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,)' - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0' + implementation 'com.google.code.gson:gson:2.8.9' + implementation 'org.slf4j:slf4j-nop:2.0.6' + testImplementation 'com.amazonaws:aws-lambda-java-tests:1.1.1' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' } test { @@ -30,8 +29,8 @@ task buildZip(type: Zip) { } java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } build.dependsOn buildZip diff --git a/sample-apps/java-events/events/apigateway-v1.json b/sample-apps/java-events/events/apigateway-v1.json index 7a1e2b8f..1e5e8dab 100644 --- a/sample-apps/java-events/events/apigateway-v1.json +++ b/sample-apps/java-events/events/apigateway-v1.json @@ -96,6 +96,6 @@ "domainName": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com", "apiId": "70ixmpl4fl" }, - "body": null, + "body": "Hello world!", "isBase64Encoded": false } \ No newline at end of file diff --git a/sample-apps/java-events/events/apigateway-v2.json b/sample-apps/java-events/events/apigateway-v2.json index 4a9a547f..a009c4bf 100644 --- a/sample-apps/java-events/events/apigateway-v2.json +++ b/sample-apps/java-events/events/apigateway-v2.json @@ -42,5 +42,6 @@ "time": "10/Mar/2020:05:16:23 +0000", "timeEpoch": 1583817383220 }, + "body": "Hello world!", "isBase64Encoded": true } \ No newline at end of file diff --git a/sample-apps/java-events/events/cloudfront.json b/sample-apps/java-events/events/cloudfront.json new file mode 100644 index 00000000..3dbc92d6 --- /dev/null +++ b/sample-apps/java-events/events/cloudfront.json @@ -0,0 +1,40 @@ +{ + "Records": [ + { + "cf": { + "config": { + "distributionDomainName": "d111111abcdef8.cloudfront.net", + "distributionId": "EDFDVBD6EXAMPLE", + "eventType": "viewer-request", + "requestId": "4TyzHTaYWb1GX1qTfsHhEqV6HUDd_BzoBZnwfnvQc_1oF26ClkoUSEQ==" + }, + "request": { + "clientIp": "203.0.113.178", + "headers": { + "host": [ + { + "key": "Host", + "value": "d111111abcdef8.cloudfront.net" + } + ], + "user-agent": [ + { + "key": "User-Agent", + "value": "curl/7.66.0" + } + ], + "accept": [ + { + "key": "accept", + "value": "*/*" + } + ] + }, + "method": "GET", + "querystring": "", + "uri": "/picture.jpg" + } + } + } + ] +} \ No newline at end of file diff --git a/sample-apps/java-events/events/sns-notification.json b/sample-apps/java-events/events/sns-notification.json index cf8d74d9..9697ade6 100644 --- a/sample-apps/java-events/events/sns-notification.json +++ b/sample-apps/java-events/events/sns-notification.json @@ -14,7 +14,7 @@ }, "SigningCertUrl": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-a86cxmpl4e1f29c941702d737128f7b6.pem", "MessageId": "476643b1-xmpl-526c-973d-1542ba9af1d6", - "Message": "Updated and expanded documentation for using Lambda with API Gateway, including support for HTTP APIs. Added a sample application that creates an API and function with AWS CloudFormation. For details, see Using AWS Lambda with Amazon API Gateway.", + "Message": "Updated and expanded documentation for using Lambda with API Gateway, including support for HTTP APIs.", "Subject": "Latest updates from AWS Lambda", "UnsubscribeUrl": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:123456789012:java-events-topic:dd15418a-xmpl-4cfd-b418-f7fcb08c7ee4", "Type": "Notification", diff --git a/sample-apps/java-events/pom.xml b/sample-apps/java-events/pom.xml index ff6923d3..025d54b5 100644 --- a/sample-apps/java-events/pom.xml +++ b/sample-apps/java-events/pom.xml @@ -8,8 +8,8 @@ java-events-function UTF-8 - 1.8 - 1.8 + 11 + 11 @@ -28,30 +28,26 @@ 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,) + org.slf4j + slf4j-nop + 2.0.6 org.junit.jupiter junit-jupiter-api - 5.6.0 + 5.8.2 test org.junit.jupiter junit-jupiter-engine - 5.6.0 + 5.8.2 + test + + + com.amazonaws + aws-lambda-java-tests + 1.1.1 test @@ -68,6 +64,16 @@ 3.2.2 false + + + *:* + + module-info.class + META-INF/* + META-INF/versions/** + + + @@ -83,8 +89,8 @@ maven-compiler-plugin 3.8.1 - 1.8 - 1.8 + 11 + 11 diff --git a/sample-apps/java-events/src/main/java/example/HandlerApiGateway.java b/sample-apps/java-events/src/main/java/example/HandlerApiGatewayV1.java similarity index 63% rename from sample-apps/java-events/src/main/java/example/HandlerApiGateway.java rename to sample-apps/java-events/src/main/java/example/HandlerApiGatewayV1.java index c7513c2b..c1fb1d5d 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerApiGateway.java +++ b/sample-apps/java-events/src/main/java/example/HandlerApiGatewayV1.java @@ -1,32 +1,31 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - import java.util.HashMap; -// Handler value: example.HandlerApiGateway -public class HandlerApiGateway implements RequestHandler{ - Gson gson = new GsonBuilder().setPrettyPrinting().create(); +// Handler value: example.Handler +public class HandlerApiGatewayV1 implements RequestHandler{ + @Override public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent event, Context context) { + LambdaLogger logger = context.getLogger(); + logger.log("EVENT TYPE: " + event.getClass().toString()); APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent(); response.setIsBase64Encoded(false); response.setStatusCode(200); HashMap headers = new HashMap(); headers.put("Content-Type", "text/html"); response.setHeaders(headers); - response.setBody("AWS Lambda sample"+ + String body = event.getBody() != null ? event.getBody() : "Empty body"; + response.setBody("" + body + "" + "

Welcome

Page generated by a Lambda function.

" + ""); - // log execution details - Util.logEnvironment(event, context, gson); return response; } -} +} \ No newline at end of file diff --git a/sample-apps/java-events/src/main/java/example/Handler.java b/sample-apps/java-events/src/main/java/example/HandlerApiGatewayV2.java similarity index 52% rename from sample-apps/java-events/src/main/java/example/Handler.java rename to sample-apps/java-events/src/main/java/example/HandlerApiGatewayV2.java index d46bb14e..b8fefa86 100644 --- a/sample-apps/java-events/src/main/java/example/Handler.java +++ b/sample-apps/java-events/src/main/java/example/HandlerApiGatewayV2.java @@ -1,34 +1,31 @@ package example; import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.LambdaLogger; -import com.amazonaws.services.lambda.runtime.events.APIGatewayV2ProxyRequestEvent; -import com.amazonaws.services.lambda.runtime.events.APIGatewayV2ProxyResponseEvent; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import com.amazonaws.services.lambda.runtime.RequestHandler; +import com.amazonaws.services.lambda.runtime.events.APIGatewayV2HTTPEvent; +import com.amazonaws.services.lambda.runtime.events.APIGatewayV2HTTPResponse; import java.util.HashMap; -// Handler value: example.Handler -public class Handler implements RequestHandler{ - Gson gson = new GsonBuilder().setPrettyPrinting().create(); +// Handler value: example.HandlerApiGateway +public class HandlerApiGatewayV2 implements RequestHandler{ + @Override - public APIGatewayV2ProxyResponseEvent handleRequest(APIGatewayV2ProxyRequestEvent event, Context context) + public APIGatewayV2HTTPResponse handleRequest(APIGatewayV2HTTPEvent event, Context context) { LambdaLogger logger = context.getLogger(); - APIGatewayV2ProxyResponseEvent response = new APIGatewayV2ProxyResponseEvent(); + logger.log("EVENT TYPE: " + event.getClass().toString()); + APIGatewayV2HTTPResponse response = new APIGatewayV2HTTPResponse(); response.setIsBase64Encoded(false); response.setStatusCode(200); HashMap headers = new HashMap(); headers.put("Content-Type", "text/html"); response.setHeaders(headers); - response.setBody("AWS Lambda sample"+ + String body = event.getBody() != null ? event.getBody() : "Empty body"; + response.setBody("" + body + "" + "

Welcome

Page generated by a Lambda function.

" + ""); - // log execution details - Util.logEnvironment(event, context, gson); return response; } -} \ No newline at end of file +} diff --git a/sample-apps/java-events/src/main/java/example/HandlerCWEvents.java b/sample-apps/java-events/src/main/java/example/HandlerCWEvents.java index 3678e982..c052ef24 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerCWEvents.java +++ b/sample-apps/java-events/src/main/java/example/HandlerCWEvents.java @@ -1,21 +1,25 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.ScheduledEvent; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import java.util.ArrayList; +import java.util.List; // Handler value: example.HandlerCWEvents -public class HandlerCWEvents implements RequestHandler{ - Gson gson = new GsonBuilder().setPrettyPrinting().create(); +public class HandlerCWEvents implements RequestHandler>{ + @Override - public String handleRequest(ScheduledEvent event, Context context) + public List handleRequest(ScheduledEvent event, Context context) { - String response = new String("200 OK"); - // log execution details - Util.logEnvironment(event, context, gson); - return response; + LambdaLogger logger = context.getLogger(); + logger.log("EVENT TYPE: " + event.getClass().toString()); + var resourcesFound = new ArrayList(); + for (String resource : event.getResources()) { + resourcesFound.add(resource); + } + return resourcesFound; } } \ No newline at end of file diff --git a/sample-apps/java-events/src/main/java/example/HandlerCWLogs.java b/sample-apps/java-events/src/main/java/example/HandlerCWLogs.java index df134e3e..6ce35ab5 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerCWLogs.java +++ b/sample-apps/java-events/src/main/java/example/HandlerCWLogs.java @@ -1,12 +1,10 @@ package example; import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.LambdaLogger; +import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.CloudWatchLogsEvent; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import java.util.Base64; import java.util.Base64.Decoder; @@ -19,12 +17,12 @@ // Handler value: example.HandlerCWLogs public class HandlerCWLogs implements RequestHandler{ - Gson gson = new GsonBuilder().setPrettyPrinting().create(); + @Override public String handleRequest(CloudWatchLogsEvent event, Context context) { LambdaLogger logger = context.getLogger(); - String response = new String("200 OK"); + logger.log("EVENT TYPE: " + event.getClass().toString()); Decoder decoder = Base64.getDecoder(); byte[] decodedEvent = decoder.decode(event.getAwsLogs().getData()); StringBuilder output = new StringBuilder(); @@ -33,15 +31,12 @@ public String handleRequest(CloudWatchLogsEvent event, Context context) InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); bufferedReader.lines().forEach( line -> { - logger.log(line); output.append(line); }); - logger.log(output.toString()); + // logger.info(output.toString()); } catch(IOException e) { logger.log("ERROR: " + e.toString()); } - // log execution details - Util.logEnvironment(event, context, gson); - return response; + return output.toString(); } } diff --git a/sample-apps/java-events/src/main/java/example/HandlerCloudFront.java b/sample-apps/java-events/src/main/java/example/HandlerCloudFront.java index a239f989..b48a9fd5 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerCloudFront.java +++ b/sample-apps/java-events/src/main/java/example/HandlerCloudFront.java @@ -1,21 +1,28 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.CloudFrontEvent; +import com.amazonaws.services.lambda.runtime.events.CloudFrontEvent.CF; +import com.amazonaws.services.lambda.runtime.events.CloudFrontEvent.Record; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import java.util.ArrayList; +import java.util.List; // Handler value: example.HandlerCloudFront -public class HandlerCloudFront implements RequestHandler{ - Gson gson = new GsonBuilder().setPrettyPrinting().create(); +public class HandlerCloudFront implements RequestHandler>{ + @Override - public String handleRequest(CloudFrontEvent event, Context context) + public List handleRequest(CloudFrontEvent event, Context context) { - String response = new String("200 OK"); - // log execution details - Util.logEnvironment(event, context, gson); - return response; + LambdaLogger logger = context.getLogger(); + logger.log("EVENT TYPE: " + event.getClass().toString()); + var urisFound = new ArrayList(); + for (Record record : event.getRecords()) { + CF cfBody = record.getCf(); + urisFound.add(cfBody.getRequest().getUri()); + } + return urisFound; } } \ No newline at end of file diff --git a/sample-apps/java-events/src/main/java/example/HandlerCodeCommit.java b/sample-apps/java-events/src/main/java/example/HandlerCodeCommit.java index 6da28fcc..5b5a2a5a 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerCodeCommit.java +++ b/sample-apps/java-events/src/main/java/example/HandlerCodeCommit.java @@ -1,21 +1,31 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.CodeCommitEvent; +import com.amazonaws.services.lambda.runtime.events.CodeCommitEvent.CodeCommit; +import com.amazonaws.services.lambda.runtime.events.CodeCommitEvent.Record; +import com.amazonaws.services.lambda.runtime.events.CodeCommitEvent.Reference; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import java.util.ArrayList; +import java.util.List; // Handler value: example.HandlerCodeCommit -public class HandlerCodeCommit implements RequestHandler{ - Gson gson = new GsonBuilder().setPrettyPrinting().create(); +public class HandlerCodeCommit implements RequestHandler>{ + @Override - public String handleRequest(CodeCommitEvent event, Context context) + public List handleRequest(CodeCommitEvent event, Context context) { - String response = new String("200 OK"); - // log execution details - Util.logEnvironment(event, context, gson); - return response; + LambdaLogger logger = context.getLogger(); + logger.log("EVENT TYPE: " + event.getClass().toString()); + var commitsFound = new ArrayList(); + for (Record record : event.getRecords()) { + CodeCommit commit = record.getCodeCommit(); + for (Reference reference : commit.getReferences()) { + commitsFound.add(reference.getCommit()); + } + } + return commitsFound; } } \ No newline at end of file diff --git a/sample-apps/java-events/src/main/java/example/HandlerCognito.java b/sample-apps/java-events/src/main/java/example/HandlerCognito.java index 402ef416..c8443c27 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerCognito.java +++ b/sample-apps/java-events/src/main/java/example/HandlerCognito.java @@ -1,21 +1,26 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.CognitoEvent; +import com.amazonaws.services.lambda.runtime.events.CognitoEvent.DatasetRecord; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import java.util.ArrayList; +import java.util.List; // Handler value: example.HandlerCognito -public class HandlerCognito implements RequestHandler{ - Gson gson = new GsonBuilder().setPrettyPrinting().create(); +public class HandlerCognito implements RequestHandler>{ + @Override - public String handleRequest(CognitoEvent event, Context context) + public List handleRequest(CognitoEvent event, Context context) { - String response = new String("200 OK"); - // log execution details - Util.logEnvironment(event, context, gson); - return response; + LambdaLogger logger = context.getLogger(); + logger.log("EVENT TYPE: " + event.getClass().toString()); + var operationsFound = new ArrayList(); + for (DatasetRecord record : event.getDatasetRecords().values()) { + operationsFound.add(record.getOp()); + } + return operationsFound; } } \ No newline at end of file diff --git a/sample-apps/java-events/src/main/java/example/HandlerConfig.java b/sample-apps/java-events/src/main/java/example/HandlerConfig.java index 709ced7b..9d875333 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerConfig.java +++ b/sample-apps/java-events/src/main/java/example/HandlerConfig.java @@ -1,21 +1,18 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.ConfigEvent; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - // Handler value: example.HandlerConfig public class HandlerConfig implements RequestHandler{ - Gson gson = new GsonBuilder().setPrettyPrinting().create(); + @Override public String handleRequest(ConfigEvent event, Context context) { - String response = new String("200 OK"); - // log execution details - Util.logEnvironment(event, context, gson); - return response; + LambdaLogger logger = context.getLogger(); + logger.log("EVENT TYPE: " + event.getClass().toString()); + return event.getConfigRuleArn(); } } \ No newline at end of file diff --git a/sample-apps/java-events/src/main/java/example/HandlerDynamoDB.java b/sample-apps/java-events/src/main/java/example/HandlerDynamoDB.java index da0c0281..21b6f222 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerDynamoDB.java +++ b/sample-apps/java-events/src/main/java/example/HandlerDynamoDB.java @@ -1,32 +1,26 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; 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; +import java.util.ArrayList; +import java.util.List; // Handler value: example.HandlerDynamoDB -public class HandlerDynamoDB implements RequestHandler{ - private static final Logger logger = LoggerFactory.getLogger(HandlerDynamoDB.class); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); +public class HandlerDynamoDB implements RequestHandler>{ + @Override - public String handleRequest(DynamodbEvent event, Context context) + public List 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()); + LambdaLogger logger = context.getLogger(); + logger.log("EVENT TYPE: " + event.getClass().toString()); + var operationsFound = new ArrayList(); + for (DynamodbStreamRecord record : event.getRecords()) { + operationsFound.add(record.getEventName()); } - logger.info("Successfully processed " + event.getRecords().size() + " records."); - // log execution details - Util.logEnvironment(event, context, gson); - return response; + return operationsFound; } } \ No newline at end of file diff --git a/sample-apps/java-events/src/main/java/example/HandlerFirehose.java b/sample-apps/java-events/src/main/java/example/HandlerFirehose.java index 53ee9f25..988b4f6d 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerFirehose.java +++ b/sample-apps/java-events/src/main/java/example/HandlerFirehose.java @@ -1,21 +1,26 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.KinesisFirehoseEvent; +import com.amazonaws.services.lambda.runtime.events.KinesisFirehoseEvent.Record; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import java.util.ArrayList; +import java.util.List; // Handler value: example.HandlerFirehose -public class HandlerFirehose implements RequestHandler{ - Gson gson = new GsonBuilder().setPrettyPrinting().create(); +public class HandlerFirehose implements RequestHandler>{ + @Override - public String handleRequest(KinesisFirehoseEvent event, Context context) + public List handleRequest(KinesisFirehoseEvent event, Context context) { - String response = new String("200 OK"); - // log execution details - Util.logEnvironment(event, context, gson); - return response; + LambdaLogger logger = context.getLogger(); + logger.log("EVENT TYPE: " + event.getClass().toString()); + var recordIds = new ArrayList(); + for (Record record : event.getRecords()) { + recordIds.add(record.getRecordId()); + } + return recordIds; } } \ No newline at end of file diff --git a/sample-apps/java-events/src/main/java/example/HandlerKinesis.java b/sample-apps/java-events/src/main/java/example/HandlerKinesis.java index e46720df..cefa78fe 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerKinesis.java +++ b/sample-apps/java-events/src/main/java/example/HandlerKinesis.java @@ -1,6 +1,7 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.KinesisEvent; import com.amazonaws.services.lambda.runtime.events.KinesisEvent.KinesisEventRecord; @@ -8,22 +9,23 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.List; // Handler value: example.HandleKinesis -public class HandlerKinesis implements RequestHandler{ - private static final Logger logger = LoggerFactory.getLogger(HandlerKinesis.class); +public class HandlerKinesis implements RequestHandler>{ + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + @Override - public String handleRequest(KinesisEvent event, Context context) + public List handleRequest(KinesisEvent event, Context context) { - String response = new String("200 OK"); + LambdaLogger logger = context.getLogger(); + logger.log("EVENT TYPE: " + event.getClass().toString()); + var dataRecords = new ArrayList(); for(KinesisEventRecord record : event.getRecords()) { - logger.info(gson.toJson(record.getKinesis().getData())); + dataRecords.add(gson.toJson(record.getKinesis().getData())); } - // log execution details - Util.logEnvironment(event, context, gson); - return response; + return dataRecords; } } \ No newline at end of file diff --git a/sample-apps/java-events/src/main/java/example/HandlerLex.java b/sample-apps/java-events/src/main/java/example/HandlerLex.java index b0d9294d..efb5f71c 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerLex.java +++ b/sample-apps/java-events/src/main/java/example/HandlerLex.java @@ -1,21 +1,18 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.LexEvent; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - // Handler value: example.HandlerLex public class HandlerLex implements RequestHandler{ - Gson gson = new GsonBuilder().setPrettyPrinting().create(); + @Override public String handleRequest(LexEvent event, Context context) { - String response = new String("200 OK"); - // log execution details - Util.logEnvironment(event, context, gson); - return response; + LambdaLogger logger = context.getLogger(); + logger.log("EVENT TYPE: " + event.getClass().toString()); + return event.getCurrentIntent().getName(); } } \ No newline at end of file diff --git a/sample-apps/java-events/src/main/java/example/HandlerS3.java b/sample-apps/java-events/src/main/java/example/HandlerS3.java index cda08ceb..adc96dff 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerS3.java +++ b/sample-apps/java-events/src/main/java/example/HandlerS3.java @@ -1,34 +1,26 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.S3Event; - import com.amazonaws.services.lambda.runtime.events.models.s3.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 HandlerS3 implements RequestHandler{ - private static final Logger logger = LoggerFactory.getLogger(HandlerS3.class); - Gson gson = new GsonBuilder().setPrettyPrinting().create(); + @Override public String handleRequest(S3Event event, Context context) { - String response = new String("200 OK"); + LambdaLogger logger = context.getLogger(); 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); + logger.log("RECORD: " + record); + logger.log("SOURCE BUCKET: " + srcBucket); + logger.log("SOURCE KEY: " + srcKey); // log execution details - Util.logEnvironment(event, context, gson); - return response; + return srcBucket + "/" + srcKey; } } \ No newline at end of file diff --git a/sample-apps/java-events/src/main/java/example/HandlerSNS.java b/sample-apps/java-events/src/main/java/example/HandlerSNS.java index bcbda156..6b0aa666 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerSNS.java +++ b/sample-apps/java-events/src/main/java/example/HandlerSNS.java @@ -1,21 +1,28 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.SNSEvent; +import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNS; +import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import java.util.ArrayList; +import java.util.List; // Handler value: example.HandlerSNS -public class HandlerSNS implements RequestHandler{ - Gson gson = new GsonBuilder().setPrettyPrinting().create(); +public class HandlerSNS implements RequestHandler>{ + @Override - public String handleRequest(SNSEvent event, Context context) + public List handleRequest(SNSEvent event, Context context) { - String response = new String("200 OK"); - // log execution details - Util.logEnvironment(event, context, gson); - return response; + LambdaLogger logger = context.getLogger(); + logger.log("EVENT TYPE: " + event.getClass().toString()); + var messagesFound = new ArrayList(); + for (SNSRecord record : event.getRecords()) { + SNS message = record.getSNS(); + messagesFound.add(message.getMessage()); + } + return messagesFound; } } \ No newline at end of file diff --git a/sample-apps/java-events/src/main/java/example/HandlerSQS.java b/sample-apps/java-events/src/main/java/example/HandlerSQS.java index 024c9ff1..dabb49a2 100644 --- a/sample-apps/java-events/src/main/java/example/HandlerSQS.java +++ b/sample-apps/java-events/src/main/java/example/HandlerSQS.java @@ -1,22 +1,26 @@ package example; import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.SQSEvent; import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.List; // Handler value: example.HandlerSQS -public class HandlerSQS implements RequestHandler{ - private static final Logger logger = LoggerFactory.getLogger(HandlerSQS.class); +public class HandlerSQS implements RequestHandler>{ + @Override - public Void handleRequest(SQSEvent event, Context context) + public List handleRequest(SQSEvent event, Context context) { + LambdaLogger logger = context.getLogger(); + logger.log("EVENT TYPE: " + event.getClass().toString()); + var messagesFound = new ArrayList(); for(SQSMessage msg : event.getRecords()){ - logger.info(msg.getBody()); + messagesFound.add(msg.getBody()); } - return null; + return messagesFound; } } diff --git a/sample-apps/java-events/src/main/java/example/Util.java b/sample-apps/java-events/src/main/java/example/Util.java deleted file mode 100644 index b5e87294..00000000 --- a/sample-apps/java-events/src/main/java/example/Util.java +++ /dev/null @@ -1,20 +0,0 @@ -package example; - -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.LambdaLogger; - -import com.google.gson.Gson; - -public class Util { - - public static void logEnvironment(Object event, Context context, Gson gson) - { - LambdaLogger logger = context.getLogger(); - // log execution details - logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv())); - logger.log("CONTEXT: " + gson.toJson(context)); - // log event details - logger.log("EVENT: " + gson.toJson(event)); - logger.log("EVENT TYPE: " + event.getClass().toString()); - } -} \ No newline at end of file diff --git a/sample-apps/java-events/src/main/resources/log4j2.xml b/sample-apps/java-events/src/main/resources/log4j2.xml deleted file mode 100644 index b9a6c317..00000000 --- a/sample-apps/java-events/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/src/test/java/example/InvokeTest.java b/sample-apps/java-events/src/test/java/example/InvokeTest.java index c86f9821..881519cc 100644 --- a/sample-apps/java-events/src/test/java/example/InvokeTest.java +++ b/sample-apps/java-events/src/test/java/example/InvokeTest.java @@ -1,27 +1,205 @@ package example; import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertNotNull; import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.events.APIGatewayV2ProxyRequestEvent; -import com.amazonaws.services.lambda.runtime.events.APIGatewayV2ProxyResponseEvent; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; +import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; +import com.amazonaws.services.lambda.runtime.events.APIGatewayV2HTTPEvent; +import com.amazonaws.services.lambda.runtime.events.APIGatewayV2HTTPResponse; +import com.amazonaws.services.lambda.runtime.events.CloudFrontEvent; +import com.amazonaws.services.lambda.runtime.events.CloudWatchLogsEvent; +import com.amazonaws.services.lambda.runtime.events.CodeCommitEvent; +import com.amazonaws.services.lambda.runtime.events.CognitoEvent; +import com.amazonaws.services.lambda.runtime.events.ConfigEvent; +import com.amazonaws.services.lambda.runtime.events.DynamodbEvent; +import com.amazonaws.services.lambda.runtime.events.KinesisEvent; +import com.amazonaws.services.lambda.runtime.events.KinesisFirehoseEvent; +import com.amazonaws.services.lambda.runtime.events.LexEvent; +import com.amazonaws.services.lambda.runtime.events.S3Event; +import com.amazonaws.services.lambda.runtime.events.SNSEvent; +import com.amazonaws.services.lambda.runtime.events.SQSEvent; +import com.amazonaws.services.lambda.runtime.events.ScheduledEvent; +import com.amazonaws.services.lambda.runtime.tests.annotations.Event; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.util.List; + +import org.junit.jupiter.params.ParameterizedTest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; class InvokeTest { + private static final Logger logger = LoggerFactory.getLogger(InvokeTest.class); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + @ParameterizedTest + @Event(value = "events/apigateway-v1.json", type = APIGatewayProxyRequestEvent.class) + void testApiGatewayV1(APIGatewayProxyRequestEvent event) { + logger.info("Invoke TEST - ApiGatewayV1"); + Context context = new TestContext(); + HandlerApiGatewayV1 handler = new HandlerApiGatewayV1(); + APIGatewayProxyResponseEvent response = handler.handleRequest(event, context); + String expected = "" + "Hello world!" + "" + + "

Welcome

Page generated by a Lambda function.

" + + ""; + assertEquals(expected, response.getBody()); + } + + @ParameterizedTest + @Event(value = "events/apigateway-v2.json", type = APIGatewayV2HTTPEvent.class) + void testApiGatewayV2(APIGatewayV2HTTPEvent event) { + logger.info("Invoke TEST - ApiGatewayV1"); + Context context = new TestContext(); + HandlerApiGatewayV2 handler = new HandlerApiGatewayV2(); + APIGatewayV2HTTPResponse response = handler.handleRequest(event, context); + String expected = "" + "Hello world!" + "" + + "

Welcome

Page generated by a Lambda function.

" + + ""; + assertEquals(expected, response.getBody()); + } + + @ParameterizedTest + @Event(value = "events/cloudfront.json", type = CloudFrontEvent.class) + void testCloudFront(CloudFrontEvent event) { + logger.info("Invoke TEST - CloudFront"); + Context context = new TestContext(); + HandlerCloudFront handler = new HandlerCloudFront(); + List response = handler.handleRequest(event, context); + assertEquals(1, response.size()); + assertEquals("/picture.jpg", response.get(0)); + } + + @ParameterizedTest + @Event(value = "events/codecommit-push.json", type = CodeCommitEvent.class) + void testCodeCommit(CodeCommitEvent event) { + logger.info("Invoke TEST - CodeCommit"); + Context context = new TestContext(); + HandlerCodeCommit handler = new HandlerCodeCommit(); + List response = handler.handleRequest(event, context); + assertEquals(1, response.size()); + assertEquals("5c4ef1049f1d27deadbeeff313e0730018be182b", response.get(0)); + } + + @ParameterizedTest + @Event(value = "events/cognito-sync.json", type = CognitoEvent.class) + void testCognito(CognitoEvent event) { + logger.info("Invoke TEST - Cognito"); + Context context = new TestContext(); + HandlerCognito handler = new HandlerCognito(); + List response = handler.handleRequest(event, context); + assertEquals(2, response.size()); + assertEquals("replace", response.get(0)); + assertEquals("replace", response.get(1)); + } + + @ParameterizedTest + @Event(value = "events/config-rule.json", type = ConfigEvent.class) + void testConfig(ConfigEvent event) { + logger.info("Invoke TEST - Config"); + Context context = new TestContext(); + HandlerConfig handler = new HandlerConfig(); + String response = handler.handleRequest(event, context); + assertEquals("arn:aws:config:ca-central-1:123456789012:config-rule/config-rule-0123456", response); + } + + @ParameterizedTest + @Event(value = "events/cloudwatch-scheduled.json", type = ScheduledEvent.class) + void testCWEvents(ScheduledEvent event) { + logger.info("Invoke TEST - CWEvents"); + Context context = new TestContext(); + HandlerCWEvents handler = new HandlerCWEvents(); + List response = handler.handleRequest(event, context); + assertEquals(1, response.size()); + assertEquals("arn:aws:events:us-east-2:123456789012:rule/my-rule", response.get(0)); + } + + @ParameterizedTest + @Event(value = "events/cloudwatch-logs.json", type = CloudWatchLogsEvent.class) + void testCWLogs(CloudWatchLogsEvent event) { + logger.info("Invoke TEST - CWLogs"); + Context context = new TestContext(); + HandlerCWLogs handler = new HandlerCWLogs(); + String response = handler.handleRequest(event, context); + assertNotNull(response); + } + + @ParameterizedTest + @Event(value = "events/dynamodb-record.json", type = DynamodbEvent.class) + void testDynamoDB(DynamodbEvent event) { + logger.info("Invoke TEST - DynamoDB"); + Context context = new TestContext(); + HandlerDynamoDB handler = new HandlerDynamoDB(); + List response = handler.handleRequest(event, context); + assertEquals(2, response.size()); + assertEquals("INSERT", response.get(0)); + assertEquals("MODIFY", response.get(1)); + } + + @ParameterizedTest + @Event(value = "events/firehose-record.json", type = KinesisFirehoseEvent.class) + void testFirehose(KinesisFirehoseEvent event) { + logger.info("Invoke TEST - Firehose"); + Context context = new TestContext(); + HandlerFirehose handler = new HandlerFirehose(); + List response = handler.handleRequest(event, context); + assertEquals(1, response.size()); + assertEquals("49546986683135544286507457936321625675700192471156785154", response.get(0)); + } - @Test - void invokeTest() { - logger.info("Invoke TEST"); - APIGatewayV2ProxyRequestEvent event = new APIGatewayV2ProxyRequestEvent(); + @ParameterizedTest + @Event(value = "events/kinesis-record.json", type = KinesisEvent.class) + void testKinesis(KinesisEvent event) { + logger.info("Invoke TEST - Kinesis"); Context context = new TestContext(); - String requestId = context.getAwsRequestId(); - Handler handler = new Handler(); - APIGatewayV2ProxyResponseEvent result = handler.handleRequest(event, context); - assertEquals(200, result.getStatusCode()); + HandlerKinesis handler = new HandlerKinesis(); + List response = handler.handleRequest(event, context); + assertEquals(2, response.size()); } + @ParameterizedTest + @Event(value = "events/lex-flowers.json", type = LexEvent.class) + void testLex(LexEvent event) { + logger.info("Invoke TEST - Lex"); + Context context = new TestContext(); + HandlerLex handler = new HandlerLex(); + String response = handler.handleRequest(event, context); + assertEquals("OrderFlowers", response); + } + + @ParameterizedTest + @Event(value = "events/s3-notification.json", type = S3Event.class) + void testS3(S3Event event) { + logger.info("Invoke TEST - S3"); + Context context = new TestContext(); + HandlerS3 handler = new HandlerS3(); + String response = handler.handleRequest(event, context); + assertEquals("BUCKET_NAME/inbound/sample-java-s3.png", response); + } + + @ParameterizedTest + @Event(value = "events/sns-notification.json", type = SNSEvent.class) + void testSNS(SNSEvent event) { + logger.info("Invoke TEST - SNS"); + Context context = new TestContext(); + HandlerSNS handler = new HandlerSNS(); + List response = handler.handleRequest(event, context); + assertEquals(1, response.size()); + assertEquals("Updated and expanded documentation for using Lambda with API Gateway, including support for HTTP APIs.", response.get(0)); + } + + @ParameterizedTest + @Event(value = "events/sqs-record.json", type = SQSEvent.class) + void testSQS(SQSEvent event) { + logger.info("Invoke TEST - SQS"); + Context context = new TestContext(); + HandlerSQS handler = new HandlerSQS(); + List response = handler.handleRequest(event, context); + assertEquals(1, response.size()); + assertEquals("Hello from SQS!", response.get(0)); + } } diff --git a/sample-apps/java-events/template-mvn.yml b/sample-apps/java-events/template-mvn.yml index 62078b99..1e17bcbd 100644 --- a/sample-apps/java-events/template-mvn.yml +++ b/sample-apps/java-events/template-mvn.yml @@ -6,10 +6,10 @@ Resources: Type: AWS::Serverless::Function Properties: CodeUri: target/java-events-1.0-SNAPSHOT.jar - Handler: example.Handler - Runtime: java8 + Handler: example.HandlerSQS + Runtime: java11 Description: Java function - MemorySize: 512 + MemorySize: 2048 Timeout: 10 # Function's execution role Policies: diff --git a/sample-apps/java-events/template.yml b/sample-apps/java-events/template.yml index 2e818928..4b8bb3d8 100644 --- a/sample-apps/java-events/template.yml +++ b/sample-apps/java-events/template.yml @@ -7,9 +7,9 @@ Resources: Properties: CodeUri: build/distributions/java-events.zip Handler: example.HandlerSQS - Runtime: java8 + Runtime: java11 Description: Java function - MemorySize: 512 + MemorySize: 2048 Timeout: 10 # Function's execution role Policies: