本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Java Lambda 函數的圖層
Lambda 層是包含補充代碼或數據的 .zip 文件歸檔。層通常具備程式庫相依性、自訂執行期或組態檔案。建立圖層包含三個一般步驟:
-
Package 圖層內容。這意味著創建一個包含要在函數中使用的依賴關係的 .zip 文件歸檔。
-
在 Lambda 中建立圖層。
-
將圖層添加到您的函數中。
本主題包含如何使用外部程式庫相依性正確封裝和建立 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
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.jar
JAR文件(包含我們所有必需的依賴關係的 uber-jar)正確位於目錄中。java/lib
這可確保 Lambda 可以在函數叫用期間找到程式庫。
封裝圖層內容
在此範例中,您可以將下列兩個 Java 程式庫封裝到單一JAR檔案中:
-
aws-lambda-java-core
— 一組最小的介面定義,可在中使用 Java AWS Lambda -
傑克遜
-一套流行的數據處理工具,特別是與JSON.
完成下列步驟以安裝和封裝圖層內容。
安裝和封裝圖層內容的步驟
-
克隆存
aws-lambda-developer-guide
GitHub 儲庫,其中包含您在 sample-apps/layer-java
目錄中需要的示例代碼。git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
-
導覽至範
layer-java
例應用程式的layer
目錄。此目錄包含您用來建立和正確封裝圖層的程序檔。cd aws-lambda-developer-guide/sample-apps/layer-java/layer
-
檢查
pom.xml
檔案。在 <dependencies>
本節中,您可以定義要包括在圖層中的相依性,也就是aws-lambda-java-core
和jackson-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 中。 -
請確定您擁有執行這兩個指令碼的權限。
chmod 744 1-install.sh && chmod 744 2-package.sh
-
使用下列命令執行指令
1-install.sh
碼: ./1-install.sh
此腳本
mvn clean install
在當前目錄中運行。這將創建具有目錄中所有必需的依賴關係的 uber-jar。target/
範例 1-install.sh
mvn clean install
-
使用下列命令執行指令
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:
。當您將圖層添加到函數時,在本教程的下一步中,您將需要此 Amazon 資源名稱(ARN)。123456789012
:layer:java-jackson-layer:1
將圖層添加到您的函數
在本節中,您將在函數程式碼中部署使用 Jackson 程式庫的範例 Lambda 函數,然後附加圖層。要部署該功能,您需要一個使用執行角色定義 Lambda 函數許可. 如果您沒有現有的執行角色,請依照可摺疊區段中的步驟執行。
若要建立執行角色
-
在主控台中開啟角色頁IAM面
。 -
選擇 建立角色。
-
建立具備下列屬性的角色。
-
信任實體 - Lambda。
-
權限 — AWSLambdaBasicExecutionRole.
-
角色名稱 -
lambda-role
。
該AWSLambdaBasicExecutionRole策略具有函數將日誌寫入日誌所需的 CloudWatch 權限。
-
Lambda 函數代碼Map<String, String>
作為輸入,並使用傑克遜將其轉換為預定義的 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 函數
-
導覽至
function/
目錄。如果您目前位於目layer/
錄中,請執行下列命令:cd ../function
-
使用下面的 Maven 命令構建項目:
mvn package
這個命令會在名為的
target/
目錄中產生一個JAR檔案layer-java-function-1.0-SNAPSHOT.jar
。 -
部署功能。在下列 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 -
接下來,將圖層附加到功能上。在下列 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
" -
最後,嘗試使用以下 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 圖層
-
開啟 Lambda 主控台中的 層頁面
。 -
選取您建立的圖層。
-
選擇刪除,然後再次選擇刪除。
若要刪除 Lambda 函數
-
開啟 Lambda 主控台中的 函數頁面
。 -
選擇您建立的函數。
-
選擇 Actions (動作)、Delete (刪除)。
-
在文字輸入欄位中輸入
delete
,然後選擇 刪除 。