Javaに基づいてSNSからメッセージを受信するLambda関数のセットアップに問題があります。私の関数は次のようになります。
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
}
}
コンパイルは問題なく、jarファイルをLambdaに(Webコンソール経由で)アップロードするのに問題はありません。
ただし、SNSEventモデルを表すJSONを使用して(SNS経由でサブスクライブされたLambda関数まで)公開すると、Lambda関数は次の例外をスローします。
クラスcom.mycompany.LambdaHandlerのメソッドハンドラーのロードエラー:クラスJava.lang.NoClassDefFoundError Java.lang.NoClassDefFoundError:com/amazonaws/services/lambda/runtime/events/SNSEvent at
Java.lang.Class.getDeclaredMethods0(Native Method)at Java.lang.Class.privateGetDeclaredMethods(Class.Java:2701)at Java.lang.Class.privateGetPublicMethods(Class.Java:2902)at Java.lang.Class.getMethods( Class.Java:1615)原因:Java.lang.ClassNotFoundException:com.amazonaws.services.lambda.runtime.events.SNSEvent at Java.net.URLClassLoader.findClass(URLClassLoader.Java:381)at Java.lang.ClassLoader。 loadClass(ClassLoader.Java:424)at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)
Maven + Netbeansを使用しており、Maven Java Applicationプロジェクトです。Lambdaコンソールから関数をダウンロードして確認しました。jarには、インポート用のすべてのjar aws-lambda-Java-events-1.1.0.jar。これには/com/amazonaws/services/lambda/runtime/events/SNSEvent.classファイルが含まれます。
クラスがjarファイル内にある場合、ランタイムがクラスを見つけられないのはなぜですか?環境変数などを設定する必要がありますか?
助けていただければ幸いです!
EDIT 1 aws-lambda-Java-events 1.0.0にダウングレードしようとしましたが、引き続き同じ例外が報告されています。要求されたとおり、以下は私のPOMファイルです(プロジェクト名だけが変更されています)。ライブラリをツリー構造に配置するようにMavenに指示する方法がわかりません。
<?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>
maven-shadeプラグイン を使用して、JARにuber-jarの依存関係が含まれるようにします。
したがって、これを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>
ソース: http://docs.aws.Amazon.com/lambda/latest/dg/Java-create-jar-pkg-maven-no-ide.html
この問題が発生する可能性があります https://github.com/aws/aws-lambda-Java-libs/issues/2 aws-lambda-Java-events-1.0.0へのダウングレードが必要です.jar
===シェーディングされたjarを含めた後でもこの問題が存在する場合===
シェーディングjarを作成した後でもこの問題が発生する場合、問題はaws-lambda-Java-eventsパッケージバージョンに関連する必要があります(AWS lamdaバージョンと新しいaws-lambda-Java-eventsバージョン)。つまり、aws-lambda-Java-eventsパッケージの最新バージョン(2.0.2)でこの問題が発生し、バージョンを1.3.0にダウングレードする必要があります。
新しいaws-lambda-Java-eventsバージョンには多くの依存関係がないようです。
ラムダを再度アップロードする必要がある場合があります。また、この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>
Pom.xmlのpluginsセクションで、 Apache Maven Shade Plugin を追加します。これはビルドプロセス中に使用されます。このプラグインは、jarをパッケージ化してスタンドアロンの.jarを作成するために使用されます。maven-shade-pluginは、パッケージgoalによって生成されたアーティファクト(jar)を取得し、コンパイルされたコードとpom.xml。
<dependency>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>