在本系列的第 1 部分中,我们介绍了 GraalVM,特别是它的 Native Image 功能。我们还解释了它对无服务器应用程序的好处。在本系列的这一部分中,我们将解释如何使用包含 GraalVM Native Image 的自定义运行时来开发和部署 AWS Lambda 函数。
为了解释起见,我们将使用我们的示例应用程序。在此应用程序中,我们将创建和检索产品并使用 DynamoDB 作为 NoSQL 数据库。我们将重用测量 Java 21 Lambda 冷启动一文中介绍的应用程序,并将其调整为部署为包含 GraalVM 本机映像的 Lambda 自定义运行时。
为了构建 GraalVM Native Image,我们需要执行以下操作:
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 Native Image 运行,我们需要声明每次反射将实例化对象的所有类。 AOT 编译器在编译时需要知道这些类。这发生在reflect.json 中。 正如我们所看到的,我们需要在那里声明
为了避免在本机映像中的类初始化一文中描述的初始化期间记录器出现错误,我们需要在 native-image.properties 中添加 GraalVM Native Image 构建参数。
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 Native 镜像。 相关部分在以下插件中定义:
sdk install java 22.0.1-graal (or use the newest GraalVM version)
我们使用org.graalvm.nativeimage工具中的native-image-maven-plugin,并在打包阶段执行native-image。该插件需要主类的定义,而 Lambda 函数没有。这就是我们使用 Lambda Runtime GraalVM 并定义其主类 com.formkiq.lambda.runtime.graalvm.LambdaRuntime 的原因。 Lambda 运行时 GraalVM 是一个 Java 库,可以轻松地将用 Java 编程语言编写的 AWS Lambda 转换为 GraalVM。我们之前在 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 Native Image 压缩为 Lambda Custom Runtime 所需的 function.zip,我们使用 maven-assemble 插件:
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 Native Image,其名称为 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>
最后,我们必须构建打包为 zip 文件的 GraalVM 本机映像,该映像可以使用以下命令部署为 Lambda 自定义运行时:
<dependency> <groupId>com.formkiq</groupId> <artifactId>lambda-runtime-graalvm</artifactId> <version>2.3.1</version> </dependency>
在 AWS SAM 模板中,我们将 Lambda 运行时设置为 provided.al2023(这是自定义运行时的最新版本),并提供之前构建的 GraalVM Native Image function-native-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 Native Image 的 Lambda 函数 - 使用自定义运行时开发和部署 Lambda 函数的部分内容的详细内容。更多信息请关注PHP中文网其他相关文章!