aws-lambda-web-adapter

aws-lambda-web-adapter

Web应用无服务器架构迁移适配工具

AWS Lambda Web Adapter是一个开源工具,支持开发者使用Express.js、Next.js、Flask、SpringBoot等常见Web框架在AWS Lambda上运行应用。它兼容多种编程语言、框架和触发器,提供二进制响应编码、优雅关闭和响应压缩等功能。适用于Docker镜像和Zip包部署,简化了Web应用向Lambda环境的迁移过程,提高开发效率并降低运维成本。

无服务器Web应用DockerGithub开源项目AWS LambdaWeb Adapter

AWS Lambda Web 适配器

一个在 AWS Lambda 上运行 Web 应用程序的工具

AWS Lambda Web 适配器允许开发人员使用熟悉的框架(如 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 和本地计算机上运行。

Lambda Web 适配器

特性

  • 在 AWS Lambda 上运行 Web 应用程序
  • 支持 Amazon API Gateway Rest API 和 Http API 端点、Lambda 函数 URL 和应用程序负载均衡器
  • 支持 Lambda 托管运行时、自定义运行时和 Docker OCI 镜像
  • 支持任何 Web 框架和语言,无需包含新的代码依赖
  • 自动编码二进制响应
  • 启用优雅关闭
  • 支持响应负载压缩
  • 支持响应流式传输
  • 支持非 HTTP 事件触发器

使用方法

AWS Lambda Web 适配器可以与打包为 Docker 镜像和 Zip 包的 Lambda 函数一起使用。

打包为 Docker 镜像或 OCI 镜像的 Lambda 函数

要在 Docker 镜像中使用 Lambda Web 适配器,请在 Dockerfile 中打包您的 Web 应用程序(HTTP API),并添加一行代码将 Lambda Web 适配器二进制文件复制到容器内的 /opt/extensions:

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

可以使用非 AWS 基础镜像,因为运行时接口客户端随 Lambda Web 适配器一起提供。

默认情况下,Lambda Web 适配器假设 Web 应用程序在端口 8080 上监听。如果不是,您可以通过配置指定端口。

预编译的 Lambda Web 适配器二进制文件在 ECR 公共仓库中提供:public.ecr.aws/awsguru/aws-lambda-adapter。 该仓库还提供多架构镜像。它适用于 x86_64 和 arm64 CPU 架构。

以下是一个示例 Node.js 应用程序的 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 应用程序。

打包为 Zip 包的 AWS 托管运行时 Lambda 函数

AWS Lambda Web 适配器也适用于 AWS 托管 Lambda 运行时。您需要执行以下三个步骤:

  1. 将 Lambda Web 适配器层附加到您的函数。

    AWS 商业区域

    1. x86_64:arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:23
    2. arm64:arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerArm64:23

    AWS 中国区域

    1. cn-north-1(北京)
      • x86_64:arn:aws-cn:lambda:cn-north-1:041581134020:layer:LambdaAdapterLayerX86:23
    2. cn-northwest-1(宁夏)
      • x86_64:arn:aws-cn:lambda:cn-northwest-1:069767869989:layer:LambdaAdapterLayerX86:23
  2. 将 Lambda 环境变量 AWS_LAMBDA_EXEC_WRAPPER 配置为 /opt/bootstrap

  3. 将函数处理程序设置为您的 Web 应用程序启动脚本。例如:run.sh

详细信息请查看示例 Node.js 应用程序

就绪检查

当新的 Lambda 执行环境启动时,Lambda Web 适配器将作为 Lambda 扩展启动,然后启动 Web 应用程序。

默认情况下,Lambda Web 适配器将向 Web 应用程序发送 HTTP GET 请求,地址为 http://127.0.0.1:8080/。可以通过两个环境变量自定义端口和路径:AWS_LWA_READINESS_CHECK_PORTAWS_LWA_READINESS_CHECK_PATH

Lambda Web 适配器将每 10 毫秒重试此请求,直到 Web 应用程序返回 HTTP 响应(状态码 >= 100 且 < 500)或函数超时。

此外,您可以通过将 AWS_LWA_READINESS_CHECK_PROTOCOL 设置为 tcp,将适配器配置为使用 TCP 连接执行就绪检查。

通过就绪检查后,Lambda Web 适配器将启动 Lambda 运行时并将调用转发到 Web 应用程序。

配置

可以使用环境变量配置就绪检查端口/路径和流量端口。这些环境变量可以在 Docker 文件中定义,也可以作为 Lambda 函数配置定义。

环境变量描述默认值
AWS_LWA_PORT / PORT*流量端口"8080"
AWS_LWA_READINESS_CHECK_PORT / READINESS_CHECK_PORT*就绪检查端口,默认为流量端口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*为长初始化函数启用异步初始化"false"
AWS_LWA_REMOVE_BASE_PATH / REMOVE_BASE_PATH*从请求路径中移除的基本路径
AWS_LWA_ENABLE_COMPRESSION启用响应体的 gzip 压缩"false"
AWS_LWA_INVOKE_MODELambda 函数调用模式:"buffered" 或 "response_stream",默认为 "buffered""buffered"
AWS_LWA_PASS_THROUGH_PATH接收从非 HTTP 触发器传递的事件负载的路径"/events"
AWS_LWA_AUTHORIZATION_SOURCE要替换为 Authorization 的头部名称

注意: 我们使用 "AWS_LWA_" 前缀来命名 Lambda Web 适配器使用的所有环境变量。原始变量名将继续支持,直到我们达到 1.0 版本。

AWS_LWA_PORT / PORT - Lambda Web 适配器将流量发送到此端口。这是您的 Web 应用程序监听的端口。在 Lambda 执行环境中,Web 应用程序以非 root 用户身份运行,不允许监听低于 1024 的端口。请同时避免使用端口 9001 和 3000。Lambda 运行时 API 在端口 9001 上。CloudWatch Lambda Insight 扩展使用端口 3000。

AWS_LWA_ASYNC_INIT / ASYNC_INIT - Lambda 托管运行时为函数初始化提供最多 10 秒的时间。在此期间,Lambda 函数具有突发 CPU 以加速初始化,且是免费的。如果 Lambda 函数无法在 10 秒内完成初始化,Lambda 将重新启动该函数,并对初始化计费。为了帮助函数利用这 10 秒的免费初始化时间并避免重新启动,Lambda Web 适配器支持异步初始化。启用此功能后,Lambda Web 适配器将执行长达 9.8 秒的就绪检查。如果 Web 应用程序在此之前未就绪,Lambda Web 适配器会向 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 适配器支持响应体的 gzip 压缩。默认情况下,此功能处于禁用状态。通过将环境变量 AWS_LWA_ENABLE_COMPRESSION 设置为 true 来启用它。启用后,除非响应是由内容类型以 image 开头确定的图像,或响应小于 32 字节,否则将压缩响应。这还将压缩 HTTP/1.1 分块流式响应。

AWS_LWA_INVOKE_MODE - Lambda 函数调用模式,这应与函数 URL 调用模式匹配。默认为 "buffered"。当配置为 "response_stream" 时,Lambda Web 适配器将向 Lambda 服务流式传输响应 博客。请查看 FastAPI 与响应流式传输 示例。

AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS - 允许您自定义哪些 HTTP 状态码被视为健康,哪些被视为不健康

AWS_LWA_PASS_THROUGH_PATH - 接收从非 HTTP 事件触发器传递的事件负载的路径。默认为 "/events"。

AWS_LWA_AUTHORIZATION_SOURCE - 设置后,Lambda Web 适配器会在代理请求之前将指定的头部名称替换为 Authorization。当您使用 IAM 身份验证类型 的 Lambda 函数 URL 时,这很有用,因为它为 IAM 身份验证保留了 Authorization 头部,但您仍然希望为后端应用程序使用 Authorization 头部。默认情况下,此功能处于禁用状态。

请求上下文

请求上下文是 API Gateway 为请求发送给 Lambda 的元数据。它通常包含 requestId、requestTime、apiId、identity 和 authorizer。Identity 和 authorizer 对于获取客户端身份以进行授权很有用。API Gateway 开发者指南在此处包含更多详细信息。

Lambda Web 适配器将此信息以名为 "x-amzn-request-context" 的 HTTP 头部转发给 Web 应用程序。在 Web 应用程序中,您可以检索此 HTTP 头部的值并将其反序列化为 JSON 对象。查看 Express.js in Zip 了解如何使用它。

Lambda 上下文

Lambda 上下文是 Lambda 传递给函数处理程序的对象。此对象提供有关调用、函数和执行环境的信息。您可以在此处找到通过 Lambda 上下文可访问的属性的完整列表。 Lambda Web Adapter 将此信息通过名为 "x-amzn-lambda-context" 的 HTTP 头转发给 Web 应用程序。在 Web 应用程序中,您可以获取此 HTTP 头的值并将其反序列化为 JSON 对象。查看 ZIP 格式的 Express.js 了解如何使用它。

优雅关闭

对于注册了 Lambda 扩展的函数,Lambda 为该函数启用了关闭阶段。当 Lambda 服务即将关闭 Lambda 执行环境时,它会向运行时发送 SIGTERM 信号,然后向每个已注册的外部扩展发送 SHUTDOWN 事件。开发人员可以在 Lambda 函数中捕获 SIGTERM 信号并执行优雅关闭任务。Express.js 提供了一个简单的示例。更多详情请参阅此仓库

本地调试

Lambda Web Adapter 允许开发人员使用熟悉的工具和调试器在本地开发 Web 应用程序:只需在本地运行 Web 应用程序并进行测试。如果您想在本地模拟 Lambda 运行时环境,可以使用 AWS SAM CLI。以下命令启动本地 API Gateway 端点并模拟 Lambda 运行时执行环境。

sam local start-api

请注意,sam local 在端口 8080 上启动 Lambda 运行时接口模拟器。因此,如果您计划使用 sam local,您的 Web 应用程序应避免使用端口 8080

非 HTTP 事件触发器

Lambda Web Adapter 还支持所有非 HTTP 事件触发器,如 SQS、SNS、S3、DynamoDB、Kinesis、Kafka、EventBridge 和 Bedrock Agents。适配器通过 HTTP POST 将事件负载转发到由 AWS_LWA_PASS_THROUGH_PATH 环境变量定义的路径。默认情况下,此路径设置为 /events。Web 应用程序从请求体接收事件负载后,应处理它并以 JSON 响应的形式返回结果。请查看 SQS Express.jsZIP 格式的 Bedrock Agent FastAPI 示例。

示例

致谢

本项目受到了几个社区项目的启发。

类似项目

几个项目也提供了类似的功能,作为特定语言的包/框架。

安全

有关更多信息,请参阅 CONTRIBUTING

许可证

本项目采用 Apache-2.0 许可证。

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

热门AI工具AI办公办公工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

模型训练热门AI工具内容创作智能问答AI开发讯飞星火大模型多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

热门AI工具生产力协作转型TraeAI IDE
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

AI助手热门AI工具AI创作AI辅助写作讯飞绘文内容运营个性化文章多平台分发
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多