構建自定義運行時 AWS Lambda - AWS Lambda

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

構建自定義運行時 AWS Lambda

您可以在任何程式設計語言中實作 AWS Lambda 執行階段。執行時間是一款程式,它會在調用 Lambda 函數時執行該函數的處理常式方法。您可將執行期納入函數的部署套件或是在中分發。建立 Lambda 函數時,選擇僅限作業系統的執行期 (provided 執行期系列)。

注意

建立自訂執行期是一種進階使用案例。如果您正在尋找有關編譯為本機二進製文件或使用第三方 off-the-shelf 運行時的信息,請參閱僅限作業系統的執行階段 AWS Lambda

如需了解自訂執行期部署過程的演練,請參閱 教學課程:建置自訂執行期。您還可以在 awslab aws-lambda-cpp s/ 上探索在 C ++ 中實現的自定義運行時。 GitHub

要求

自訂執行階段必須完成特定的初始化和處理工作。執行期會執行函數的設定程式碼、從環境變數中讀取處理常式名稱,並從 Lambda 執行期 API 中讀取叫用事件。執行時間會將事件資料傳遞至函數處理常式,並將處理常式的回應發佈回 Lambda。

初始化任務

初始化任務是按照函式的每一執行個體各執行一次,以備妥用於處理調用的環境。

  • 擷取設定 - 讀取環境變數以取得關於函數和環境的詳細資訊。

    • _HANDLER - 處理常式所在位置,取自函數的組態。標準格式為 file.method,其中 file 是不含副檔名的檔案名稱,而 method 則是定義於該檔案內的方法或函式的名稱。

    • LAMBDA_TASK_ROOT - 包含函數程式碼的目錄。

    • AWS_LAMBDA_RUNTIME_API - 執行時間 API 的主機和連接埠。

    如需可用變數的完整清單,請參閱 定義執行時間環境變數

  • 初始化函數 - 載入處理常式檔案並執行其所包含的任何全域或靜態程式碼。函式應只建立一次靜態資源 (如開發套件用戶端和資料庫連線),以供多次調用時重複使用。

  • 處理錯誤 - 如果發生錯誤,則呼叫初始化錯誤 API 並立即退出。

初始化會計入計費執行時間和逾時。當執行觸發新函數執行個體的初始化時,您可以在記錄和 AWS X-Ray 追蹤中查看初始化時間。

範例 log
REPORT RequestId: f8ac1208... Init Duration: 48.26 ms Duration: 237.17 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 26 MB

處理任務

經執行後,執行時間會使用 Lambda 執行時間介面來管理傳入的事件並報告錯誤。初始化任務完成後,執行時間將以迴圈處理傳入的事件。在您的執行時間程式碼中,依序執行下列步驟。

  • 取得事件 - 呼叫下次調用 API 以取得下一個事件。回應內文包含事件資料。回應標頭包含請求 ID 及其他資訊。

  • 傳播追蹤標頭 - 從 API 回應中的 Lambda-Runtime-Trace-Id 標頭取得 X-Ray 追蹤標頭。使用相同的值在本機設定 _X_AMZN_TRACE_ID 環境變數。X-Ray 開發套件使用這個值來連接服務之間的追蹤資料。

  • 建立內容物件 - 建立含有內容資訊的物件,其資訊取自 API 回應中的環境變數和各標頭。

  • 調用函數處理常式 - 將事件與內容物件傳遞至處理常式。

  • 處理回應 - 呼叫調用回應 API 以發佈處理常式的回應。

  • 處理錯誤 - 如果發生錯誤,則呼叫調用錯誤 API。

  • 清理 - 釋放未使用的資源、傳送資料至其他服務,或是執行額外的任務後再取得下一個事件。

進入點

自訂執行時間的進入點是名為 bootstrap 的可執行檔。引導檔案可做為執行時間,也可以調用另一個建立執行時間的檔案。如果部署套件的根目錄不包含名為 bootstrap 的檔案,Lambda 會在函數的層中尋找該檔案。若 bootstrap 檔案不存在或不是可執行檔,函數會在調用時傳回 Runtime.InvalidEntrypoint 錯誤。

以下是使用 Node.js 的捆綁版本的示例bootstrap文件,在名為的單獨文件中 JavaScript 運行運行時runtime.js

範例 引導
#!/bin/sh cd $LAMBDA_TASK_ROOT ./node-v11.1.0-linux-x64/bin/node runtime.js

在自訂執行階段中實作回應串流

針對回應串流函數responseerror 端點稍微修改了行為,允許執行期將部分回應串流至用戶端,並以區塊形式傳回承載。如需特定行為的詳細資訊,請參閱以下內容:

  • /runtime/invocation/AwsRequestId/response - 傳播執行期的 Content-Type 標頭以傳送至用戶端。Lambda 透過 HTTP/1.1 區塊傳輸編碼,以區塊為單位傳回回應承載。回應串流的大小上限為 20 MiB。若要將回應串流至 Lambda,執行期必須:

    • Lambda-Runtime-Function-Response-Mode HTTP 標頭設為 streaming

    • Transfer-Encoding 標頭設為 chunked

    • 編寫符合 HTTP/1.1 區塊傳輸編碼規範的回應。

    • 成功編寫回應後會關閉基礎連線。

  • /runtime/invocation/AwsRequestId/error - 執行期可以使用此端點向 Lambda 報告函數或執行期錯誤,Lambda 也接受 Transfer-Encoding 標頭。只能在執行階段開始傳送叫用回應之前呼叫此端點。

  • /runtime/invocation/AwsRequestId/response 中使用錯誤尾端報告串流中間錯誤 - 若要報告在執行期開始編寫叫用回應後出現的錯誤,執行期可選擇連接名為 Lambda-Runtime-Function-Error-TypeLambda-Runtime-Function-Error-Body 的 HTTP 尾端標頭。Lambda 會將此視為成功回應,並將執行期提供的錯誤中繼資料轉送給用戶端。

    注意

    若要附加尾端標頭,執行階段必須在 HTTP 要求的開頭設定標頭值 Trailer。這是 HTTP/1.1 區塊傳輸編碼規範的要求。

    • Lambda-Runtime-Function-Error-Type - 執行期遇到的錯誤類型。此標頭包含一個字串值。Lambda 可接受任何字串,但我們建議使用格式 <category.reason>。例如 Runtime.APIKeyNotFound

    • Lambda-Runtime-Function-Error-Body - 有關錯誤的 Base64 編碼資訊。