topic sns services precio example cost aws amazon-web-services amazon-sns aws-lambda

amazon-web-services - services - sns price sms



AWS Lambda NoClassDefFoundError (4)

A veces tienes que subir tu lambda de nuevo. También tengo el mismo problema que solucioné con este pom.xml:

<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-bom</artifactId> <version>1.11.83</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.3</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>

Estoy teniendo dificultades con una configuración de la función Lambda basada en Java para recibir mensajes de SNS. Mi función se parece a la siguiente:

package com.mycompany; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.events.SNSEvent; public class LambdaHandler { public void Handler(SNSEvent event, Context context) { //Process the event } }

Se compila bien y no tengo ningún problema al cargar el archivo jar en Lambda (a través de la consola web).

Sin embargo, cuando publico en él (a través de SNS a través de la función Lambda suscrita) con JSON que representa el modelo SNSEvent, la función Lambda lanza la siguiente excepción:

Error al cargar el controlador del método en la clase com.mycompany.LambdaHandler: class java.lang.NoClassDefFoundError java.lang.NoClassDefFoundError: com / amazonaws / services / lambda / runtime / events / SNSEvent at

java.lang.Class.getDeclaredMethods0 (Método nativo) en java.lang.Class.privateGetDeclaredMethods (Class.java:2701) en java.lang.Class.privateGetPublicMethods (Class.java:2902) en java.lang.Class.privado Class.java:1615) Causado por: java.lang.ClassNotFoundException: com.amazonaws.services.lambda.runtime.events.SNSEvent en java.net.URLClassLoader.findClass (URLClassLoader.java:381) en java.lang.ClassLoader. loadClass (ClassLoader.java:424) en java.lang.ClassLoader.loadClass (ClassLoader.java:357)

Utilizo Maven + Netbeans y es un proyecto de aplicación Java de Maven. Descargué la función desde la consola de Lambda y confirmé que el archivo tiene un directorio lib / con todos los archivos para las importaciones, incluido aws-lambda-java-events-1.1.0.jar, que a su vez incluye el / com / amazonaws /services/lambda/runtime/events/SNSEvent.class file.

¿Por qué el tiempo de ejecución no puede encontrar la clase cuando está definitivamente en el archivo jar? ¿Hay algo más que deba hacer, establecer alguna variable de entorno, etc.?

¡Cualquier ayuda sería apreciada!

EDITAR 1 Intenté degradar a aws-lambda-java-events 1.0.0 y sigue reportando la misma excepción. Según lo solicitado, a continuación se muestra mi archivo POM (con solo el nombre del proyecto cambiado). No sé cómo decirle a Maven que ponga las bibliotecas en una estructura de árbol.

<?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> <groupId>com.app</groupId> <artifactId>Handler</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-lambda</artifactId> <version>1.10.6</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>1.0.0</version> </dependency> </dependencies> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> </project>


En la sección de complementos de su pom.xml, agregue el Complemento Apache Maven Shade . Se usa durante el proceso de construcción. Este plugin se usa para empaquetar jars para crear un .jar autónomo. El plugin maven-shade tomará los artefactos (jars) producidos por el objetivo del paquete, y creó un .jar autónomo que contiene el código compilado y las dependencias resueltas del pom.xml.

<dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.0.0</version>


Utilice el complemento de Maven-Shade para que el JAR contenga las dependencias en un uber-jar.

Entonces, agrega esto a tu pom.xml

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

Fuente: http://docs.aws.amazon.com/lambda/latest/dg/java-create-jar-pkg-maven-no-ide.html

Potencialmente puede tener este problema https://github.com/aws/aws-lambda-java-libs/issues/2 que requiere una rebaja a aws-lambda-java-events-1.0.0.jar


=== Si este problema existe incluso después de incluir un frasco sombreado ===

Si tiene este problema, incluso después de tener un tarro sombreado, entonces el problema debería estar relacionado con la versión del paquete aws-lambda-java-events (debe haber alguna incompatibilidad entre la versión AWS lamda y la versión más reciente de aws-lambda-java-events ). Es decir, tuve este problema con la última versión (2.0.2) del paquete aws-lambda-java-events y tengo que cambiar la versión a 1.3.0.

Parece que la versión más reciente de aws-lambda-java-events no tiene muchas dependencias.