在 AWS Lambda 上執行 Web 應用程式的工具
AWS Lambda Web Adapter 允許開發人員使用熟悉的框架(例如Express.js、Next.js、Flask、SpringBoot、ASP.NET 和Laravel,任何支援HTTP 1.1/1.0 的框架)建立Web 應用程式(http api) 並在AWS Lambda 上運行。相同的 docker 映像可以在 AWS Lambda、Amazon EC2、AWS Fargate 和本機上運行。
AWS Lambda Web Adaptor 可與包裝為 docker 映像和 Zip 套件的 Lambda 函數搭配使用。
若要將 Lambda Web Adaptor 與 docker 映像結合使用,請將您的 Web 應用程式 (http api) 打包到 Dockerfile 中,然後新增一行以將 Lambda Web Adaptor 二進位檔案複製到容器內的 /opt/extensions:
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter
由於執行時間介面用戶端隨附 Lambda Web Adaptor,因此可以使用非 AWS 基礎映像。
預設情況下,Lambda Web Adaptor 假定 Web 應用程式正在偵聽連接埠 8080。
ECR 公用儲存庫中提供了預先編譯的 Lambda Web Adaptor 二進位檔案:public.ecr.aws/awsguru/aws-lambda-adapter。此儲存庫中還提供了多架構圖像。它適用於 x86_64 和 arm64 CPU 架構。
下面是範例 Nodejs 應用程式的 Dockerfile。
FROM public.ecr.aws/docker/library/node:20-slim
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter
ENV PORT=7000
WORKDIR "/var/task"
ADD src/package.json /var/task/package.json
ADD src/package-lock.json /var/task/package-lock.json
RUN npm install --omit=dev
ADD src/ /var/task
CMD [ "node" , "index.js" ]
這適用於 AWS 託管基礎映像以外的任何基礎映像。若要使用 AWS 託管基礎映像,您需要覆寫 ENTRYPOINT 才能啟動您的 Web 應用程式。
AWS Lambda Web Adaptor 也可以與 AWS 託管的 Lambda 執行時間搭配使用。你需要做三件事:
將 Lambda Web Adaptor 層附加到您的函數。
arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:23
arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerArm64:23
arn:aws-cn:lambda:cn-north-1:041581134020:layer:LambdaAdapterLayerX86:23
arn:aws-cn:lambda:cn-northwest-1:069767869989:layer:LambdaAdapterLayerX86:23
將 Lambda 環境變數AWS_LAMBDA_EXEC_WRAPPER
配置為/opt/bootstrap
。
將函數處理程序設定為您的 Web 應用程式啟動腳本。例如run.sh
有關詳細信息,請查看範例 Node.js 應用程式。
當新的 Lambda 執行環境啟動時,Lambda Web Adaptor 將作為 Lambda 擴充功能啟動,然後是 Web 應用程式。
預設情況下,Lambda Web Adaptor 會將 HTTP GET 請求傳送到位於http://127.0.0.1:8080/
Web 應用程式。可以使用兩個環境變數自訂連接埠和路徑: AWS_LWA_READINESS_CHECK_PORT
和AWS_LWA_READINESS_CHECK_PATH
。
Lambda Web Adaptor 將每 10 毫秒重試一次此要求,直到 Web 應用程式傳回 HTTP 回應(狀態代碼 >= 100 且 < 500 )或函數逾時。
此外,您可以透過將AWS_LWA_READINESS_CHECK_PROTOCOL
設定為tcp
來設定適配器以使用 TCP 連線執行準備檢查。
通過就緒檢查後,Lambda Web Adaptor 將啟動 Lambda Runtime 並將呼叫轉發到 Web 應用程式。
可以使用環境變數配置就緒檢查連接埠/路徑和流量連接埠。這些環境變數可以在 docker 檔案中定義,也可以定義為 Lambda 函數配置。
環境變數 | 描述 | 預設 |
---|---|---|
AWS_LWA_PORT / 埠* | 交通口 | “8080” |
AWS_LWA_READINESS_CHECK_PORT / READINESS_CHECK_PORT* | 就緒檢查端口,預設為流量端口 | 港口 |
AWS_LWA_READINESS_CHECK_PATH / READINESS_CHECK_PATH* | 準備狀況檢查路徑 | “/” |
AWS_LWA_READINESS_CHECK_PROTOCOL / READINESS_CHECK_PROTOCOL* | 就緒檢查協定:“http”或“tcp”,預設為“http” | “http” |
AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS | 被認為不健康的最小 HTTP 狀態碼 | “500” |
AWS_LWA_ASYNC_INIT / ASYNC_INIT* | 為長初始化函數啟用非同步初始化 | “錯誤的” |
AWS_LWA_REMOVE_BASE_PATH / REMOVE_BASE_PATH* | 要從請求路徑中刪除的基本路徑 | 沒有任何 |
AWS_LWA_ENABLE_COMPRESSION | 為回應正文啟用 gzip 壓縮 | “錯誤的” |
AWS_LWA_INVOKE_MODE | Lambda函式呼叫模式:“buffered”或“response_stream”,預設為“buffered” | “緩衝” |
AWS_LWA_PASS_THROUGH_PATH | 接收從非 http 觸發器傳遞過來的事件負載的路徑 | “/事件” |
AWS_LWA_AUTHORIZATION_SOURCE | 若要替換為Authorization 標頭名稱 | 沒有任何 |
注意:我們使用「AWS_LWA_」前綴來命名 Lambda Web Adaptor 所使用的所有環境變數。在我們達到 1.0 版本之前,將支援原始版本。
AWS_LWA_PORT / PORT - Lambda Web Adaptor 將向此連接埠發送流量。這是您的 Web 應用程式偵聽的連接埠。在Lambda 執行環境中,Web 應用程式以非root 使用者身分執行,且不允許偵聽低於1024 的連接埠。 3000 。
AWS_LWA_ASYNC_INIT / ASYNC_INIT - Lambda 託管運行時提供最多 10 秒的函數初始化時間。這段時間,Lambda函數爆發了CPU加速初始化,而且是免費的。如果 lambda 函數無法在 10 秒內完成初始化,Lambda 將重新啟動函數,並對初始化進行計費。為了幫助函數使用這 10 秒的免費初始化時間並避免重新啟動,Lambda Web Adaptor 支援非同步初始化。啟用此功能後,Lambda Web Adaptor 將執行最多 9.8 秒的準備檢查。如果屆時 Web 應用程式尚未準備就緒,Lambda Web Adaptor 會向 Lambda 服務發出訊號,表示初始化已完成,並繼續在處理程序中檢查準備。預設情況下停用此功能。透過將環境變數AWS_LWA_ASYNC_INIT
設為true
來啟用它。
AWS_LWA_REMOVE_BASE_PATH / REMOVE_BASE_PATH - 此環境變數的值告訴適配器應用程式是否在基本路徑下運作。例如,您可以將 API Gateway 設定為具有 /orders/{proxy+} 和 /catalog/{proxy+} 資源。每個資源都由單獨的 Lambda 函數處理。因此,Lambda 內部的應用程式可能不知道 /orders 路徑存在的事實。將請求路由到應用程式時,使用 REMOVE_BASE_PATH 刪除 /orders 前綴。預設為空字串。查看 SpringBoot 範例。
AWS_LWA_ENABLE_COMPRESSION - Lambda Web Adaptor 支援回應正文的 gzip 壓縮。預設情況下停用此功能。透過將環境變數AWS_LWA_ENABLE_COMPRESSION
設為true
來啟用它。啟用後,這將壓縮響應,除非它是由以image
開頭的內容類型確定的圖像或響應小於 32 位元組。這也將壓縮 HTTP/1.1 分塊流回應。
AWS_LWA_INVOKE_MODE - Lambda 函數呼叫模式,這應該與函數 Url 呼叫模式相符。預設為“緩衝”。當配置為「response_stream」時,Lambda Web Adaptor 會將回應串流傳輸到 Lambda 服務部落格。請查看具有回應流的 FastAPI 範例。
AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS - 可讓您自訂哪些 HTTP 狀態碼被視為健康的,哪些是不健康的
AWS_LWA_PASS_THROUGH_PATH - 接收從非 http 事件觸發器傳遞的事件負載的路徑。預設為“/events”。
AWS_LWA_AUTHORIZATION_SOURCE - 設定後,Lambda Web Adaptor 會在代理請求之前將指定的標頭名稱替換為Authorization
。當您將 Lambda 函數 URL 與 IAM 驗證類型結合使用時,這非常有用,該類型為 IAM 驗證保留授權標頭,但您仍希望對後端應用程式使用授權標頭。預設情況下停用此功能。
請求上下文是 API Gateway 向 Lambda 發送請求的元資料。通常包含 requestId、requestTime、apiId、identity 和authorizer。身分和授權者對於取得客戶端身分進行授權非常有用。 API Gateway 開發人員指南在此處包含更多詳細資訊。
Lambda Web Adaptor 將此資訊轉送到名為「x-amzn-request-context」的 Http 標頭中的 Web 應用程式。在 Web 應用程式中,您可以檢索此 http 標頭的值並將其反序列化為 JSON 物件。請參閱 Zip 中的 Express.js 以了解如何使用它。
Lambda Context是 Lambda 傳遞給函數處理程序的物件。該物件提供有關呼叫、函數和執行環境的資訊。您可以在此處找到可透過 Lambda 上下文存取的屬性的完整列表
Lambda Web Adaptor 將此資訊轉送到名為「x-amzn-lambda-context」的 Http 標頭中的 Web 應用程式。在 Web 應用程式中,您可以檢索此 http 標頭的值並將其反序列化為 JSON 物件。請參閱 Zip 中的 Express.js 以了解如何使用它。
對於註冊了 Lambda 擴充功能的函數,Lambda 會為該函數啟用關閉階段。當 Lambda 服務即將關閉 Lambda 執行環境時,它會向運行時發送 SIGTERM 訊號,然後向每個註冊的外部擴充功能發送 SHUTDOWN 事件。開發人員可以在 lambda 函數中捕獲 SIGTERM 訊號並執行正常的關閉任務。 Express.js 給了一個簡單的例子。更多詳細資訊請參閱此儲存庫。
Lambda Web Adaptor 允許開發人員使用熟悉的工具和偵錯器在本機上開發 Web 應用程式:只需在本機上執行 Web 應用程式並進行測試即可。如果您想在本機模擬 Lambda 執行階段環境,可以使用 AWS SAM CLI。以下命令啟動本機 api 網關端點並模擬 Lambda 執行時間執行環境。
sam local start-api
請注意, sam local
sam local
在連接埠 8080 8080
啟動 Lambda 運行時介面模擬器。
Lambda Web Adaptor 也支援所有非 HTTP 事件觸發器,例如 SQS、SNS、S3、DynamoDB、Kinesis、Kafka、EventBridge 和 Bedrock Agent。適配器透過 http post 將事件負載轉送到 Web 應用程式到由AWS_LWA_PASS_THROUGH_PATH
環境變數定義的路徑。預設情況下,此路徑設定為/events
。從請求正文接收到事件負載後,Web 應用程式應對其進行處理並將結果作為 JSON 回應傳回。請查看 Zip 範例中的 SQS Express.js 和 Bedrock Agent FastAPI。
這個項目的靈感來自於幾個社區項目。
一些項目還提供了與特定於語言的套件/框架類似的功能。
請參閱貢獻以獲取更多資訊。
該專案根據 Apache-2.0 許可證獲得許可。