AWS LambdaJava 中的 函數處理常式 - AWS Lambda

AWS LambdaJava 中的 函數處理常式

Lambda 函數處理常式是您的函數程式碼中處理事件的方法。當有人呼叫您的函數時,Lambda 會執行處理常式方法。當處理常式結束或傳回回應時,就可以處理另一個事件。

在下列範例中,名為 Handler 的類別會定義名為 handleRequest 的處理常式方法。處理常式方法會將一個事件和內容物件作為輸入,並傳回一個字串。

範例 Handler.java

package example; import com.amazonaws.services.lambda.runtime.Context import com.amazonaws.services.lambda.runtime.RequestHandler import com.amazonaws.services.lambda.runtime.LambdaLogger ... // Handler value: example.Handler public class Handler implements RequestHandler<Map<String,String>, String>{ Gson gson = new GsonBuilder().setPrettyPrinting().create(); @Override public String handleRequest(Map<String,String> event, Context context) { LambdaLogger logger = context.getLogger(); String response = new String("200 OK"); // log execution details logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv())); logger.log("CONTEXT: " + gson.toJson(context)); // process event logger.log("EVENT: " + gson.toJson(event)); logger.log("EVENT TYPE: " + event.getClass().toString()); return response; } }

Lambda 執行時間會以 JSON 格式的字串形式接收事件,並將其轉換為物件。它會將事件物件傳遞給您的函數處理常式,連帶提供有關呼叫與函數詳細資料的內容物件。您可以透過在函數的組態上設定處理常式參數來告知運行時間要呼叫哪個方法。

處理常式格式

  • package.Class::method - 完整格式。例如:example.Handler::handleRequest

  • package.Class - 實作處理常式介面函數的縮寫格式。例如:example.Handler

您可以在處理常式方法之外加入初始化程式碼,以便在多個呼叫中重複使用資源。當執行階段載入你的處理常式,它會運行靜態程式碼和類別建構函數。在初始化期間建立的資源會在呼叫之間保留在記憶體中,並且可供處理常式重複使用數千次。

在下列範例中,記錄器、序列化程式和 AWS SDK 用戶端會在函數提供其第一個事件時建立。由相同的函數執行個體提供的後續事件會比較快,因為這些資源早已存在。

範例 Handler.java - 初始化程式碼

// Handler value: example.Handler public class Handler implements RequestHandler<SQSEvent, String>{ private static final Logger logger = LoggerFactory.getLogger(Handler.class); private static final Gson gson = new GsonBuilder().setPrettyPrinting().create(); private static final LambdaAsyncClient lambdaClient = LambdaAsyncClient.create(); ... @Override public String handleRequest(SQSEvent event, Context context) { String response = new String(); // call Lambda API logger.info("Getting account settings"); CompletableFuture<GetAccountSettingsResponse> accountSettings = lambdaClient.getAccountSettings(GetAccountSettingsRequest.builder().build()); // log execution details logger.info("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv())); ...

本指南的 GitHub 儲存器提供易於部署的範例應用程式,以示範各種處理常式類型。如需詳細資訊,請參閱本主題的結尾內容

選擇輸入和輸出類型

您可以在處理常式方法的簽章中指定事件對應的物件類型。在上述範例中,Java 執行階段會將事件還原序列化為實作 Map<String,String> 介面的類型。字串到字符對應適用於如下的平面事件:

範例 Event.json - 天氣資料

{ "temperatureK": 281, "windKmh": -3, "humidityPct": 0.55, "pressureHPa": 1020 }

不過,每個欄位的值必須是字串或數字。如果事件包含具有物件作為值的欄位,執行階段無法將其還原序列化並傳回錯誤。

選擇與函數處理的事件資料搭配使用的輸入類型。您可以使用基本類型或已妥善定義的類型。

輸入類型

  • Integer LongDouble、等等 - 事件是沒有其他格式的數字,例如 3.5。執行階段會將值轉換為指定類型的物件。

  • String - 事件是 JSON 字串,包括引號,例如 。"My string."執行階段會將值 (不含引號) 轉換為 String 物件。

  • TypeMap<String,Type> 等 - 該事件是一個 JSON 物件。執行階段會將它還原序列化為指定類型或介面的物件。

  • List<Integer> List<String>List<Object>、等等 - 該事件是一個 JSON 陣列。執行階段會將它還原序列化為指定類型或介面的物件。

  • InputStream - 該事件是任何 JSON 類型。執行階段會將文件的位元組串流傳遞給處理常式而不進行修改。您還原序列化輸入和並將輸出寫入輸出串流。

  • 程式庫類型 - 對於 AWS 服務傳送的事件,請使用 aws-lambda-java-events 程式庫中的類型。

如果您定義自己的輸入類型,則此物件應該為可還原序列化且可變動的普通舊型 Java 物件 (POJO),具備適用於事件中每個欄位的預設建構函數和屬性。事件中未對應至屬性的金鑰以及未包含在事件中的屬性都會遭捨棄且不會發生錯誤。

輸出類型可以是物件或 void。執行階段會將傳回的值序列化為文字。如果輸出是具有欄位的物件,執行階段會將其序列化為 JSON 文件。如果它是一個包裝基本值的類型,執行階段會傳回代表該值的文字。

處理程式界面

aws-lambda-java-core 程式庫會定義處理常式方法的兩個介面。使用提供的介面來簡化處理常式組態,並在編譯階段驗證處理常式方法簽章。

RequestHandler 介面是一個一般類型,它有兩個參數:輸入類型和輸出類型。兩種類型都必須是物件。當您使用此介面時,Java 執行階段會將事件還原序列化為具有輸入類型的物件,並將輸出序列化為文字。當內建序列化與您的輸入和輸出類型一同作業時,請使用此介面。

範例 Handler.java - 處理常式介面

// Handler value: example.Handler public class Handler implements RequestHandler<Map<String,String>, String>{ @Override public String handleRequest(Map<String,String> event, Context context)

若要使用您自己的序列化,請實作 RequestStreamHandler 介面。透過此介面,Lambda 會將處理常式傳遞給一個輸入串流和輸出串流。處理常式會從輸入串流讀取位元組,寫入到輸出串流,並傳回 void 值。

下面的例子會使用緩衝的讀取器和寫入器類型以與輸入和輸出串流一起作業。它會使用 Gson 程式庫進行序列化和還原序列化。

範例 HandlerStream.java

import com.amazonaws.services.lambda.runtime.Context import com.amazonaws.services.lambda.runtime.RequestStreamHandler import com.amazonaws.services.lambda.runtime.LambdaLogger ... // Handler value: example.HandlerStream public class HandlerStream implements RequestStreamHandler { Gson gson = new GsonBuilder().setPrettyPrinting().create(); @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { LambdaLogger logger = context.getLogger(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("US-ASCII"))); PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream, Charset.forName("US-ASCII")))); try { HashMap event = gson.fromJson(reader, HashMap.class); logger.log("STREAM TYPE: " + inputStream.getClass().toString()); logger.log("EVENT TYPE: " + event.getClass().toString()); writer.write(gson.toJson(event)); if (writer.checkError()) { logger.log("WARNING: Writer encountered an error."); } } catch (IllegalStateException | JsonSyntaxException exception) { logger.log(exception.toString()); } finally { reader.close(); writer.close(); } } }

範例處理常式程式碼

本指南的 GitHub 儲存庫包含示範各種處理常式類型和介面使用方式的範例應用程式。每個範例應用程式都包含可輕鬆部署和清理的指令碼、AWS SAM 範本和支援資源。

以 Java 編寫的範例 Lambda 應用程式

  • blank-java - 一種 Java 函數,它示範如何使用 Lambda 的 Java 程式庫、記錄、環境變數、層、AWS X-Ray 追蹤、單元測試和 AWS 開發套件。

  • java-basic - 具有單元測試和變數日誌記錄組態的最小 Java 函數。

  • java-events - 使用 aws-lambda-java-events 程式庫最新版本 (3.0.0 及更新版本) 的最小 Java 函數。這些範例不需要 AWS 開發套件做為相依項目。

  • s3-java - 一種 Java 函數,它處理來自 Amazon S3 的通知事件,並使用 Java Class Library (JCL) 以從上傳的映像檔案建立縮圖。

blank-javas3-java 應用程式會將 AWS 服務事件作為輸入並傳回字串。java-basic 應用程式包含數種類型的處理常式:

若要測試不同的處理常式類型,只需更改 AWS SAM 範本中的處理常式即可。如需詳細說明,請參閱範例應用程式的讀我檔案。