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

0
0
{"value":"\n\n#### **背景介绍**\n\n\nAmazon Lambda 可结合 [Amazon API Gateway](https://aws.amazon.com/cn/api-gateway/?trk=cndc-detail) 或 Application Load Balancer,使您无需提前启动或管理服务器即可运行基于 restful API 的应用程序。此时,Lambda 将以 JSON 格式的字符串接收 http 事件,并将其转换为对象,它将事件对象以及上下文传递给 Lambda 函数。而对于已经开发好的 Web 应用程序,您可能需要做一定的改造适配才能部署到已经存在的 Lambda。\n\n现在,我们推出了 Lambda Web Adapter 方案,您可以在不改造已有 WEB 应用程序代码,使用熟悉的框架(例如 Express.js、Flask、SpringBoot 和 Laravel,或任何使用 HTTP 1.1/1.0)构建 Web 应用程序并在 Amazon Lambda 上运行它。\n\n\n#### **文章目的**\n\n\n本文以 nodejs express web 应用程序为例,介绍如何在不修改原有 nodejs 代码情况下,使用 Lambda Web Adapter 开发和部署一个 express web 应用部署到 Lambda。\n\n\n#### **如何工作**\n\n\nAmazon Lambda Web Adapter 实际上是一个 Lambda Extensions,当 docker 镜像在 Amazon Lambda 中运行时,Lambda 会自动启动 Adapter 和运行时进程。在 Lambda Web Adapter 启动应用程序后,将每 10 毫秒对 [http://localhost:8080/](http://localhost:8080/) 执行一次就绪检查。它将在收到应用程序的 200 响应后,启动 lambda 运行时客户端,并将 http 请求转发到 [http://localhost:8080/](http://localhost:8080/)。 这允许开发人员在不需要修改代码的情况下,将其 Web 应用程序打包为容器映像,并运行到 Amazon Lambda 。\n\n![image.png](https://dev-media.amazoncloud.cn/872ffc531b3840f5a020cb86e3a0051e_image.png)\n\n目前 Lambda Web Adapter 可以使用 [Amazon API Gateway](https://aws.amazon.com/cn/api-gateway/?trk=cndc-detail) Rest API, HTTP API, Application Load Balancer 和 Lambda Function URLs,接收 HTTP 请求。然后调用 Lambda function 执行代码逻辑,Lambda Adapter 将前端请求转换为 http 请求并发送到 Web 应用程序,等到 web 应用程序处理好之后,再将 http 响应转换回 lambda 事件响应\n\n![image.png](https://dev-media.amazoncloud.cn/00451688d96e45d28b9baf65b01f2f66_image.png)\n\n\n##### **开始使用 Lambda Web Adapter**\n\n\n可以选择 Docker 镜像或者 Zip 包两种方式进行代码部署,请选择自己喜欢的方式迁移或构建您的 web 应用程序。\n\n前提条件:\n\n配置和安装 sam cli:\n\n[https://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html](https://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)\n\n\n###### **option1: 打包为 Docker 镜像或 OCI 镜像的 Lambda 函数**\n\n\n可选操作:\n\n要将 Lambda Web Adapter 与 Docker 镜像一起使用,请将您的 Web 应用程序 (http api) 打包到 Dockerfile 中,然后添加一行以将 Lambda Web Adapter 二进制文件复制到容器内的 /opt/extensions。默认情况下,Lambda 适配器假定 Web 应用程序正在侦听端口 8080。如果不是,您可以通过配置指定端口。在 Lambda 之外运行时,Lambda Web Adapter 根本不运行。\n\n```\\nCOPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.3.2 /lambda-adapter /opt/extensions/lambda-adapter\\n```\n\nECR 公共存储库中提供了预编译的 Lambda 适配器二进制文件:public.ecr.aws/awsguru/aws-lambda-adapter。此 repo 中还提供了多架构镜像。适用于 x86_64 和 arm64 CPU 架构。\n\n下面是一个示例 nodejs 应用程序的 Dockerfile:\n\n```\\nFROM public.ecr.aws/docker/library/node:16.13.2-stretch-slim\\nCOPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.3.2 /lambda-adapter /opt/extensions/lambda-adapter\\nEXPOSE 8080\\nWORKDIR \\"/var/task\\"\\nADD src/package.json /var/task/package.json\\nADD src/package-lock.json /var/task/package-lock.json\\nRUN npm install --production\\nADD src/ /var/task\\nCMD [\\"node\\", \\"index.js\\"]\\n```\n\n开始迁移 nodejs express hello world:\n\n以下示例说明如何使用 Lambda 适配器在运行 express.js docker 应用程序,部署工具使用 SAM,因此前提条件是需要安装 Amazon cli([https://aws.amazon.com/cli/](https://aws.amazon.com/cli/)),sam cli([https://github.com/awslabs/aws-sam-cli](https://github.com/awslabs/aws-sam-cli)),docker([https://www.docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop)),nodejs([https://nodejs.org/en/](https://nodejs.org/en/)):\n\n1. 下载 example 代码到开发环境电脑,[https://github.com/awslabs/aws-lambda-web-adapter/](https://github.com/awslabs/aws-lambda-web-adapter/)\n2. 进入 example 目录\n\n```\\ncd aws-lambda-web-adapter/examples/expressjs\\n```\n\n3. 登陆 docker,用于构建 image 镜像\n\n```\\naws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws\\n```\n\n4. 构建和部署\n\n```\\nsam build\\nsam deploy --guided\\n```\n\n部署时需要输入一些选项,如下图所示\n\n![image.png](https://dev-media.amazoncloud.cn/2885c54607874eab94c72bea82af35c7_image.png)\n\n5. 执行以上命令成功后,输出API url\n\n![image.png](https://dev-media.amazoncloud.cn/63c4e41c48ae4feda6bc38b192f3d20d_image.png)\n\n6. 进行 curl 测试访问,显示 “Hi there!”\n\n![image.png](https://dev-media.amazoncloud.cn/59b2f884ba25482d9735cbb901886eec_image.png)\n\n7. 清理资源\n\n```\\nsam delete\\n```\n\n部署过程中如果遇到报错,可以登陆控制台手动删除该 sam 对应的 cloudformation 模板,然后重新开始部署。\n\n以上 example 代码适用于除 Amazon 托管基础镜像之外的任何基础镜像。\n\nAmazon 提供了一组可用于创建容器映像的基础映像,这些基础镜像包括运行时接口客户端,用于管理 Lambda 和函数代码之间的交互。要使用 Amazon 托管基础映像,您需要覆盖 ENTRYPOINT 以启动您的 Web 应用程序。以下 Dockfile 使用 Amazon Lambda 基础镜像:\n\n```\\nFROM public.ecr.aws/lambda/nodejs:14\\nCOPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.3.1 /opt/extensions/lambda-adapter /opt/extensions/lambda-adapter\\nEXPOSE 8080\\nWORKDIR \\"/var/task\\"\\nADD src/package.json /var/task/package.json\\nADD src/package-lock.json /var/task/package-lock.json\\nRUN npm install --production\\nADD src/index.js /var/task/index.js\\nENTRYPOINT [ \\"node\\", \\"index.js\\" ]\\n```\n\n然后重新进行构建和部署\n\n```\\nsam build\\nsam deploy --guided\\n```\n\n如果遇到测试报错,可以在 console 上找到部署的 lambda 函数,查看 cloudwathc 日志。\n\n\n###### **option2: 打包为 Zip 包的 Lambda 函数(使用Amazon 托管运行时)**\n\n\nAmazon Lambda Web Adapter 也适用于 Amazon 托管的 Lambda 运行时。你需要做三件事:\n\n1. 将Lambda Web Adapter layer附加到您的函数。\n 1. x86_64:arn:aws:lambda:\${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:2\\n 2. arm64:arn:aws:lambda:\${AWS::Region}:753240598075:layer:LambdaAdapterLayerArm64:2\n2. 将 Lambda 环境变量 AWS_LAMBDA_EXEC_WRAPPER 配置为 /opt/bootstrap。\n3. 将 function handler 设置为您的 Web 应用程序启动脚本。例如 sh\n\n以下示例说明如何使用 Lambda 适配器在运行 express.js 应用程序,部署工具使用 SAM,因此前提条件是需要安装 Amazon cli,sam cli,nodejs:\n\n1. 下载 example 代码到开发环境电脑,[https://github.com/awslabs/aws-lambda-web-adapter/](https://github.com/awslabs/aws-lambda-web-adapter/)\n2. 进入 example 目录,cd aws-lambda-web-adapter/examples/expressjs-zip\n3. 构建和部署\n\n```\\nsam build\\nsam deploy --guided\\n```\n\n部署时需要输入一些选项,如下图所示\n\n![image.png](https://dev-media.amazoncloud.cn/4af9c202a4634f178aec38cf5a651a0d_image.png)\n\n4. 执行以上命令成功后,输出API url\n\n![image.png](https://dev-media.amazoncloud.cn/23eef4d547224b5e9291bc5db965f8eb_image.png)\n\n5. 进行 curl 测试访问,显示 “Hi there!”\n\n![image.png](https://dev-media.amazoncloud.cn/69a39dff5fc4401288a5306808cd95ab_image.png)\n\n6. 清理资源\n\n```\\nsam delete\\n```\n\n\n#### **配置说明**\n\n\n可以修改默认配置,使用环境变量配置就绪检查端口/路径和流量端口。这些环境变量可以在 docker 文件中定义,也可以定义为 Lambda 函数配置。\n\n![2IONI10YJPDC53F3O.png](https://dev-media.amazoncloud.cn/fed65eb17117402c8912802a6b4f9cb8_2IONI%2810YJP%28%25D%7DC53F%7B3%7DO.png)\n\n**REMOVE_BASE_PATH** – 此环境变量的值告诉 Lambda Web Adapter 是否在 base path 下运行。例如,您可以将 API Gateway 配置为具有 /orders/{proxy+} 和 /catalog/{proxy+} 资源。每个资源都由单独的 Lambda 函数处理。因此,Lambda 内部的应用程序可能不知道 /orders 路径存在这一事实。将请求路由到应用程序时,使用 REMOVE_BASE_PATH 删除 /orders 前缀。默认为空字符串。\n\n\n#### **各种语言的Example参考**\n\n\n除了使用 Nodejs express 之外,如果您使用的是 Flask,SpringBoot 等 web 框架开发 web 程序,可以从以下各种语言的 Example 示例开始,方便您使用自己熟悉的框架开发基于 Lambda 的 web 应用程序\n\nFlask:[https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/flask](https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/flask)\n\nExpress.js:[https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs](https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs)\n\nExpress.js in Zip:[https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs-zip](https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs-zip)\n\nSpringBoot:[https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/springboot](https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/springboot)\n\nnginx:[https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/nginx](https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/nginx)\n\nphp:[https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/php](https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/php)\n\n\n#### **收益和总结**\n\n\n*HTTP 1.1* 协议是目前最主流的应用层协议,借助 Lambda Web Adapter ,我们可以在 Lambda 中开发和部署任何兼容 HTTP 1.1/1.0 web 框架,例如 Nodejs express, php *WordPress, python Flask, nginx, java SpringBoot* 等等, 还能利用 Lambda 省去了大部分的运维工作,同时实现自动容量调配和弹性伸缩。\n\n参考资料\nLambda Web Adapter 开源文档:[https://github.com/awslabs/aws-lambda-web-adapter](https://github.com/awslabs/aws-lambda-web-adapter)\n\nLambda 服务:[https://aws.amazon.com/cn/lambda/](https://aws.amazon.com/cn/lambda/)\n\nSAM CLI:[https://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/serverless-sam-cli-install-mac.html](https://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/serverless-sam-cli-install-mac.html)\n\nAmazon CLI:[https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html](https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html)\n\n如何开发参考:[https://github.com/awslabs/aws-lambda-web-adapter/blob/main/docs/development.md](https://github.com/awslabs/aws-lambda-web-adapter/blob/main/docs/development.md)\n\n\n#### **本篇作者**\n\n\n![image.png](https://dev-media.amazoncloud.cn/51dde1f8c19d440f9480f4ff975e7b6a_image.png)\n\n\n#### **谢佰臻**\n\n\nAmazon Web Services 公司解决方案架构师,负责基于云计算方案架构的咨询和设计,目前专注于 Serverless、DevSecOps。\n\n![image.png](https://dev-media.amazoncloud.cn/1b76eee68a934445b1176f32d2eae1dd_image.png)\n\n\n#### **王寒冰**\n\n\n亚马逊云科技解决方案架构师,负责基于 Amazon 云计算方案的架构咨询和设计实现,具有丰富的解决客户实际问题的经验,专注于容器化,[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)化的应用。","render":"<h4><a id=\\"_2\\"></a><strong>背景介绍</strong></h4>\\n<p>Amazon Lambda 可结合 Amazon API Gateway 或 Application Load Balancer,使您无需提前启动或管理服务器即可运行基于 restful API 的应用程序。此时,Lambda 将以 JSON 格式的字符串接收 http 事件,并将其转换为对象,它将事件对象以及上下文传递给 Lambda 函数。而对于已经开发好的 Web 应用程序,您可能需要做一定的改造适配才能部署到已经存在的 Lambda。</p>\n<p>现在,我们推出了 Lambda Web Adapter 方案,您可以在不改造已有 WEB 应用程序代码,使用熟悉的框架(例如 Express.js、Flask、SpringBoot 和 Laravel,或任何使用 HTTP 1.1/1.0)构建 Web 应用程序并在 Amazon Lambda 上运行它。</p>\n<h4><a id=\\"_10\\"></a><strong>文章目的</strong></h4>\\n<p>本文以 nodejs express web 应用程序为例,介绍如何在不修改原有 nodejs 代码情况下,使用 Lambda Web Adapter 开发和部署一个 express web 应用部署到 Lambda。</p>\n<h4><a id=\\"_16\\"></a><strong>如何工作</strong></h4>\\n<p>Amazon Lambda Web Adapter 实际上是一个 Lambda Extensions,当 docker 镜像在 Amazon Lambda 中运行时,Lambda 会自动启动 Adapter 和运行时进程。在 Lambda Web Adapter 启动应用程序后,将每 10 毫秒对 <a href=\\"http://localhost:8080/\\" target=\\"_blank\\">http://localhost:8080/</a> 执行一次就绪检查。它将在收到应用程序的 200 响应后,启动 lambda 运行时客户端,并将 http 请求转发到 <a href=\\"http://localhost:8080/\\" target=\\"_blank\\">http://localhost:8080/</a>。 这允许开发人员在不需要修改代码的情况下,将其 Web 应用程序打包为容器映像,并运行到 Amazon Lambda 。</p>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/872ffc531b3840f5a020cb86e3a0051e_image.png\\" alt=\\"image.png\\" /></p>\n<p>目前 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 事件响应</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/00451688d96e45d28b9baf65b01f2f66_image.png\\" alt=\\"image.png\\" /></p>\n<h5><a id=\\"_Lambda_Web_Adapter_28\\"></a><strong>开始使用 Lambda Web Adapter</strong></h5>\\n<p>可以选择 Docker 镜像或者 Zip 包两种方式进行代码部署,请选择自己喜欢的方式迁移或构建您的 web 应用程序。</p>\n<p>前提条件:</p>\n<p>配置和安装 sam cli:</p>\n<p><a href=\\"https://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html\\" target=\\"_blank\\">https://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html</a></p>\\n<h6><a id=\\"option1__Docker__OCI__Lambda__40\\"></a><strong>option1: 打包为 Docker 镜像或 OCI 镜像的 Lambda 函数</strong></h6>\\n<p>可选操作:</p>\n<p>要将 Lambda Web Adapter 与 Docker 镜像一起使用,请将您的 Web 应用程序 (http api) 打包到 Dockerfile 中,然后添加一行以将 Lambda Web Adapter 二进制文件复制到容器内的 /opt/extensions。默认情况下,Lambda 适配器假定 Web 应用程序正在侦听端口 8080。如果不是,您可以通过配置指定端口。在 Lambda 之外运行时,Lambda Web Adapter 根本不运行。</p>\n<pre><code class=\\"lang-\\">COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.3.2 /lambda-adapter /opt/extensions/lambda-adapter\\n</code></pre>\\n<p>ECR 公共存储库中提供了预编译的 Lambda 适配器二进制文件:public.ecr.aws/awsguru/aws-lambda-adapter。此 repo 中还提供了多架构镜像。适用于 x86_64 和 arm64 CPU 架构。</p>\n<p>下面是一个示例 nodejs 应用程序的 Dockerfile:</p>\n<pre><code class=\\"lang-\\">FROM public.ecr.aws/docker/library/node:16.13.2-stretch-slim\\nCOPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.3.2 /lambda-adapter /opt/extensions/lambda-adapter\\nEXPOSE 8080\\nWORKDIR &quot;/var/task&quot;\\nADD src/package.json /var/task/package.json\\nADD src/package-lock.json /var/task/package-lock.json\\nRUN npm install --production\\nADD src/ /var/task\\nCMD [&quot;node&quot;, &quot;index.js&quot;]\\n</code></pre>\\n<p>开始迁移 nodejs express hello world:</p>\n<p>以下示例说明如何使用 Lambda 适配器在运行 express.js docker 应用程序,部署工具使用 SAM,因此前提条件是需要安装 Amazon cli(<a href=\\"https://aws.amazon.com/cli/\\" target=\\"_blank\\">https://aws.amazon.com/cli/</a>),sam cli(<a href=\\"https://github.com/awslabs/aws-sam-cli\\" target=\\"_blank\\">https://github.com/awslabs/aws-sam-cli</a>),docker(<a href=\\"https://www.docker.com/products/docker-desktop\\" target=\\"_blank\\">https://www.docker.com/products/docker-desktop</a>),nodejs(<a href=\\"https://nodejs.org/en/\\" target=\\"_blank\\">https://nodejs.org/en/</a>):</p>\\n<ol>\\n<li>下载 example 代码到开发环境电脑,<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter/\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter/</a></li>\\n<li>进入 example 目录</li>\n</ol>\\n<pre><code class=\\"lang-\\">cd aws-lambda-web-adapter/examples/expressjs\\n</code></pre>\\n<ol start=\\"3\\">\\n<li>登陆 docker,用于构建 image 镜像</li>\n</ol>\\n<pre><code class=\\"lang-\\">aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws\\n</code></pre>\\n<ol start=\\"4\\">\\n<li>构建和部署</li>\n</ol>\\n<pre><code class=\\"lang-\\">sam build\\nsam deploy --guided\\n</code></pre>\\n<p>部署时需要输入一些选项,如下图所示</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/2885c54607874eab94c72bea82af35c7_image.png\\" alt=\\"image.png\\" /></p>\n<ol start=\\"5\\">\\n<li>执行以上命令成功后,输出API url</li>\n</ol>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/63c4e41c48ae4feda6bc38b192f3d20d_image.png\\" alt=\\"image.png\\" /></p>\n<ol start=\\"6\\">\\n<li>进行 curl 测试访问,显示 “Hi there!”</li>\n</ol>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/59b2f884ba25482d9735cbb901886eec_image.png\\" alt=\\"image.png\\" /></p>\n<ol start=\\"7\\">\\n<li>清理资源</li>\n</ol>\\n<pre><code class=\\"lang-\\">sam delete\\n</code></pre>\\n<p>部署过程中如果遇到报错,可以登陆控制台手动删除该 sam 对应的 cloudformation 模板,然后重新开始部署。</p>\n<p>以上 example 代码适用于除 Amazon 托管基础镜像之外的任何基础镜像。</p>\n<p>Amazon 提供了一组可用于创建容器映像的基础映像,这些基础镜像包括运行时接口客户端,用于管理 Lambda 和函数代码之间的交互。要使用 Amazon 托管基础映像,您需要覆盖 ENTRYPOINT 以启动您的 Web 应用程序。以下 Dockfile 使用 Amazon Lambda 基础镜像:</p>\n<pre><code class=\\"lang-\\">FROM public.ecr.aws/lambda/nodejs:14\\nCOPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.3.1 /opt/extensions/lambda-adapter /opt/extensions/lambda-adapter\\nEXPOSE 8080\\nWORKDIR &quot;/var/task&quot;\\nADD src/package.json /var/task/package.json\\nADD src/package-lock.json /var/task/package-lock.json\\nRUN npm install --production\\nADD src/index.js /var/task/index.js\\nENTRYPOINT [ &quot;node&quot;, &quot;index.js&quot; ]\\n</code></pre>\\n<p>然后重新进行构建和部署</p>\n<pre><code class=\\"lang-\\">sam build\\nsam deploy --guided\\n</code></pre>\\n<p>如果遇到测试报错,可以在 console 上找到部署的 lambda 函数,查看 cloudwathc 日志。</p>\n<h6><a id=\\"option2__Zip__Lambda_Amazon__137\\"></a><strong>option2: 打包为 Zip 包的 Lambda 函数(使用Amazon 托管运行时)</strong></h6>\\n<p>Amazon Lambda Web Adapter 也适用于 Amazon 托管的 Lambda 运行时。你需要做三件事:</p>\n<ol>\\n<li>将Lambda Web Adapter layer附加到您的函数。\\n<ol>\\n<li>x86_64:arn:aws:lambda:\${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:2</li>\n<li>arm64:arn:aws:lambda:\${AWS::Region}:753240598075:layer:LambdaAdapterLayerArm64:2</li>\n</ol>\\n</li>\n<li>将 Lambda 环境变量 AWS_LAMBDA_EXEC_WRAPPER 配置为 /opt/bootstrap。</li>\n<li>将 function handler 设置为您的 Web 应用程序启动脚本。例如 sh</li>\n</ol>\\n<p>以下示例说明如何使用 Lambda 适配器在运行 express.js 应用程序,部署工具使用 SAM,因此前提条件是需要安装 Amazon cli,sam cli,nodejs:</p>\n<ol>\\n<li>下载 example 代码到开发环境电脑,<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter/\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter/</a></li>\\n<li>进入 example 目录,cd aws-lambda-web-adapter/examples/expressjs-zip</li>\n<li>构建和部署</li>\n</ol>\\n<pre><code class=\\"lang-\\">sam build\\nsam deploy --guided\\n</code></pre>\\n<p>部署时需要输入一些选项,如下图所示</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/4af9c202a4634f178aec38cf5a651a0d_image.png\\" alt=\\"image.png\\" /></p>\n<ol start=\\"4\\">\\n<li>执行以上命令成功后,输出API url</li>\n</ol>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/23eef4d547224b5e9291bc5db965f8eb_image.png\\" alt=\\"image.png\\" /></p>\n<ol start=\\"5\\">\\n<li>进行 curl 测试访问,显示 “Hi there!”</li>\n</ol>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/69a39dff5fc4401288a5306808cd95ab_image.png\\" alt=\\"image.png\\" /></p>\n<ol start=\\"6\\">\\n<li>清理资源</li>\n</ol>\\n<pre><code class=\\"lang-\\">sam delete\\n</code></pre>\\n<h4><a id=\\"_178\\"></a><strong>配置说明</strong></h4>\\n<p>可以修改默认配置,使用环境变量配置就绪检查端口/路径和流量端口。这些环境变量可以在 docker 文件中定义,也可以定义为 Lambda 函数配置。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/fed65eb17117402c8912802a6b4f9cb8_2IONI%2810YJP%28%25D%7DC53F%7B3%7DO.png\\" alt=\\"2IONI10YJPDC53F3O.png\\" /></p>\n<p><strong>REMOVE_BASE_PATH</strong> – 此环境变量的值告诉 Lambda Web Adapter 是否在 base path 下运行。例如,您可以将 API Gateway 配置为具有 /orders/{proxy+} 和 /catalog/{proxy+} 资源。每个资源都由单独的 Lambda 函数处理。因此,Lambda 内部的应用程序可能不知道 /orders 路径存在这一事实。将请求路由到应用程序时,使用 REMOVE_BASE_PATH 删除 /orders 前缀。默认为空字符串。</p>\\n<h4><a id=\\"Example_188\\"></a><strong>各种语言的Example参考</strong></h4>\\n<p>除了使用 Nodejs express 之外,如果您使用的是 Flask,SpringBoot 等 web 框架开发 web 程序,可以从以下各种语言的 Example 示例开始,方便您使用自己熟悉的框架开发基于 Lambda 的 web 应用程序</p>\n<p>Flask:<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/flask\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/flask</a></p>\\n<p>Express.js:<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs</a></p>\\n<p>Express.js in Zip:<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs-zip\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs-zip</a></p>\\n<p>SpringBoot:<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/springboot\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/springboot</a></p>\\n<p>nginx:<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/nginx\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/nginx</a></p>\\n<p>php:<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/php\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/php</a></p>\\n<h4><a id=\\"_206\\"></a><strong>收益和总结</strong></h4>\\n<p><em>HTTP 1.1</em> 协议是目前最主流的应用层协议,借助 Lambda Web Adapter ,我们可以在 Lambda 中开发和部署任何兼容 HTTP 1.1/1.0 web 框架,例如 Nodejs express, php <em>WordPress, python Flask, nginx, java SpringBoot</em> 等等, 还能利用 Lambda 省去了大部分的运维工作,同时实现自动容量调配和弹性伸缩。</p>\\n<p>参考资料<br />\\nLambda Web Adapter 开源文档:<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter</a></p>\\n<p>Lambda 服务:<a href=\\"https://aws.amazon.com/cn/lambda/\\" target=\\"_blank\\">https://aws.amazon.com/cn/lambda/</a></p>\\n<p>SAM CLI:<a href=\\"https://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/serverless-sam-cli-install-mac.html\\" target=\\"_blank\\">https://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/serverless-sam-cli-install-mac.html</a></p>\\n<p>Amazon CLI:<a href=\\"https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html\\" target=\\"_blank\\">https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-files.html</a></p>\\n<p>如何开发参考:<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter/blob/main/docs/development.md\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter/blob/main/docs/development.md</a></p>\\n<h4><a id=\\"_223\\"></a><strong>本篇作者</strong></h4>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/51dde1f8c19d440f9480f4ff975e7b6a_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"_229\\"></a><strong>谢佰臻</strong></h4>\\n<p>Amazon Web Services 公司解决方案架构师,负责基于云计算方案架构的咨询和设计,目前专注于 Serverless、DevSecOps。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/1b76eee68a934445b1176f32d2eae1dd_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"_237\\"></a><strong>王寒冰</strong></h4>\\n<p>亚马逊云科技解决方案架构师,负责基于 Amazon 云计算方案的架构咨询和设计实现,具有丰富的解决客户实际问题的经验,专注于容器化,无服务器化的应用。</p>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭