首頁 > Java > java教程 > 主體

帶有 GraalVM Native Image 的 Lambda 函數 - 使用自訂運行時開發和部署 Lambda 函數的部分內容

Mary-Kate Olsen
發布: 2024-10-21 16:16:30
原創
831 人瀏覽過

介紹

在本系列的第 1 部分中,我們介紹了 GraalVM,特別是它的 Native Image 功能。我們還解釋了它對無伺服器應用程式的好處。在本系列的這一部分中,我們將說明如何使用包含 GraalVM Native Image 的自訂執行階段來開發和部署 AWS Lambda 函數。

申請樣本

為了解釋起見,我們將使用我們的範例應用程式。在此應用程式中,我們將建立和檢索產品並使用 DynamoDB 作為 NoSQL 資料庫。我們將重複使用測量 Java 21 Lambda 冷啟動一文中介紹的應用程序,並將其調整為部署為包含 GraalVM 本機映像的 Lambda 自訂執行時間。

Lambda function with GraalVM Native Image - Part ow to develop and deploy Lambda function with custom runtime

常規設定

為了建構 GraalVM Native Image,我們需要執行以下操作:

  • 設定 m5.large AWS Cloud9 EC2 執行個體。您當然可以使用自己的(本地)Linux 環境。
  • 安裝SDKMAN
curl -s "https://get.sdkman.io" | bash  

source "/home/ec2-user/.sdkman/bin/sdkman-init.sh"
登入後複製
登入後複製
登入後複製
  • 安裝最新的 GraalVM 版本。我在範例中使用了版本 22(但您可以使用最新的版本):
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
登入後複製
登入後複製
  • 安裝能夠使用已安裝的 GraalVM 版本進行建置的 Maven。我們需要能夠處理 Java 21 及更高版本原始程式碼的 Maven 版本。例如 :
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 功能

為了讓我們的範例應用程式作為 GraalVM Native Image 運行,我們需要聲明每次反射將實例化物件的所有類別。 AOT 編譯器在編譯時需要知道這些類別。這發生在reflect.json 中。 正如我們所看到的,我們需要在那裡聲明

  • 我們所有的 Lambda 函數,例如 GetProductByIdHandler 和 CreateProductHandler
  • 實體,例如產品和將從 JSON 負載轉換回來的產品
  • APIGatewayProxyRequestEvent 及其所有內部類,因為我們在 GetProductByIdHandler 和 CreateProductHandler 等 Lambda 函數中將此事件類型宣告為請求事件
  • org.joda.time.DateTime 將用於將時間戳與字串相互轉換,這是 APIGateway 代理請求和回應事件的一部分

為了避免在本機映像中的類別初始化一文中所述的初始化期間記錄器出現錯誤,我們需要在 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 自訂運行時

為了將 Lambda 函數部署為自訂運行時,我們需要將所有內容打包到副檔名為 .zip 的檔案中,其中包含名為 bootstrap 的檔案。在我們的範例中,該檔案可以是 GraalVM 本機映像,也可以包含如何呼叫放置在另一個檔案中的 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>
登入後複製

將 GraalVM 本機映像部署為 Lambda 自訂執行時間

在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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!