LambdaでJava入門しようとしてハマった
経緯
普段はNode.jsで開発していますが、LambdaでJavaを使うテストをしている方がエラーで行き詰っていたので一緒に調査しました。
結論
Lambdaのハンドラー設定が間違っていました。
デフォルトでは、example.Hello::handleRequest
だったのを、
com.example.Hello::handleRequest
に変更したところ実行できました。
こちらの記事を参考にしました。
何しようとしてたの?
LambdaでJavaを使用するのが初めてだったので、まずはこちらの記事を参考に、簡単なプログラムを実行しようと思いました。
ランタイム
- Java 11 (Corretto)
- エディタはVSCode
- こちらを参考にMavenをインストール
手順
詳しくは上記参考サイトをご覧ください。以下は手順の概要です。
- ディレクトリとファイルの作成
- Request.javaの編集
- Hello.javaの編集
- pom.xmlの編集
- 関数をデプロイする
- 関数をテストする
はまりポイント1 ~ファイル名~
参考サイトではディレクトリとファイルの作成で
HelloWorld.java
というファイルを作成するようになっています。
ところが、ファイル編集の際にはファイル名が
Hello.java
となっており、ファイル名に相違がありました。
こちらに関しては、
mvn package
の時点で
Compilation failure [ERROR] /C:/Users/user/Desktop/java-lambda/src/main/java/com/example/HelloWorld.java.java:[16,8] クラス Helloはpublicであり、ファイルHello.javaで宣言する必要があります
とエラーが出たのですぐに気づきました。
はまりポイント2 ~ハンドラー~
Lambdaのハンドラーは関数作成直後は
example.Hello::handleRequest
でした。作成したjarファイルをアップロードしてテストを実行したところ、以下のエラーが発生しました。
Class not found: example.Hello: java.lang.ClassNotFoundException
java.lang.ClassNotFoundException: example.Hello. Current classpath: file:/var/task/
当初はプログラムの問題かと思いしたが、こちらの記事の以下でハンドラーの問題だと推測しました。
ハンドラ: com.example.HelloWorld::handleRequest
上記を参考にハンドラーを
com.example.Hello::handleRequest
に変更したところ、テストの実行が成功しました。
余談
Node.jsだとコンソールでコーディングができますが、Javaはコンソールでのコーディングができない仕様なのは初めて知りました。
公式のドキュメントでの記述は見つけられませんでしたが、ちょっと調べたらC#もコンソールではコーディングできないという記事もありました。
Lambdaコンソールでは、Java、C# などのコンパイル済み言語のインラインエディタは提供されていません。
いまからはじめるJavaでAWS Lambda(ラムダ) 前編 - Qiita
まとめ
今回はLambdaで普段触っていないJavaをやってみようと思ったらハマったので、ハマりポイントと解決法をまとめました。初歩的な内容だとは思いますが、どなたかの参考になれば幸いです。
参考資料
AWS Lambda + Java で Hello World - Qiita
【AWS Lambda入門】全サポート言語で簡単な関数を作成してみた | MMM公式ブログ
いまからはじめるJavaでAWS Lambda(ラムダ) 前編 - Qiita
Discussion