在 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 的端口。另请避免使用端口 9001 和 3000。Lambda Runtime API 在端口 9001 上。CloudWatch Lambda Insight 扩展使用端口 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
在端口 8080 上启动 Lambda 运行时接口模拟器。因此,如果您计划使用sam local
您的 Web 应用程序应避免使用端口8080
。
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 许可证获得许可。