在本系列的第 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中文網其他相關文章!