1

This is my code which uploaded in aws lambda using java. I have made a jar using mvn clean package and uploaded to lambda function service but getting error java.lang.NoClassDefFoundError: software/amazon/awssdk/auth/credentials/AwsCredentialsProvider

Please help me out.


import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rdsdata.RdsDataClient;
import software.amazon.awssdk.services.rdsdata.model.ExecuteStatementRequest;
import software.amazon.awssdk.services.rdsdata.model.ExecuteStatementResponse;

import java.util.Collections;

public class LambdaJavaAPI implements RequestHandler<APIGatewayProxyRequestEvent, Object> {

    public static final String AURORA_CLUSTER_ARN_ENV = "cluster key";
    public static final String DATABASE_NAME_ENV = "mylab";
    public static final String AURORA_SECRET_ARN_ENV = "security manager key";

    /**
     * @return an instance of RdsClient
     */
    public static RdsDataClient rdsClient() {
        Region region = Region.US_EAST_1;
        return RdsDataClient.builder()
                .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
                .region(region)
                .httpClientBuilder(UrlConnectionHttpClient.builder()).build();
    }

    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) {
        String responseBody = "Test Event";
        final RdsDataClient rdsDataClient = new LambdaJavaAPI().rdsClient();

        ExecuteStatementRequest request = ExecuteStatementRequest.builder()
                .database(DATABASE_NAME_ENV)
                .resourceArn(AURORA_CLUSTER_ARN_ENV)
                .secretArn(AURORA_SECRET_ARN_ENV)
                .sql(String.format("select name from users",DATABASE_NAME_ENV))
                .build();
        ExecuteStatementResponse executeStatementResponse = rdsDataClient.executeStatement(request);
        if (executeStatementResponse.hasRecords()) {

        }

        return new APIGatewayProxyResponseEvent().withStatusCode(200)
                .withIsBase64Encoded(Boolean.FALSE)
                .withHeaders(Collections.emptyMap())
                .withBody(responseBody);
    }
}

2 Answers 2

2

I have made a jar using mvn clean package

This just packages up your classes; it does not include dependencies.

Instead, create an "uberjar" using the Maven shade plugin. This is described in the AWS documentation: https://docs.aws.amazon.com/lambda/latest/dg/java-package.html

Sign up to request clarification or add additional context in comments.

1 Comment

Using the shade plugn did the trick for me, thanks.
0

AwsCredentialsProvider exists in https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk/1.12.110

If you do not use Maven and Dependencies, then download the jar https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk/1.12.110/aws-java-sdk-1.12.110.jar

You need to either include this in your libs in your packaged jar or it must be added to your classpath like java -cp

Take your generated jar, rename to .zip and unzip it, and see the contents. Does it have this jar in it?

2 Comments

@stackoverflow.com/users/7064617/sma - I have added the dependency already in the pom.xml.
Please open your jar and see the contents

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.