コラム

node.jsとJavaでlambdaのレイヤーを使用する

今回はnodejsとjavaでlambdaレイヤーを使用する簡単な例を試してみたいと思います。
layer作成方法、注意点など解説していきたいと思います。

環境

windows11
node.js v18
maven 3.9.4

nodejsの設定

機能

今回作成する機能は、以下の通りです。

Layer部分:axiosというhttp通信ライブラリをlayerとして使用します。
lambdaファンクション部分:axiosを使用して、あるURLにアクセスし結果を表示します。

nodejsプロジェクト作成

1.ディレクトリを作成します。

今回は「lambda_nodejs_test」というディレクトリを作成しました。

2.ディレクトリ内に移動し次のコマンド実行

npm init

package.jsonファイルが作成されます。

3.axiosライブラリインストールします。

npm install axios

node_modulesディレクトリが作成されます。

lambda作成

AWSにNodejsのLambdaを作成し次のコードを使用します。ランタイムはnode.js 18.xを使用。
Lambdaの名称は「layer_nodejs_test」とします。
以下はnodejsのコードです。

import axios from 'axios';

export const handler = async (event) => {
    const response = await axios.get('https://www.distant-view.co.jp');
    return response.data;
};

Layer作成

1.nodejsプロジェクト作成でインストールしたaxiosを入っているディレクトリをzip化する。

「node_modules」以下をzipに纏めます。

2.Layerの作成

aws cliで先ほどzip化したファイルを指定してLayerの作成をします。(ここはAWSの画面で作成してzipファイルをアップロードする方法でも良いです)

 aws lambda publish-layer-version --layer-name nodejs-layer --zip-file fileb://node_modules.zip --compatible-runtimes node.js 18.x

3.作成したLayerをLambdaに設定する。これは画面でやりました。

動作確認

正常に動作すると、指定URLのhtmlのコードが返ってきます。
これは、画面からテストで実行しても良いしコマンド実行しても良いです。
コマンドの実行例を下記に記述しておきます。

aws lambda invoke --function-name layer_nodejs_test --payload '{}' outputfile.txt

結果は以下の様なHtmlが返ってきます。(全部は載せてません)

<!DOCTYPE html>\n<html>\n<head prefix=\"og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#\">\n  <script src=\"/co

注意点

  • Nodejsのバージョンが合わないと、エラーが出る可能性があります。
  • zipの中身がnode_modulesのディレクトリが存在し、その中にライブラリのファイルがないと上手く動作しません。
  • ディレクトリ名がnode_modules以外だと上手く動作しません。

Javaの設定

機能

今回作成する機能は、以下の通りです。

Layer部分:okhttpというhttp通信ライブラリをlayerとして使用します。
lambdaファンクション部分:okhttpを使用して、あるURLにアクセスし結果を表示します。

Javaプロジェクト作成

1.次の様なディレクトリを作成します。
  パッケージ名は「com.example」、Lambdaクラス名は「LambdaHander」にします。
mvnを使用するのでpom.xmlファイルを用意します。

lambda_java_test/
├── src/
│   └── main/
│       └── java/
│           └── com/
│               └── example/
│                   └── LambdaHandler.java
├── pom.xml

2.pom.xmlファイル作成

<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-java-test</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>4.9.1</version>
    </dependency>
	<dependency>
	  <groupId>com.amazonaws</groupId>
	  <artifactId>aws-lambda-java-core</artifactId>
	  <version>1.2.1</version>
	</dependency>

  </dependencies>
  
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.1.2</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/java/lib</outputDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  
</project>

「okhttp3」ライブラリを依存関係に設定、依存するライブラリを特定のディレクトリに格納する為、「maven-dependency-plugin」を使用するようにpom.xmlを作成します。

ビルドしたファイルは、以下のディレクトリに格納されます。

  • LambdaHandlerクラス:/target/lambda-java-test-1.0.0.jar
  • 依存関係ライブラリ:/target/java/lib以下

lambda作成

AWSにJavaのLambdaを作成し次のコードを使用します。ランタイムはjava11を使用。

1.LambdaHandlerクラス作成

Lambda実行のHandlerクラスを作成する。

package com.example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;

public class LambdaHandler implements RequestHandler<Object, String> {
  public String handleRequest(Object input, Context context) {
    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
      .url("https://www.distant-view.co.jp")
      .build();

    try (Response response = client.newCall(request).execute()) {
      return response.body().string();
    } catch (IOException e) {
      return "Error: " + e.getMessage();
    }
  }
}

2.ビルドを実行する。

LambdaHandlerファイルを作成したら次のコマンドを「lambda_java_test」ディレクトリで実行します。

npm clean package

このコマンドを実行すると、「/target/lambda-java-test-1.0.0.jar」に「LambdaHandler」のクラスファイルが格納され、「/target/java/lib」以下に依存関係のライブラリが格納されます。

3.Lambdaを作成する

今回はAWSの画面上で行いました。

ランタイムはjava11を使用。
Lambdaの名称は「layer_java_test」とします。
Javaの場合、AWS画面上にコードエディタが無いので、「/target/lambda-java-test-1.0.0.jar」をアップロードします。

Layer作成

1.依存関係ディレクトリをzip化

「/target/java/lib」のjavaディレクトリ以下をzip化します。

2.Layerの作成

aws cliで先ほどzip化したファイルを指定してLayerの作成をします。(ここはAWSの画面で作成してzipファイルをアップロードする方法でも良いです)

 aws lambda publish-layer-version --layer-name java-layer --zip-file fileb://java.zip --compatible-runtimes java11

3.作成したLayerをLambdaに設定する。これは画面でやりました。

動作確認

正常に動作すると、指定URLのhtmlのコードが返ってきます。
これは、画面からテストで実行しても良いしコマンド実行しても良いです。
コマンドの実行例を下記に記述しておきます。

aws lambda invoke --function-name layer_java_test --payload '{}' outputfile.txt

結果は以下の様なHtmlが返ってきます。(全部は載せてません)

<!DOCTYPE html>\n<html>\n<head prefix=\"og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#\">\n  <script src=\"/co

注意点

  • Javaのバージョンが合わないと、エラーが出る可能性があります。
  • zipの中身がjava/libのディレクトリが存在し、その中にライブラリのファイルがないと上手く動作しません。

最後に

以上、nodejsとjavaでlambdaのレイヤー利用を試してみました。レイヤーにアップロードするzip内のディレクトリ名が適切でないと上手く動作しない点など分かりました。
その点が適切にすればレイヤー使用が上手くいく事も分かりました。

続けてお読みください

[AWS]IAMユーザのEC2への操作権限付与

この記事をシェアする
  • Facebookアイコン
  • Twitterアイコン
  • LINEアイコン

お問い合わせ ITに関するお悩み不安が少しでもありましたら、
ぜひお気軽にお問い合わせください

お客様のお悩みや不安、課題などを丁寧に、そして誠実にお伺いいたします。

お問い合わせはこちら
お電話でのお問い合わせ 03-5820-1777(平日10:00〜18:00)
よくあるご質問