adam bien's blog

AWS Lambda as Java POJOs-Deployed with Java CDK 📎

AWS Lambda functions are plain Java classes with at least a single public method:

    public class Greetings{

        public String onEvent(Map input) {
            //...
        }
        
    }

...with primitive datatypes, collections or streams as input parameters. The return value is serialized into a String for primitive types or JSON for classes.

A selected public method becomes the function handler. In the example above it is the method: onEvent

An AWS Lambda can be deployed with AWS CDK in Java:


import software.amazon.awscdk.services.lambda.Code;
import software.amazon.awscdk.services.lambda.Function;
import software.amazon.awscdk.services.lambda.Runtime;

//...

Function createUserListenerFunction(String functionName,String functionHandler, int memory, int timeout) {
    return Function.Builder.create(this, id(functionName))
            .runtime(Runtime.JAVA_11)
            .code(Code.fromAsset("../target/function.jar"))
            .handler(functionHandler)
            .memorySize(memory)
            .functionName(functionName)
            .timeout(Duration.seconds(timeout))
            .build();
}    
...and (blackbox) integration tested with AWS SDK for Java 2.x:

@BeforeEach
public void initClient() {
    var credentials = DefaultCredentialsProvider
    .builder()
    .profileName("airhacks.live")
    .build();

    this.client = LambdaClient.builder()
                    .credentialsProvider(credentials)
                    .build();
}

@Test
public void invokeLambdaAsynchronously() {
        String json = "{\"user \":\"duke\"}";
        SdkBytes payload = SdkBytes.fromUtf8String(json);

        InvokeRequest request = InvokeRequest.builder()
                .functionName("airhacks_lambda_greetings_boundary_Greetings")
                .payload(payload)
                .invocationType(InvocationType.REQUEST_RESPONSE)
                .build();

        var response = this.client.invoke(request);
        var error = response.functionError();
        assertNull(error);
        var value = response.payload().asUtf8String();
        System.out.println("Function executed. Response: " + value);
}    
See it in action:

The sample code is available as template from: https://github.com/AdamBien/aws-lambda-cdk-plain.