本記事では、JavaでAWSのサーバーレスサービスであるLambdaのプログラムを作成する方法を紹介します。
pythonでLambdaを作成する方法は知ってるけど、
コンパイルが必要なJavaで作成するにはどうすればいいのだろう?
と、思ってる方におすすめです。
この記事では、以下のことを紹介してます。
- AWS Lambdaとは
- JavaでLambdaを作成する際の注意点
- JavaでLambdaを作成する具体的な方法
LambdaはAWSのサーバーレスのサービスのため、インターネット上では、サーバレスと相性のよいインタプリタ型言語であるPythonやNode.jsの記事が多く見つかります。
しかし、コンパイル型の言語であるJavaを利用した記事があまりありませんでした。
本記事では、JavaでAWS Lambdaプログラムの作成からコンパイル方法、AWS上で実行するまでの一連の流れを記載します。
AWS Lambdaとは
まずは、AWS Lambdaとは何かを簡単に紹介します。
公式サイトによると
AWS Lambda は、サーバーをプロビジョニングまたは管理せずにコードを実行できるようにするコンピューティングサービスです。
とのことです。
Lambdaのようなサーバーレスのサービスを利用せずにプログラムを公開するには、以下の作業が必要となります。
- プログラムを動かすためのサーバの準備
- サーバ上にミドルウェアをインストール
- ミドルウェアのパラメータ設定
- プログラムをミドルウェア上にデプロイ
上記作業を実施することで、ようやくプログラムを実行する環境が整います。
AWS Lambdaでは、上記作業の必要なく、プログラムを動作させることができます。
これにより、プログラムを実行するための環境準備がなくなり、サーバの脆弱性のパッチ対応、ミドルウェアの脆弱性のパッチ対応の作業も不要となり、運用も楽になります。
LambdaについてはAWS公式サイトは以下となります。
JavaでLambdaを作成するための開発環境
ローカル上のeclipseで開発します。
私の環境は以下です。私はMacを利用してますが、Windowsでも問題ありません。ローカルPC上のEclipseで開発します。
- OS:M1 MacBook Air
- Java OpenJDK Corretto-11.0.18.10.1
- eclipse 2023-03
JavaでAWS Lambdaを作成する際の注意点
実際に開発作業をしてみて、インターネット上のドキュメントだけだとわからなかったことを紹介します。
注意点1:JavaはAWS Console上での編集はできない
インタプリタ型の言語であるPythonやNode.jsなどでは、AWS Consol上でコードを編集し、即時実行できますが、コンパイルが必要なJavaではそれを行うことができません。
Javaの場合はローカルでコンパイルして作成されたjarファイルをアップロードしてデプロイが必要です。
注意点2:AWS SDKはEclipseで動作しなかった
これは私だけでしょうか。
Pythonでの開発時は、VSCodeなどで開発が行えますが、AWSから提供されているAWS SDKがあり、インストールすることでLambdaの開発が楽になります。
EclipseにもAWS SDKが存在するのですが、インストールしても動かすことができませんでした。
以下のエラーが表示され、設定画面すら出ない状態でした。
インストールしたバージョンは以下。
また、公式でもJavaのAWS SDKはサポートが終了されたので、大人しくAWS SDKを利用しないことにしましょう。
JavaでLambdaプログラムの作成
実際にJavaでLambdaを作成していく手順を紹介します。今回は手順を紹介するため、プログラムの内容は「HelloWorld」と表示するだけのシンプルなものとします。
Mavenプロジェクトの作成
プロジェクトはMavenプロジェクトで作成します。
Mavenプロジェクトの作成は、以下サイトを参考にさせていただきました。
Lambdaプログラムの作成
Lambdaはエントリポイントはデフォルトでは「EventHandler」クラスの「handleRequest」メソッドです。
そのため、上記クラスとメソッドを作成します。
作成したモジュールをAWS Lambdaにアップロード
mvnコマンドを使って作成したプロジェクトをビルドし、デプロイモジュールを作成します。
mavenコマンドを以下コマンドを実行しインストールします。私はMacのため、homebrewでインストールしました。
brew install maven
ビルドのコマンドは以下です。
mvn build package
ビルドが成功すると、以下のようにjarファイルが作成されます。
作成された上記jarファイルをAWS Consoleを利用してアップロード(デプロイ)します。
AWSコンソール上の以下画面から上記jarファイルを指定します。
動作確認
デプロイされたLambdaが正しく実行できるか確認します。
AWS Console上からLambdaを実行して確認してみます。テストタブから「テスト」をクリックします。
デフォルトでイベントJSONに以下のパラメータが設定されてます。ここのパラメータは、Lambdaに受け渡すパラメータを記載します。
例えば、ReactやVueなどのフロントエンドのアプリケーションから検索条件などのパラメータを受け渡し、Lambdaでその値によってデータ取得結果を変える場合などに利用します。
今回はパラメータを受け取らないラムダなので、何も変更せずに実行します。
テストボタンをクリック後、以下の結果になれば成功です。
実践的なコードの紹介
ここまでで、パラメータを受け取らないLamddaを作成しました。
実際にLambdaで処理を構築する際には、リクエストパラメータを取得する必要が必ずあります。
ここでは、リクエストパラメータを取得するコードを紹介します。下記のコードではinputにRequestパラメータの情報が入ってくるのでget(“body”)で取得できます。
public class EventHandler implemented RequestParamter<Map<String,Object>, String>{
public String handleRequest(Map<String,Object> input, Context context){
// リクエストパラメータの取得
String body = input.get("body").toString();
// これ以降はbodyの情報から必要なものを取得する
・・・
}
}
あとは、bodyの値をマッピングライブラリなどを利用し、Beanオブジェクトに格納し値を扱うことができます。
開発生産性
ここまでの記載の通り、JavaでLambdaを作成するには、ローカルでプログラムを修正しデプロイモジュールを作成する必要があります。そのため、Pythonなどのインタプリタ型言語と比べて生産性が悪いと個人的に感じてます。
また、Lambdaの仕組み上、初回アクセス時にコンテナを起動しモジュールをコンテナ上にデプロイする初期化処理が実行されます。javaの場合だとデプロイモジュールの展開に時間がかかるため、Pythonと比較して初回のアクセス時に時間がかかります。
上記理由のため、筆者的にはLambdaを利用する場合は、JavaではなくPythonやNodejsを利用することを推奨します。
まとめ
JavaでLambdaを作成する方法のまとめ
本記事ではJavaでAWS Lambdaを作成する方法について紹介しました。
実際に使ってみるとドキュメント上では読み取れないことが発見できました。JavaでLambdaを作成するには、ローカルでデプロイモジュールを作成しなければならなかったり、デプロイ後の初回アクセス時に時間がかかったりと、筆者的には推奨する言語にはなりませんでした。
皆様の参考になりましたら幸いです。
コメント