使用 Lambda Web Adapter 在 Lambda 上 構建 web 應用

亞馬遜雲開發者發表於2023-04-07

背景介紹

Amazon Lambda 可結合 Amazon API Gateway 或 Application Load Balancer,使您無需提前啟動或管理伺服器即可執行基於 restful API 的應用程式。此時,Lambda 將以 JSON 格式的字串接收 http 事件,並將其轉換為物件,它將事件物件以及上下文傳遞給 Lambda 函式。而對於已經開發好的 Web 應用程式,您可能需要做一定的改造適配才能部署到已經存在的 Lambda。

亞馬遜雲科技開發者社群為開發者們提供全球的開發技術資源。這裡有技術文件、開發案例、技術專欄、培訓影片、活動與競賽等。幫助中國開發者對接世界最前沿技術,觀點,和專案,並將中國優秀開發者或技術推薦給全球雲社群。如果你還沒有關注/收藏,看到這裡請一定不要匆匆劃過,點這裡讓它成為你的技術寶庫!

現在,我們推出了 Lambda Web Adapter 方案,您可以在不改造已有 WEB 應用程式程式碼,使用熟悉的框架(例如 Express.js、Flask、SpringBoot 和 Laravel,或任何使用 HTTP 1.1/1.0)構建 Web 應用程式並在 Amazon Lambda 上執行它。

文章目的

本文以 nodejs express web 應用程式為例,介紹如何在不修改原有 nodejs 程式碼情況下,使用 Lambda Web Adapter 開發和部署一個 express web 應用部署到 Lambda。

如何工作

Amazon Lambda Web Adapter 實際上是一個 Lambda Extensions,當 docker 映象在 Amazon Lambda 中執行時,Lambda 會自動啟動 Adapter 和執行時程式。在 Lambda Web Adapter 啟動應用程式後,將每 10 毫秒對 http://localhost:8080/ 執行一次就緒檢查。它將在收到應用程式的 200 響應後,啟動 lambda 執行時客戶端,並將 http 請求轉發到 http://localhost:8080/。 這允許開發人員在不需要修改程式碼的情況下,將其 Web 應用程式打包為容器映像,並執行到 Amazon Lambda 。

目前 Lambda Web Adapter 可以使用 Amazon API Gateway Rest API, HTTP API, Application Load Balancer 和 Lambda Function URLs,接收 HTTP 請求。然後呼叫 Lambda function 執行程式碼邏輯,Lambda Adapter 將前端請求轉換為 http 請求併傳送到 Web 應用程式,等到 web 應用程式處理好之後,再將 http 響應轉換回 lambda 事件響應

開始使用 Lambda Web Adapter
可以選擇 Docker 映象或者 Zip 包兩種方式進行程式碼部署,請選擇自己喜歡的方式遷移或構建您的 web 應用程式。

前提條件:

配置和安裝 sam cli:

https://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html?trk=cndc-detail

option1: 打包為 Docker 映象或 OCI 映象的 Lambda 函式
可選操作:

要將 Lambda Web Adapter 與 Docker 映象一起使用,請將您的 Web 應用程式 (http api) 打包到 Dockerfile 中,然後新增一行以將 Lambda Web Adapter 二進位制檔案複製到容器內的 /opt/extensions。預設情況下,Lambda 介面卡假定 Web 應用程式正在偵聽埠 8080。如果不是,您可以透過配置指定埠。在 Lambda 之外執行時,Lambda Web Adapter 根本不執行。

COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.3.2 /lambda-adapter /opt/extensions/lambda-adapter

ECR 公共儲存庫中提供了預編譯的 Lambda 介面卡二進位制檔案:public.ecr.aws/awsguru/aws-lambda-adapter。此 repo 中還提供了多架構映象。適用於 x86_64 和 arm64 CPU 架構。

下面是一個示例 nodejs 應用程式的 Dockerfile:

FROM public.ecr.aws/docker/library/node:16.13.2-stretch-slim
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.3.2 /lambda-adapter /opt/extensions/lambda-adapter
EXPOSE 8080
WORKDIR "/var/task"
ADD src/package.json /var/task/package.json
ADD src/package-lock.json /var/task/package-lock.json
RUN npm install --production
ADD src/ /var/task
CMD ["node", "index.js"]

開始遷移 nodejs express hello world:

以下示例說明如何使用 Lambda 介面卡在執行 express.js docker 應用程式,部署工具使用 SAM,因此前提條件是需要安裝 Amazon cli(https://aws.amazon.com/cli/?trk=cndc-detail),sam cli(https://github.com/awslabs/aws-sam-cli?trk=cndc-detail),docker(https://www.docker.com/products/docker-desktop?trk=cndc-detail),nodejs(https://nodejs.org/en/?trk=cndc-detail):

  1. 下載 example 程式碼到開發環境電腦,https://github.com/awslabs/aws-lambda-web-adapter/?trk=cndc-detail
  2. 進入 example 目錄
cd aws-lambda-web-adapter/examples/expressjs
  1. 登陸 docker,用於構建 image 映象
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
  1. 構建和部署
sam build
sam deploy --guided

部署時需要輸入一些選項,如下圖所示

  1. 執行以上命令成功後,輸出API url

  1. 進行 curl 測試訪問,顯示 “Hi there!”
  2. 清理資源

sam delete

部署過程中如果遇到報錯,可以登陸控制檯手動刪除該 sam 對應的 cloudformation 模板,然後重新開始部署。

以上 example 程式碼適用於除 Amazon 託管基礎映象之外的任何基礎映象。

Amazon 提供了一組可用於建立容器映像的基礎映像,這些基礎映象包括執行時介面客戶端,用於管理 Lambda 和函式程式碼之間的互動。要使用 Amazon 託管基礎映像,您需要覆蓋 ENTRYPOINT 以啟動您的 Web 應用程式。以下 Dockfile 使用 Amazon Lambda 基礎映象:

FROM public.ecr.aws/lambda/nodejs:14
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.3.1 /opt/extensions/lambda-adapter /opt/extensions/lambda-adapter
EXPOSE 8080
WORKDIR "/var/task"
ADD src/package.json /var/task/package.json
ADD src/package-lock.json /var/task/package-lock.json
RUN npm install --production
ADD src/index.js /var/task/index.js
ENTRYPOINT [ "node", "index.js" ]

然後重新進行構建和部署

sam build
sam deploy --guided

如果遇到測試報錯,可以在 console 上找到部署的 lambda 函式,檢視 cloudwathc 日誌。

option2: 打包為 Zip 包的 Lambda 函式(使用Amazon 託管執行時)

Amazon Lambda Web Adapter 也適用於 Amazon 託管的 Lambda 執行時。你需要做三件事:

  1. 將Lambda Web Adapter layer附加到您的函式。
  • x86_64:arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:2
  • arm64:arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerArm64:2

    1. 將 Lambda 環境變數 AWS_LAMBDA_EXEC_WRAPPER 配置為 /opt/bootstrap。
    2. 將 function handler 設定為您的 Web 應用程式啟動指令碼。例如 sh

    以下示例說明如何使用 Lambda 介面卡在執行 express.js 應用程式,部署工具使用 SAM,因此前提條件是需要安裝 Amazon cli,sam cli,nodejs:

    1. 下載 example 程式碼到開發環境電腦,https://github.com/awslabs/aws-lambda-web-adapter/?trk=cndc-detail
    2. 進入 example 目錄,cd aws-lambda-web-adapter/examples/expressjs-zip
    3. 構建和部署
sam build
sam deploy --guided

部署時需要輸入一些選項,如下圖所示

  1. 執行以上命令成功後,輸出API url

  1. 進行 curl 測試訪問,顯示 “Hi there!”

  1. 清理資源

sam delete

配置說明

可以修改預設配置,使用環境變數配置就緒檢查埠/路徑和流量埠。這些環境變數可以在 docker 檔案中定義,也可以定義為 Lambda 函式配置。

REMOVE_BASE_PATH – 此環境變數的值告訴 Lambda Web Adapter 是否在 base path 下執行。例如,您可以將 API Gateway 配置為具有 /orders/{proxy+} 和 /catalog/{proxy+} 資源。每個資源都由單獨的 Lambda 函式處理。因此,Lambda 內部的應用程式可能不知道 /orders 路徑存在這一事實。將請求路由到應用程式時,使用 REMOVE_BASE_PATH 刪除 /orders 字首。預設為空字串。

各種語言的Example參考

除了使用 Nodejs express 之外,如果您使用的是 Flask,SpringBoot 等 web 框架開發 web 程式,可以從以下各種語言的 Example 示例開始,方便您使用自己熟悉的框架開發基於 Lambda 的 web 應用程式

Flask:https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/flask?trk=cndc-detail

Express.js:https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs?trk=cndc-detail

Express.js in Zip:https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs-zip?trk=cndc-detail

SpringBoot:https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/springboot?trk=cndc-detail

nginx:https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/nginx?trk=cndc-detail

php:https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/php?trk=cndc-detail

收益和總結

HTTP 1.1 協議是目前最主流的應用層協議,藉助 Lambda Web Adapter ,我們可以在 Lambda 中開發和部署任何相容 HTTP 1.1/1.0 web 框架,例如 Nodejs express, php WordPress, python Flask, nginx, java SpringBoot 等等, 還能利用 Lambda 省去了大部分的運維工作,同時實現自動容量調配和彈性伸縮。

參考資料 Lambda Web Adapter 開源文件:https://github.com/awslabs/aws-lambda-web-adapter?trk=cndc-detail

Lambda 服務:https://aws.amazon.com/cn/lambda/?trk=cndc-detail

SAM CLI:https://docs.aws.amazon.com/zh_cn/serverless-application-mode...

Amazon CLI:https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-co...

如何開發參考:https://github.com/awslabs/aws-lambda-web-adapter/blob/main/docs/development.md?trk=cndc-detail

本篇作者

謝佰臻
Amazon Web Services 公司解決方案架構師,負責基於雲端計算方案架構的諮詢和設計,目前專注於 Serverless、DevSecOps。

王寒冰
亞馬遜雲科技解決方案架構師,負責基於 Amazon 雲端計算方案的架構諮詢和設計實現,具有豐富的解決客戶實際問題的經驗,專注於容器化,無伺服器化的應用。

文章來源:https://dev.amazoncloud.cn/column/article/6309cdedd4155422a46...

相關文章