AWS Lambda(Java)をVSCodeのGradleプロジェクトで開発する方法

AWS Lambda(Java)をVSCodeのGradleプロジェクトで開発する方法

Lambdaの言語は色々ありますが、Java8,11がサポートされています。

最近Javaもコールドスタート対策されて約10倍くらい早くなったらしいので、今後Lambdaの言語の選択肢としてJavaも出てくるかもしれません。

今回試しにJava8で簡単なLambdaを作成し、時間を計測しようとしたのですがいくつか注意点があったのでメモです。

GradleをC:\gradleにインストールしている前提です。

項目 バージョン
Gradle 6.0.1

jarまたはzip形式でアップロードする必要がある

GradleプロジェクトをビルドしてJar形式にしてアップロードする必要があります。

zipでも良いようですがこちらは、Gradleタスクの設定が必要?と思われます。※マニュアルにはそう書いています

マネージメントコンソールでソースが見れない

node.jsばかりしていたので気づかなかったですが、JavaやC#の場合はマネジメントコンソールでソースを見ることができません。

これはやはりコンパイルが必要だからでしょう。node.jsのようなスクリプトは修正してすぐ動作が確認できるのでマネジメントコンソールでも修正が可能ですが、やはりJavaなどはそうはいかないですね。

VSCodeでJavaを開発する

VSCodeでJava開発をする方法 」を参考にしてください。今回はGradleプロジェクトを作成したいので以下コマンドでインタラクティブに作成していきます。

※プロジェクト名とフォルダ名は同じにします

$ gradle init –type java-application
Starting a Gradle Daemon (subsequent builds will be faster)
Select build script DSL:
1: groovy
2: kotlin
Enter selection (default: groovy) [1..2] 1
Select test framework:
1: junit
2: testng
3: spock
Enter selection (default: junit) [1..3] 1
Project name (default: gradleproject): sample
Source package (default: sample): confrage
BUILD SUCCESSFUL in 47s
2 actionable tasks: 2 executed

view raw
gistfile1.txt
hosted with ❤ by GitHub

これで以下のようなファイル構成がsampleフォルダ配下に作成されます。

AWS Lambda(Java)をVSCodeのGradleプロジェクトで開発する方法

sampleフォルダをVSCodeで開いてGradleプロジェクトに適したプラグインを入れます。

VSCodeのプラグイン

「Java Extension Packインストール」を入れます。※マストです

「Gradle Tasks」を入れるとサイドパネルでビルドタスクがGUIで実行できます。

Gradle Tasksを入れておくと便利です。

スケルトンコードが作成されたので実行する

ここまでいけたら実行してみます。

コマンド 内容
gradle run 実行する
gradle build ビルドする
gradle clean クリーンする

コマンドプロンプトからgradle runします。

$ gradle run
Starting a Gradle Daemon, 2 incompatible Daemons could not be reused, use –status for details
> Task :run
Hello world.
BUILD SUCCESSFUL in 15s
2 actionable tasks: 2 executed

view raw
gistfile1.txt
hosted with ❤ by GitHub

これでVSCodeでGradleプロジェクトを実行することができました。

今回はこのGradleプロジェクトをjar or zip化してLambdaで実行したいので、build.gradleに必要なライブラリを2つ追加します。

参考サイト:Java 関数の ZIP デプロイパッケージの作成

compile fileTree(dir: 'jars', include: '*.jar')
compile (
'com.amazonaws:aws-lambda-java-core:1.2.0',
'com.amazonaws:aws-lambda-java-events:2.2.7'
)

view raw
gistfile1.txt
hosted with ❤ by GitHub

次にタスクを追加します。

task buildZip(type: Zip) {
from compileJava
from processResources
into('lib') {
from configurations.runtimeClasspath
}
}
build.dependsOn buildZip

view raw
gistfile1.txt
hosted with ❤ by GitHub

これでbuild.gradleを保存し、コマンドプロンプトからgradle buildを実行します。

$ gradle build
BUILD SUCCESSFUL in 8s
8 actionable tasks: 7 executed, 1 up-to-date

view raw
gistfile1.txt
hosted with ❤ by GitHub

依存関係のあるライブラリがダウンロード出来たら、以下のように表示されると思います。

AWS Lambda(Java)をVSCodeのGradleプロジェクトで開発する方法

成功したらGradleプロジェクト直下のbuild\distributions配下にzipファイルが作成されます。

このzipファイルをLambdaにアップロードするのですが、このままだとエラーになります。

build.gradle

plugins {
id 'java'
id 'application'
}
repositories {
jcenter()
mavenCentral()
}
dependencies {
compile fileTree(dir: 'jars', include: '*.jar')
compile(
'com.amazonaws:aws-lambda-java-core:1.2.0',
'com.amazonaws:aws-lambda-java-events:2.2.7'
)
testImplementation 'junit:junit:4.12'
}
mainClassName = 'confrage.App'
task buildZip(type: Zip) {
from compileJava
from processResources
into('lib') {
from configurations.runtimeClasspath
}
}
build.dependsOn buildZip

view raw
gistfile1.txt
hosted with ❤ by GitHub

App.javaの中身を編集する

実行されるクラスはいくつかお作法があります。

  • com.amazonaws.services.lambda.runtime.RequestHandlerをインプリメントする
  • handleRequestメソッドをオーバーライドする
  • インデックスハンドラ名は、package名.クラス名::handleRequestとする

今回の場合、インデックスハンドラ名は「confrage.App::handleRequest」となります。

簡単に以下のように作成しました。インプットは文字列で、それを数値にして返すだけです。

App.java

package confrage;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class App implements RequestHandler<String, Integer> {
@Override
public Integer handleRequest(String input, Context context) {
return Integer.valueOf(input);
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

再度、ビルドしてzipファイルをアップロードします。インデックスハンドラ名変更も忘れずに行います。これで保存し、「テスト」を押します。

AWS Lambda(Java)をVSCodeのGradleプロジェクトで開発する方法

何らかのエラーが出た場合は、インプットの引数が間違えている可能性が高いです。今回であれば数値を文字列型にしておかないとエラーとなります。

AWS Lambda(Java)をVSCodeのGradleプロジェクトで開発する方法

再度、「テスト」をしてOKでした。

AWS Lambda(Java)をVSCodeのGradleプロジェクトで開発する方法

感想

簡単なhello world.を出力するプログラムを作成しようと思っただけなのに意外にもJavaは難しいという感じでした。

また、デフォルトでタイムアウト:15秒、メモリ:512MBとなっていたので、やはりnode.jsやGo言語と比較するとまだまだ遅いのかもしれません。

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA