使用 Java Lambda 函數的圖層 - AWS Lambda

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

使用 Java Lambda 函數的圖層

Lambda 層是包含補充代碼或數據的 .zip 文件歸檔。層通常具備程式庫相依性、自訂執行期或組態檔案。建立圖層包含三個一般步驟:

  1. Package 圖層內容。這意味著創建一個包含要在函數中使用的依賴關係的 .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錄包含範例函數,可協助測試圖層是否有效。本自學課程將逐步介紹如何建立和封裝此圖層。

與 Amazon Linux 的 Java 層兼容性

建立層的第一步是將所有層內容綁定至 .zip 封存檔。由於 Lambda 函數是在 Amazon Linux 上執行,因此您的層內容必須能夠在 Linux 環境中編譯和建置。

Java 代碼被設計為獨立於平台,因此即使它不使用 Linux 環境,您也可以將圖層打包到本地計算機上。將 Java 層上傳到 Lambda 之後,它仍然可以與 Amazon Linux 兼容。

Java 執行階段的圖層路徑

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

  • java/lib

例如,您在此自學課程中建立的產生圖層 .zip 檔案具有以下目錄結構:

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

layer-java-layer-1.0-SNAPSHOT.jarJAR文件(包含我們所有必需的依賴關係的 uber-jar)正確位於目錄中。java/lib這可確保 Lambda 可以在函數叫用期間找到程式庫。

封裝圖層內容

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

  • aws-lambda-java-core— 一組最小的介面定義,可在中使用 Java AWS Lambda

  • 傑克遜-一套流行的數據處理工具,特別是與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目錄結構。然後,它將 uber-jar 從目錄複製到新創建的/target目錄中。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 Command Line Interface (AWS CLI) 使用 AWS Management Console 或 Lambda 上API傳圖層。上傳圖層 .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 資源名稱(ARN)。

將圖層添加到您的函數

在本節中,您將在函數程式碼中部署使用 Jackson 程式庫的範例 Lambda 函數,然後附加圖層。要部署該功能,您需要一個使用執行角色定義 Lambda 函數許可. 如果您沒有現有的執行角色,請依照可摺疊區段中的步驟執行。

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

  2. 選擇 建立角色

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

    • 信任實體 - Lambda

    • 權限AWSLambdaBasicExecutionRole.

    • 角色名稱 - lambda-role

    AWSLambdaBasicExecutionRole策略具有函數將日誌寫入日誌所需的 CloudWatch 權限。

Lambda 函數代碼接受一個Map<String, String>作為輸入,並使用傑克遜將其轉換為預定義的 F1Car Java 對象之前將輸入寫入為JSON字符串。最後,函數會使用 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

    這個命令會在名為的target/目錄中產生一個JAR檔案layer-java-function-1.0-SNAPSHOT.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參數取代為您先前提到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" }

    這表明該功能能夠使用傑克遜依賴關係來正確執行該功能。您可以檢查輸出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. 在文字輸入欄位中輸入 delete,然後選擇 刪除