BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS】LambdaでのJava実装方法まとめ

コンニチハ、BFT名古屋支店のヤタテです。
今回は、LambdaでのJava実装方法する方法についてまとめてみました。
それではどうぞ。

Javaの基礎知識

クラス、メソッド、フィールドについて

Javaでコードを実行するために必要な処理とデータをまとめたものを「クラス」といいます。
クラスの中で特定の処理を行うために必要なプログラムをまとめたものを「メソッド」といいます。
クラスの中でデータの値を保管するために使用するものを「フィールド」といいます。

コンパイルについて

Javaでコード実行するためには「コンパイル」が必要です。コンパイルとは人が読める形式のテキストをコンピュータ語に変換することで、コンパイル作業も含めて、コードをスタンドアロンで実行できる状態にすることを「ビルド」といいます。

LambdaでのJava実装について

JavaPythonなどと異なり、コンパイルされた言語のため、Lambda上で直接閲覧、編集などができません。
そのため、LambdaでJavaを実行するためには、ソースコードをビルドし、jarファイルとしてアップロードする必要があります。
また、LambdaでJava関数を呼び出すためにはハンドラーメソッドが必要となります。

jarファイルの作成方法について

1. JDKを用いた作成方法 ※Lambdaへの実装検証は未完了

⇒以下の手順を実施したところ、jarファイルの作成、アップロードまではできましたが、ハンドラーのエラーで実行できませんでした。
 ⇒ソースコードおよびハンドラーの見直しで対応可能?

  1. 以下のコマンドを実行し、classファイルを作成する(javaファイル名はTest.javaとする)。
 > javac Test.java
  1. 以下のコマンドを実行し、作成したclassファイルをjarファイルに圧縮する。
> jar -cvf Test.jar *.class
2. Mavenを使用する方法

⇒以下のサイトの手順を参考に実施し、LambdaでJavaの実行までできることを確認済みです。 qiita.com

3. Eclipseを使用する方法

Eclipseツールを使用しているだけで、基本的にやっていることはMavenと同じです。詳細は以下の記事を参照してください。

bftnagoya.hateblo.jp

ハンドラーについて

ハンドラーとは、LambdaでJavaを実行する際に呼び出すメソッドです。ハンドラーメソッドは独自で作成する他に、AWS Lambda Java コアライブラリに用意されているRequestHandlerとRequestStreamHandlerの2つの定義済みハンドラーインターフェースを利用することもできます。

ハンドラーメソッドの記述例

以下はRequestHandlerを用いたハンドラーメソッドの記述例です。

package com.example;
//パッケージの指定

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
//インターフェースのインポート
//Context:Lambdaで関数が実行される際に呼び出し、関数などの情報をハンドラーに渡すオブジェクト
//RequestHandler:ハンドラの実装のために用意されているインターフェース

public class Main implements RequestHandler<Object, String>{
//Mainクラスの定義RequestHandlerインターフェースの実装
//RequestHandler<入力データ, 出力データ>の形で記載する。

@Override
    public String handleRequest(Object input, Context context){
//handleRequestメソッドの定義
//ObjectとContextを入力として受け取り、Stringを出力する。

    String OneWord;
    
    OneWord = "Hello World!!";

    System.out.println(OneWord);
    
    return OneWord;
    }
}
//実行するコード
//今回はシンプルなHello Worldの出力

Mavenについて

Mavenとは、Javaプログラムのビルドやテストなどを管理するツールです。pom.xmlファイルに集約した情報を基にプログラムを管理します。

pom.xmlファイルについて

pom.xmlファイルとは、プロジェクトの設定を管理するMavenの設定ファイルです。MavenJavaプログラムのビルドを行うためにはこのpom.xmlファイルの作成が必要になります。

pom.xmlファイルの構成要素

以下のサンプルを例に pom.xmlファイルの構成要素について説明します。

pom.xml(サンプル)

<?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.example</groupId>
  <artifactId>lambda-hello-world</artifactId>
  <packaging>jar</packaging>
  <version>1.0</version>
  <name>lambda-hello-world</name>

  <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>

  <dependencies>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-core</artifactId>
      <version>1.2.0</version>
    </dependency>
  </dependencies>

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

</project>

上記のpom.xmlを構成要素ごとに分けて見ていきます。

<?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>

1行目はXML文書であることと文字コードを指定しています。 2行目以降は、Mavenプロジェクトとして設定を行うことを宣言しています。 これらは特に変更の必要はありません。

  <groupId>com.example</groupId>
  <artifactId>lambda-hello-world</artifactId>
  <packaging>jar</packaging>
  <version>1.0</version>
  <name>lambda-hello-world</name>

Mavenプロジェクトの設定値を記入している部分です。各タグの意味は以下の通りです。

  • groupId
    プロジェクトを一意に識別する名前。プロジェクトのパッケージ名を指定する。
  • artifactId
    プロジェクトの成果物の名前。 作成するJARファイルなどの名前に使用される。
  • packaging
    作成する成果物のパッケージングタイプ。デフォルトではjar。
  • version
    プロジェクトのバージョン。
  • name
    プロジェクトの表示名。
  <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>

プロパティの設定を記入する部分です。ここではプロジェクトをビルドした際の文字コードMavenが使用するJavaのバージョンを指定しています。

  <dependencies>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-core</artifactId>
      <version>1.2.0</version>
    </dependency>
  </dependencies>

プロジェクトが依存するライブラリの情報を指定します。aws-lambda-java-coreはLambdaでJavaをサポートするためのインターフェースです。

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

プラグイン(Maven拡張機能)について記述する部分です。maven-shade-pluginは依存関係にあるコードやライブラリなどをひとまとめにしたjarファイルを作成するためのプラグインです。

Mavenを用いたLambdaでのJava実装手順

  1. 以下のようなディレクトリ構成を作成する(src/main/javaMavenの標準のディレクトリ構成)。
├── pom.xml
└── src
    └── main
        └── java
            └── <パッケージ名>
               └── Test.java
  1. pom.xmlファイルのあるディレクトリで以下のコマンドを実行し、jarファイルを作成する。
mvn package
  1. AWSにて、Lambda関数を作成する。ランタイムとハンドラは以下のように設定する。
    ランタイム:Java8
    ハンドラ:<パッケージ名>.<クラス名>::handleRequest

  2. 「アップロード」をクリックして作成したjarファイルをアップロードする。

  3. 「テスト」をクリックし、任意の名前でテストイベントを作成する。
  4. 「呼び出し」をクリックすると、テストが実行され、結果が表示される。

追加ライブラリの設定

Javaでデータベースを操作する際にはJDBCドライバが必要となります。Lambdaでは、JDBCドライバなどの追加コードやライブラリを使用する際に、Layerを利用することができます。

Layerの設定手順

今回は例として、以下から入手したPostgreSQLJDBCドライバ(postgresql-42.2.18.jar)を使用します。

jdbc.postgresql.org

  1. ローカルで以下のようにフォルダを作成する。

    java/lib/postgresql-42.2.18.jar

  2. javaフォルダをzipに圧縮する。
  3. AWSマネジメントコンソールにて、[AWS Lambda]-[レイヤー]を開く。
  4. [レイヤーの作成]をクリックする。
  5. レイヤーの作成画面で、名前、説明を入力し、先程作成したzipファイルをアップロードする。[互換性のあるランタイム]で関数のランタイムと同じJavaのバージョンを選択し、[作成]をクリックする。
  6. Layerを使用するLambda関数に移動し、[コード]-[レイヤー]から[レイヤーの追加]をクリックする。
  7. レイヤーとバージョンを選択して[追加]をクリックする。