ラムダ層とJavaランタイムとの使い方


Serverless関数を開発するときは、関数のための追加依存関係やライブラリが必要です.Lambda functions in javaには、関数で使用されるサービスのAmazon依存性が必要です.関数とその依存関係をFAT JARにzipし、ラムダ関数にアップロードします.あなたがJavaでラムダ関数を作成することに慣れていないならば、速いスタートのためにthisポストを参照してください.
FAT JARアプローチはうまく機能しますが、同じ依存関係を使用して各機能のFAT jarを作成する複数の関数がある場合は、そのようなコードの良いアプローチやメンテナンスは困難です.JARのバージョンの変更は、個々のラムダ関数の変更を必要とします.
よりエレガントな解決は、λ層を使用することです.

ラムダ層とは何か


レイヤーは、ライブラリ、カスタムランタイム、またはその他の依存関係を含むZIPアーカイブです.レイヤーを使用すると、展開パッケージに含める必要がなく、機能を使用してライブラリを使用できます.層は展開パッケージを小さくし、開発を容易にします.
レイヤーは、関数実行環境で/optディレクトリに抽出されます.各ランタイムは/optの下で異なる場所のライブラリを探します.
関数の設定中、または関数の作成後に、5層までを指定できます.使用するレイヤーの特定のバージョンを選択します.後で別のバージョンを使用する場合は、関数の設定を更新します.

行動しましょう


ラムダ環境変数やイベントの詳細を表示する基本的なラムダ関数を書きます.2つのMavenプロジェクトを作成します.最初のプロジェクトでは、Amazonやその他の重要な依存関係が含まれます.このプロジェクトはラムダ層となる.番目のプロジェクトでは、依存関係として最初のプロジェクトを含み、ラムダハンドラを書き込みます.
次のように、最初のMavenプロジェクトを作成します.
このプロジェクトは、関数によって要求されるすべての一般的な依存関係を含みます.この場合、lamdba-coregsonの依存関係が追加されました.また、脂肪の瓶を作成するmaven-shade-pluginを追加しました.
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.rajanpanchal</groupId>
    <artifactId>lambda-layer-base</artifactId>
    <version>1</version>
    <name>Lambda-Layer-Base</name>
    <description>Lambda base</description>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <aws.java.sdk.version>2.14.11</aws.java.sdk.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>${aws.java.sdk.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-core</artifactId>
            <version>1.2.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

このプロジェクトは依存関係を含んでいます.Maven clean installを実行し、ターゲットフォルダにJAR(lambda-layer-base-1.jar)を生成します.
別のMavenプロジェクトを作成し、以下の内容でPOMを更新します.我々は依存関係として我々の最初のプロジェクトを含んだ(lambda-layer-base).また、依存関係がjarに含まれていないので、もはやMaven Sideプラグインを使用しません.
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.rajanpanchal</groupId>
    <artifactId>lambda-java-demo</artifactId>
    <version>1</version>
    <packaging>jar</packaging>
    <name>Lambda-Layers-Demo</name>
    <description>HelloWorld Lambda Layers Demo</description>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <aws.java.sdk.version>2.14.11</aws.java.sdk.version>
    </properties>
    <dependencies>
    <dependency>
        <groupId>net.rajanpanchal</groupId>
        <artifactId>lambda-layer-base</artifactId>
        <version>1</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

ラムダロジックを含むsrc/main/javaにクラスファイルを追加します.ここでは、我々はちょうど若干のものを記録しています.
package net.rajanpanchal.handlers;

import java.util.Map;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class HelloWorldHandler implements RequestHandler<Map<String,String>, String>{

      public String handleRequest(Map<String,String> event, Context context)
      {
        LambdaLogger logger = context.getLogger();
        String response = new String("200 OK");
        logger.log("ENVIRONMENT:"+System.getenv());
        // log execution details
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv()));
        logger.log("CONTEXT: " + gson.toJson(context));
        // process event
        logger.log("EVENT: " + gson.toJson(event));
        logger.log("EVENT TYPE: " + event.getClass().toString());
        return response;
      }
    }

Maven packageコマンドを実行して、プロジェクトのjarファイルを作成します.ターゲットフォルダにJAR(lambda-java-demo-1.jar)を作成します.

レイヤーの作成


レイヤーを作成するためにコンソールに向かう前に、1つの重要なステップを完了しましょう.レイヤーが/optディレクトリのフォルダに抽出されるのを思い出してください.あなたのランタイムごとにフォルダー構造のレイヤーをパッケージ化する必要があります.Javaの場合は、パッケージをjava/libフォルダにパッケージする必要があります.ラムダ実行時の最終フォルダ構造は/opt/java/lib/<your jar>である.だから今最初のプロジェクトからフォルダをJava/libとコピーjarファイルを作成し、フォルダをzipします.今、我々はラムダ層としてjarファイルをアップロードする準備が整いました.

ラムダ関数の作成


ラムダ関数を作成し、作成したレイヤーを指定します.また、2番目のプロジェクトからJARを関数コードとしてアップロードします.

関数にレイヤーを追加する

アップロード機能コード

テストイベントを作成し、テストを実行します.

ソースコード:



結論


ラムダ層はあなたの開発を容易にし、エラーフリーです.機能展開パッケージのサイズを縮小します.複数の関数で同じレイヤーを使用できます.
あなたがポストのような場合は、無料で共有し、更新のための私に従ってください!