Не удается вставить в таблицу DynamoDB из лямбда-функции

#amazon-web-services #aws-lambda #amazon-dynamodb #noclassdeffounderror

#amazon-web-services #aws-lambda #amazon-dynamodb #ошибка noclassdeffounderror

Вопрос:

Я получаю следующую ошибку при запуске моей лямбда-функции, которая должна помещать элемент an в мою таблицу DynamoDB.

       "errorMessage": "com/amazonaws/services/dynamodbv2/AmazonDynamoDBClientBuilder",
      "errorType": "java.lang.NoClassDefFoundError",
      "stackTrace": [
        "dao.EventDAO.insertEvent(EventDAO.java:15)",
        "service.PostEventService.postEvent(PostEventService.java:12)",
        "handler.PostEventHandler.handle(PostEventHandler.java:11)",
        "java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)",
        "java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)",
        "java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)",
        "java.base/java.lang.reflect.Method.invoke(Unknown Source)"
      ]
  

И вот мой код, который пытается вставить в таблицу:

     package dao;
    
    import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
    import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
    import com.amazonaws.services.dynamodbv2.document.DynamoDB;
    import com.amazonaws.services.dynamodbv2.document.Item;
    import com.amazonaws.services.dynamodbv2.document.PutItemOutcome;
    import com.amazonaws.services.dynamodbv2.document.Table;
    import request.PostEventRequest;
    import response.PostEventResponse;
    
    public class EventDAO {
    
        public PostEventResponse insertEvent(PostEventRequest request) {
            AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
            DynamoDB dynamoDB = new DynamoDB(client);
            Table table = dynamoDB.getTable("Event");
            PostEventResponse response = new PostEventResponse();
    
            // Build the item
            Item item = new Item()
                    .withPrimaryKey("eventId", request.eventId)
                    .withString("username", request.username)
                    .withString("image", request.image)
                    .withString("description", request.description)
                    .withString("time", request.time);
    
            // Write the item to the table
            PutItemOutcome outcome = table.putItem(item);
    
            return response;
        }
    }
  

и вот мой pom.xml как я подозреваю, это может быть важно:

     <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <dependencies>
            <dependency>
                <groupId>com.amazonaws</groupId>
                <artifactId>aws-java-sdk</artifactId>
                <version>1.11.327</version>
            </dependency>
            <dependency>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
            </dependency>
        </dependencies>
    
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
    
        <groupId>earnshawsfinest</groupId>
        <artifactId>rally-backend</artifactId>
        <version>1.0-SNAPSHOT</version>
    </project>
  

По какой-то причине, когда он находится в lambda, он не распознает класс AmazonDynamoDbClientBuilder, хотя в моем проекте в IntelliJ он есть и важен. Мой проект IntelliJ строится без проблем и экспортирует jar (с модулями и зависимостями), которые я загружаю в lambda. Лямбда будет работать нормально, если я удалю содержимое DynamoDB.

Я чувствую, что, возможно, мне где-то не хватает какой-то загрузки или импорта, но я не знаю, что. Я следил за всевозможными учебными пособиями от Amazon, и я даже делал это раньше, но я не сталкивался с этой проблемой. Любая помощь? Заранее спасибо!!

Ответ №1:

По умолчанию зависимости не объединены внутри файла jar. Вам нужно это сделать или предоставить их в отдельном лямбда-слое

Проверьте ссылку Создание пакета развертывания с помощью Maven и посмотрите, как использовать maven-shade-plugin , который должен создавать все зависимости внутри целевого файла jar.

   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
      <createDependencyReducedPom>false</createDependencyReducedPom>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
      </execution>
    </executions>
  </plugin>