使用 Java Lambda 函數的層 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Java Lambda 函數的層

使用 Lambda 層來封裝您要在多個函數之間重複使用的程式碼和相依性。層通常具備程式庫相依性、自訂執行期或組態檔案。建立層包含三個一般步驟:

  1. 封裝層內容。這表示建立 .zip 封存檔,其中包含您要在函數中使用的相依項。

  2. 在 Lambda 中建立層。

  3. 將層新增至函數中。

本主題包含步驟和指導,說明如何正確封裝和建立具有外部程式庫相依項的 Java Lambda 層。

先決條件

若要完成本節中的步驟,您必須執行下列各項:

注意

確定 Maven 引用的 Java 版本與您打算部署的函數的 Java 版本相同。例如,對於 Java 21 函數,mvn -v 命令應該在輸出中列出 Java 版本 21:

Apache Maven 3.8.6 ... Java version: 21.0.2, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home ...

在本主題中,我們會參考 awsdocs GitHub 儲存庫上的 layer-java 範例應用程式。此應用程式包含下載相依項並產生層的腳本。應用程式也包含使用層相依項的對應函數。建立層之後,您可以部署並調用對應的函數,以驗證一切是否正常運作。由於您針對函數使用 Java 21 執行時期,因此層也必須與 Java 21 相容。

layer-java 範例應用程式在兩個子目錄中包含一個範例。layer 目錄包含定義層相依項的 pom.xml 檔案,以及產生層的指令碼。function 目錄包含一個範例函數,可協助測試層是否正常運作。本教學課程將逐步說明如何建立和封裝此層。

Java 執行時期的層路徑

將層新增至函數時,Lambda 會將層內容載入該執行環境的 /opt 目錄。在每一次 Lambda 執行期中,PATH 變數已包含 /opt 目錄中的特定資料夾路徑。為了確保 Lambda 取得您的 layer 內容,您的 layer .zip 檔案應該在以下資料夾路徑中具有其相依性:

  • java/lib

例如,您在本教學課程中建立的層 .zip 檔案具有下列目錄結構:

layer_content.zip └ java └ lib └ layer-java-layer-1.0-SNAPSHOT.jar

layer-java-layer-1.0-SNAPSHOT.jar JAR 檔案 (包含所有必要相依項的 uber-jar) 正確位於 java/lib 目錄中。這可確保 Lambda 可以在函數調用期間找到程式庫。

封裝層內容

在此範例中,您將下列兩個 Java 程式庫封裝為一個 JAR 檔案:

  • aws-lambda-java-core – 在 中使用 Java 的一組最少介面定義 AWS Lambda

  • Jackson – 熱門的資料處理工具套件,特別適合在處理 JSON 時使用。

請完成下列步驟,以安裝和封裝層內容。

若要安裝和封裝層內容
  1. 複製 aws-lambda-developer-guide GitHub 儲存庫,其中包含您在 sample-apps/layer-java 目錄中需要的範例程式碼。

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. 導覽至 layer-java 範例應用程式的 layer 目錄。此目錄包含您用來正確建立和封裝層的指令碼。

    cd aws-lambda-developer-guide/sample-apps/layer-java/layer
  3. 檢查 pom.xml 檔案。在 <dependencies> 區段中,您可以定義要包含在層中的相依項,也就是 aws-lambda-java-corejackson-databind 程式庫。您可以更新此檔案,加入想要包含在自己的層中的任何相依項。

    範例 pom.xml
    <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.0</version> </dependency> </dependencies>
    注意

    pom.xml 檔案的 <build> 區段包含兩個外掛程式。maven-compiler-plugin 會編譯原始程式碼。maven-shade-plugin 會將您的成品封裝至一個 uber-jar 中。

  4. 確定您有執行這兩個指令碼的許可。

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. 使用以下命令來執行 1-install.sh 指令碼:

    ./1-install.sh

    此指令碼會在目前的目錄中執行 mvn clean install。這樣會建立 uber-jar,其中包含 target/ 目錄中的所有必要相依項。

    範例 1-install.sh
    mvn clean install
  6. 使用以下命令來執行 2-package.sh 指令碼:

    ./2-package.sh

    此指令碼會建立正確封裝層內容所需的 java/lib 目錄結構。接著,它會從 /target 目錄將 uber-jar 複製到新建立的 java/lib 目錄。最後,指令碼會將 java 目錄的內容壓縮成名為 layer_content.zip 的檔案。這是層的 .zip 檔案。您可以解壓縮該檔案,並確認其包含正確的檔案結構,如Java 執行時期的層路徑一節所示。

    範例 2-package.sh
    mkdir java mkdir java/lib cp -r target/layer-java-layer-1.0-SNAPSHOT.jar java/lib/ zip -r layer_content.zip java

建立層

在本節中,您會取得您在上一節中產生的 layer_content.zip 檔案,並將其上傳為 Lambda 層。您可以使用 AWS Management Console 或 Lambda API 透過 AWS Command Line Interface () 上傳圖層AWS CLI。當您上傳 layer .zip 檔案時,請在下列 PublishLayerVersion AWS CLI 命令中,將 指定java21為相容的執行期,並將 指定arm64為相容的架構。

aws lambda publish-layer-version --layer-name java-jackson-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes java21 \ --compatible-architectures "arm64"

從回應中記下 LayerVersionArn,它類似於 arn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1。在本教學課程的下一個步驟中,當您將層新增至函數時,將需要此 Amazon Resource Name (ARN)。

將層新增至函數

在本節中,您需要部署一個在函數程式碼中使用 Jackson 程式庫的範例 Lambda 函數,然後連接層。若要部署函數,您需要使用執行角色定義 Lambda 函數許可。如果沒有現有的執行角色,請依可摺疊區段中的步驟操作。

若要建立執行角色
  1. 在 IAM 主控台中開啟角色頁面

  2. 選擇建立角色

  3. 建立具備下列屬性的角色。

    • 信任實體 - Lambda

    • 許可 - AWSLambdaBasicExecutionRole

    • 角色名稱 - lambda-role

    AWSLambdaBasicExecutionRole 政策具備函數將日誌寫入到 CloudWatch Logs 時所需的許可。

Lambda 函數程式碼採用 Map<String, String> 做為輸入,並使用 Jackson 將輸入寫成 JSON 字串,再將其轉換為預先定義的 F1Car Java 物件。最後,函數使用 F1Car 物件中的欄位建構函數傳回的字串。

package example; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Map; public class Handler { public String handleRequest(Map<String, String> input, Context context) throws IOException { // Parse the input JSON ObjectMapper objectMapper = new ObjectMapper(); F1Car f1Car = objectMapper.readValue(objectMapper.writeValueAsString(input), F1Car.class); StringBuilder finalString = new StringBuilder(); finalString.append(f1Car.getDriver()); finalString.append(" is a driver for team "); finalString.append(f1Car.getTeam()); return finalString.toString(); } }
若要部署 Lambda 函數
  1. 導覽至 function/ 目錄。如果您目前在 layer/ 目錄中,則執行下列命令:

    cd ../function
  2. 使用下列 Maven 命令建置專案:

    mvn package

    此命令會在名為 layer-java-function-1.0-SNAPSHOT.jartarget/ 目錄中產生 JAR 檔案。

  3. 部署函數。在下列 AWS CLI 命令中,將 --role 參數取代為您的執行角色 ARN:

    aws lambda create-function --function-name java_function_with_layer \ --runtime java21 \ --architectures "arm64" \ --handler example.Handler::handleRequest \ --timeout 30 \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://target/layer-java-function-1.0-SNAPSHOT.jar
  4. 接著,將層連接至您的函數。在下列 AWS CLI 命令中,將 --layers 參數取代為您先前記下的 layer 版本 ARN:

    aws lambda update-function-configuration --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1"
  5. 最後,嘗試使用以下 AWS CLI 命令叫用您的 函數:

    aws lambda invoke --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "driver": "Max Verstappen", "team": "Red Bull" }' response.json

    您應該會看到類似下面的輸出:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    這表示函數能夠使用 Jackson 相依項,所以能夠正確執行函數。您可以檢查輸出 response.json 檔案是否包含正確的傳回字串:

    "Max Verstappen is a driver for team Red Bull"

除非您想要保留為此教學課程建立的資源,否則您現在便可刪除。透過刪除您不再使用 AWS 的資源,您可以避免不必要的 費用 AWS 帳戶。

若要刪除 Lambda 層
  1. 開啟 Lambda 主控台中的層頁面

  2. 選取您建立的層。

  3. 選擇刪除,然後再次選擇刪除

若要刪除 Lambda 函數
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇您建立的函數。

  3. 選擇 Actions (動作)、Delete (刪除)。

  4. 在文字輸入欄位中輸入 confirm,然後選擇 刪除