php 函数库(使用 Amazon Lambda Web Adapter 在 Amazon Lambda 上构建 Web 应用)PHP函数 / PHP函数在Web API设计中的应用...

wufei123 发布于 2024-06-02 阅读(16)

前言Amazon Lambda 可结合 Amazon API Gateway 或 Application Load Balancer ,使您无需提前启动或管理服务器即可运行基于 restful API 的应用程序。

此时,Amazon Lambda 将以 JSON 格式的字符串接收 http 事件,并将其转换为对象,它将事件对象以及上下文传递给 Lambda 函数而对于已经开发好的 Web 应用程序,您可能需要做一定的改造适配才能部署到已经存在的 Amazon Lambda。

现在,我们推出了 Amazon Lambda Web Adapter 方案,您可以在不改造已有 Web 应用程序代码,使用熟悉的框架(例如 Express.js, Flask, SpringBoot 和 Laravel,或任何使用 HTTP 1.1/1.0)构建 Web 应用程序并在 Amazon Lambda 上运行它。

文章目的本文以 nodejs express web 应用程序为例,介绍如何在不修改原有 nodejs 代码情况下,使用 Amazon Lambda Web Adapter 开发和部署一个 express web 应用部署到 Amazon Lambda。

如何工作Amazon Lambda Web Adapter 实际上是一个 Lambda Extensions,当 docker 镜像在 Amazon Lambda 中运行时, Lambda 会自动启动 Adapter 和运行时进程。

在 Amazon  Lambda Web Adapter 启动应用程序后,将每 10 毫秒对http://localhost:8080/ 执行一次就绪检查它将在收到应用程序的 200 响应后,启动 Amazon Lambda 运行时客户端,并将 http 请求转发到。

http://localhost:8080。这允许开发人员在不需要修改代码的情况下,将其 Web 应用程序打包为容器映像,并运行到 Amazon Lambda。

目前 Amazon Lambda Web Adapter 可以使用 Amazon API Gateway Rest API, HTTP API, Application Load Balancer 和 Lambda Function URLs ,接收 HTTP 请求。

然后调用 Lambda function 执行代码逻辑,Amazon 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

option1: 打包为 Docker 镜像或 OCI 镜像的 Lambda 函数可选操作:要将 Amazon Lambda Web Adapter 与 Docker 镜像一起使用,请将您的 Web 应用程序 (http api) 打包到 Dockerfile 中,然后添加一行以将 Lambda Web Adapter 二进制文件复制到容器内的 /opt/extensions 。

默认情况下,Amazon Lambda 适配器假定 Web 应用程序正在侦听端口 8080如果不是,您可以通过配置指定端口在 Amazon Lambda 之外运行时,Amazon 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-slimCOPY --from=

public.ecr.aws/awsguru/aws-lambda-adapter:0.3.2 /lambda-adapter /opt/extensions/lambda-adapterEXPOSE 

8080WORKDIR "/var/task"ADD src/package.json /var/task/package.jsonADD src/package-lock.json /var/task/

package-lock.jsonRUN npm install --productionADD src/ /var/taskCMD ["node", "index.js"]*左滑查看更多开始迁移 nodejs express hello world:

以下示例说明如何使用 Amazon Lambda 适配器在运行 express.js  docker应用程序,部署工具使用 SAM,因此前提条件是需要安装 Amazon cli(https://aws.amazon.com/cli/

), sam cli(https://github.com/awslabs/aws-sam-cli), docker(https://www.docker.com/products/docker-desktop

), nodejs(https://nodejs.org/en/):1.下载 example 代码到开发环境电脑,https://github.com/awslabs/aws-lambda-web-adapter/

2.进入 example 目录cd aws-lambda-web-adapter/examples/expressjs*左滑查看更多3.登陆 docker,用于构建 image 镜像aws ecr-public

 get-login-password --region us-east-1 | docker login --username AWS --password-stdinpublic.ecr.aw*左滑查看更多

4.构建和部署sam buildsam deploy --guided部署时需要输入一些选项,如下图所示:

5.执行以上命令成功后,输出 API url

6.进行 curl 测试访问,显示 “Hi there!”

7.清理资源sam delete部署过程中如果遇到报错,可以登陆控制台手动删除该 sam 对应的 cloudformation 模板,然后重新开始部署以上 example 代码适用于除 Amazon 托管基础镜像之外的任何基础镜像。

亚马逊云科技提供了一组可用于创建容器映像的基础映像,这些基础镜像包括运行时接口客户端,用于管理 Lambda 和函数代码之间的交互要使用 Amazon 托管基础映像,您需要覆盖 ENTRYPOINT 以启动您的 Web 应用程序。

以下 Dockfile 使用 Amazon Lambda 基础镜像:FROM public.ecr.aws/lambda/nodejs:14COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:

0.3.1 /opt/extensions/lambda-adapter /opt/extensions/lambda-adapterEXPOSE 8080WORKDIR "/var/task"ADD src/

package.json /var/task/package.jsonADD src/package-lock.json /var/task/package-lock.jsonRUN npm install --production

ADD src/index.js /var/task/index.jsENTRYPOINT [ "node", "index.js" ]*左滑查看更多然后重新进行构建和部署sam buildsam deploy --guided。

如果遇到测试报错,可以在 console 上找到部署的 Lambda 函数,查看 CloudWatch 日志option2: 打包为 Zip 包的 Lambda 函数(使用 Amazon 托管运行时)Amazon Lambda Web Adapter 也适用于 Amazon 托管的 Lambda 运行时。

你需要做三件事:1.将 Lambda Web Adapter layer 附加到您的函数a.x86_64:arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:2。

b.arm64:arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerArm64:22.将 Lambda 环境变量 AWS_LAMBDA_EXEC_WRAPPER 配置为 /opt/bootstrap。

3.将 function handler 设置为您的 Web 应用程序启动脚本例如 sh以下示例说明如何使用 Amazon Lambda 适配器在运行 express.js 应用程序,部署工具使用 SAM ,因此前提条件是需要安装 aws cli, sam cli, nodejs:。

1.下载 example 代码到开发环境电脑,https://github.com/awslabs/aws-lambda-web-adapter/2.进入 example 目录,cd aws-lambda-web-adapter/examples/expressjs-zip

3.构建和部署sam buildsam deploy --guided部署时需要输入一些选项,如下图所示:

4.执行以上命令成功后,输出 API url

5.进行 curl 测试访问,显示 “Hi there!”

6.清理资源sam delete配置说明可以修改默认配置,使用环境变量配置就绪检查端口/路径和流量端口这些环境变量可以在 docker 文件中定义,也可以定义为 Amazon 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/flaskExpress.js:https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs

Express.js in Zip:https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs-zipSpringBoot:

https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/springbootnginx:https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/nginx

php:https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/php收益和总结HTTP 1.1 协议是目前最主流的应用层协议,借助 Amazon Lambda Web Adapter ,我们可以在 Amazon 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-adapterLambda 服务:https://aws.amazon.com/cn/lambda/

SAM CLI:https://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/serverless-sam-cli-install-mac.html

Amazon CLI:https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html如何开发参考:https://github.com/awslabs/aws-lambda-web-adapter/blob/main/docs/development.md

本篇作者

谢佰臻Amazon Web Services 公司解决方案架构师,负责基于云计算方案架构的咨询和设计,目前专注于 Serverless ,DevSecOps。

王寒冰亚马逊云科技解决方案架构师,负责基于亚马逊云计算方案的架构咨询和设计实现,具有丰富的解决客户实际问题的经验,专注于容器化,无服务器化的应用。

听说,点完下面4个按钮就不会碰到bug了!

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻66752