首页 > 其他分享 >使用 Lambda Web Adapter 在 Lambda 上 构建 web 应用

使用 Lambda Web Adapter 在 Lambda 上 构建 web 应用

时间:2023-04-03 22:57:57浏览次数:75  
标签:Web web adapter aws Lambda lambda

背景介绍

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/?trk=cndc-detail 执行一次就绪检查。它将在收到应用程序的 200 响应后,启动 lambda 运行时客户端,并将 http 请求转发到 http://localhost:8080/?trk=cndc-detail。 这允许开发人员在不需要修改代码的情况下,将其 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!”

  1. 清理资源
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附加到您的函数。
    1. x86_64:arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:2
    2. arm64:arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerArm64:2
  2. 将 Lambda 环境变量 AWS_LAMBDA_EXEC_WRAPPER 配置为 /opt/bootstrap。
  3. 将 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-model/latest/developerguide/serverless-sam-cli-install-mac.html?trk=cndc-detail

Amazon CLI:https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html?trk=cndc-detail

如何开发参考: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/6309cdedd4155422a4610a4c?sc_channel=bokey

 

标签:Web,web,adapter,aws,Lambda,lambda
From: https://www.cnblogs.com/AmazonwebService/p/17284789.html

相关文章

  • 更改我们在Javaweb的运行启动方式
    之前之前,我都是利用上面的Tomcat的三角符号进行启动的更改1、下载插件在idea界面的右上角的设置按钮,选中其中的Plugins选项:然后会弹出一个界面,选中右上方的Marketplace,然后在下面的搜索框里面搜索MavenHelper:下载它,然后重启IDEA2、使用插件运行web右键项目名称,选中其中......
  • Python的web框架自动生成readme文件的第三方模块介绍以及使用方法
    第一步安装pipinstalldjango-readme-generator第二步在Django项目配置文件文件中的INSTALLED_APPS配置中注册一下INSTALLED_APPS=[ django_readme_generator,]第三步命令运行产生readme文件pythonmanage.pygenerate_readme其实很简单,以上三步可以轻轻松松的自动......
  • Lambda表达式
    LambdanewThread(()->System.out.println("多线程学习....")).start;/**避免匿名内部类定义过多*可以让你的代码看起来整洁*去掉了一些没有意义代码,只留下核心代码***///lambda简化代码过程publicclassTestLambda{  //1.静态内部类  staticclassLike2implem......
  • Lights:奇妙的WebGL 3D体验
    了解WebGL技术的人应该都知道,WebGL是一种3D绘图标准,通过该技术标准Web开发人员可以借助系统显卡在浏览器里更流畅地展示3D场景和模型,创建复杂的导航和数据视觉化。而Lights就是这样一款拥有强大WebGL显示功能的产品,无需插件便可在支持WebGL的浏览器(如Chrome、Safari和Firefox等)中......
  • php-websocket hyperf/websocket-server/client 客户端和服务器实时双向数据传输
    WebSocket服务WebSocket是一种通信协议,可在单个TCP连接上进行全双工通信。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocketAPI中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。Hyperf......
  • swoft 客服系统websocket。即时通讯小功能
     挥手,握手就不解释了。直接上代码启动swoftws的服务  <?phpdeclare(strict_types=1);/***ThisfileispartofSwoft.**@linkhttps://swoft.org*@documenthttps://swoft.org/docs*@[email protected]*@licensehttps://github.co......
  • swoole+websocket+redis实现一对一聊天
     如同web端的QQ和微信一样,这是一个web端的聊天程序。环境:linux(centos)+php7.2+swoole扩展+redis+mysqlRedis实现每个连接websocket的服务都唯一绑定一个用户。通过用户账号=websocketfd存到redis中。Mysql实现离线消息池。如果一个用户不在线,则其他用户发......
  • Flask 和pythonweb框架介绍、flask快速使用、登录,显示用户信息小案例、配置文件方式、
    Flask和pythonweb框架介绍、flask快速使用、登录,显示用户信息小案例、配置文件方式、路由系统Flask和pythonweb框架介绍Flask和pythonweb框架的区别:Django框架: 大而全,内置的app很多,第三方的app很多Flask框架: 小而精,没有过多的内置app,只能完成web框架的基本功能,很多功能......
  • asp.net怎么实现web端上传超大文件
    ​ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现。下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压。ASP.NET页面设计:TextBox和Button按钮。​编辑TextBox中需要自己受到输入文件夹的路径(包含文件夹),通过Button实......
  • Lambda 表达式
    目录Lambda表达式简介Lambda表达式入门案例Lambda表达式语法Lambda表达式的省略模式Lambda表达式和匿名内部类的区别函数式接口方法引用Java8新特性中有几个比较主要的特性,Lambda表达式、函数式接口、方法引用和几个新增库StreamAPI、Optional类等。Lambda表达式......