背景介绍
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):
- 下载 example 代码到开发环境电脑,https://github.com/awslabs/aws-lambda-web-adapter/?trk=cndc-detail
- 进入 example 目录
cd aws-lambda-web-adapter/examples/expressjs
- 登陆 docker,用于构建 image 镜像
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
- 构建和部署
sam build
sam deploy --guided
部署时须要输出一些选项,如下图所示
- 执行以上命令胜利后,输入 API url
- 进行 curl 测试拜访,显示“Hi there!”
- 清理资源
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 运行时。你须要做三件事:
- 将 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
- 将 Lambda 环境变量 AWS_LAMBDA_EXEC_WRAPPER 配置为 /opt/bootstrap。
- 将 function handler 设置为您的 Web 应用程序启动脚本。例如 sh
以下示例阐明如何应用 Lambda 适配器在运行 express.js 应用程序,部署工具应用 SAM,因而前提条件是须要装置 Amazon cli,sam cli,nodejs:
- 下载 example 代码到开发环境电脑,https://github.com/awslabs/aws-lambda-web-adapter/?trk=cndc-detail
- 进入 example 目录,cd aws-lambda-web-adapter/examples/expressjs-zip
- 构建和部署
sam build
sam deploy --guided
部署时须要输出一些选项,如下图所示
- 执行以上命令胜利后,输入 API url
- 进行 curl 测试拜访,显示“Hi there!”
- 清理资源
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…