シリーズのパート 1 では、GraalVM、特にそのネイティブ イメージ機能について紹介しました。サーバーレス アプリケーションに対する利点についても説明しました。シリーズのこのパートでは、GraalVM ネイティブ イメージを含むカスタム ランタイムを使用して AWS Lambda 関数を開発およびデプロイする方法を説明します。
説明のために、サンプル アプリケーションを使用します。このアプリケーションでは、製品を作成および取得し、NoSQL データベースとして DynamoDB を使用します。 「Java 21 Lambda コールド スタートの測定」の記事で紹介したアプリケーションを再利用し、GraalVM Native Image を含む Lambda カスタム ランタイムとしてデプロイされるように調整します。
GraalVM ネイティブ イメージを構築するには、次のことを行う必要があります:
curl -s "https://get.sdkman.io" | bash source "/home/ec2-user/.sdkman/bin/sdkman-init.sh"
sdk install java 22.0.1-graal (or use the newest GraalVM version)
sudo yum install gcc glibc-devel zlib-devel sudo dnf install gcc glibc-devel zlib-devel libstdc++-static
wget https://mirrors.estointernet.in/apache/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz tar -xvf apache-maven-3.8.5-bin.tar.gz sudo mv apache-maven-3.8.5 /opt/ M2_HOME='/opt/apache-maven-3.8.5' PATH="$M2_HOME/bin:$PATH" export PATH
このミラーが使用できなくなった場合は、オペレーティング システムで使用可能な別のミラーを使用してください。
サンプル アプリケーションを GraalVM ネイティブ イメージとして実行するには、リフレクションごとにオブジェクトがインスタンス化されるすべてのクラスを宣言する必要があります。これらのクラスは、コンパイル時に AOT コンパイラーによって認識される必要がありました。これはreflect.jsonで発生します。 ご覧のとおり、そこで宣言する必要があります
「ネイティブ イメージでのクラスの初期化」の記事で説明されている初期化中のロガーでのエラーを回避するには、native-image.properties に GraalVM ネイティブ イメージのビルド引数を追加する必要があります。
curl -s "https://get.sdkman.io" | bash source "/home/ec2-user/.sdkman/bin/sdkman-init.sh"
native-image.properties は META-INF/native-image/${MavenGroupIid}/${MavenArtifactId} に配置する必要があります
pom.xml で slf4j-simple Logger を使用するため、native-image.properties をパス META-INF/native-image/org.slf4j/slf4j-simple に配置する必要があります。
Lambda 関数をカスタム ランタイムとしてデプロイするには、.zip 拡張子を持つファイルにすべてをパッケージ化する必要があります。これには、bootstrap という名前のファイルが含まれます。このファイルは、この例では GraalVM ネイティブ イメージであるか、別のファイルに配置された GraalVM ネイティブ イメージを呼び出す方法の指示を含んでいます。 調べてみましょう。
pom.xml で定義されたパッケージフェーズで GraalVM ネイティブイメージを自動的に構築します。 関連する部分は次のプラグインで定義されています:
sdk install java 22.0.1-graal (or use the newest GraalVM version)
org.graalvm.nativeimage ツールのnative-image-maven-pluginを使用し、パッケージフェーズでnative-imageを実行します。このプラグインには、Lambda 関数にはないメインクラスの定義が必要です。そのため、Lambda ランタイム GraalVM を使用し、そのメインクラス com.formkiq.lambda.runtime.graalvm.LambdaRuntime を定義します。 Lambda ランタイム GraalVM は、Java プログラミング言語で書かれた AWS Lambda を GraalVM に簡単に変換できる Java ライブラリです。以前に pom.xml で依存関係
として定義しました。
sudo yum install gcc glibc-devel zlib-devel sudo dnf install gcc glibc-devel zlib-devel libstdc++-static
次に、ネイティブ イメージ名 aws-pure-lambda-java21-graalvm-native-image を指定し、いくつかの GraalVM ネイティブ イメージ引数と以前に定義した reflect.json を含めます。
wget https://mirrors.estointernet.in/apache/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz tar -xvf apache-maven-3.8.5-bin.tar.gz sudo mv apache-maven-3.8.5 /opt/ M2_HOME='/opt/apache-maven-3.8.5' PATH="$M2_HOME/bin:$PATH" export PATH
構築された GraalVM ネイティブ イメージを Lambda Custom Runtime に必要な function.zip として圧縮するには、maven-assembly プラグインを使用します。
Args=--allow-incomplete-classpath \ --initialize-at-build-time=org.slf4j.simple.SimpleLogger,\ org.slf4j.LoggerFactory -- --trace-class-initialization=org.slf4j.simple.SimpleLogger,\ org.slf4j.LoggerFactory
finalName を function として定義し、ID を native-zip として定義します。native.xml アセンブリも含まれます。このアセンブリは、ファイル形式を zip (完全なファイル名は ${finalName}-${id}.zip、この場合は function-native-zip.zip になります) として定義し、以前にビルドした GraalVM ネイティブ イメージを aws-pure-lambda-java21-graalvm-native-image と、基本的に GraalVM ネイティブ イメージを呼び出す定義済みのブートストラップを追加します:
<plugin> <groupId>org.graalvm.nativeimage</groupId> <artifactId>native-image-maven-plugin</artifactId> <version>21.2.0</version> <executions> <execution> <goals> <goal>native-image</goal> </goals> <phase>package</phase> </execution> </executions> <configuration> <skip>false</skip> <mainClass>com.formkiq.lambda.runtime.graalvm.LambdaRuntime</mainClass> <imageName>aws-pure-lambda-java21-graalvm-native-image</imageName> <buildArgs> --no-fallback --enable-http -H:ReflectionConfigurationFiles=../src/main/reflect.json </buildArgs> </configuration> </plugin>
<dependency> <groupId>com.formkiq</groupId> <artifactId>lambda-runtime-graalvm</artifactId> <version>2.3.1</version> </dependency>
provided.al2023 (カスタム ランタイムの最新バージョン) として指定し、以前に構築された GraalVM ネイティブ イメージ function-native-zip へのパスを提供します。 zip.
<buildArgs> --no-fallback --enable-http -H:ReflectionConfigurationFiles=../src/main/reflect.json </buildArgs>
を使用してアプリケーションをデプロイする準備ができました。
curl -s "https://get.sdkman.io" | bash source "/home/ec2-user/.sdkman/bin/sdkman-init.sh"
シリーズのこのパートでは、GraalVM Native Image を含むカスタム ランタイムを使用して AWS Lambda 関数を開発およびデプロイする方法について説明しました。シリーズの次のパートでは、Lambda 関数のさまざまなメモリ設定のこのようなシナリオで、Lambda 関数のコールド スタート時間とウォーム スタート時間を測定します。
以上がGraalVM ネイティブ イメージを使用した Lambda 関数 - カスタム ランタイムを使用して Lambda 関数を開発およびデプロイするパートフローの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。