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

亚马逊云科技
Amazon Lambda
0
0
{"value":"### **前言**\nAmazon Lambda 可结合 [Amazon API Gateway](https://aws.amazon.com/cn/api-gateway/?trk=cndc-detail) 或 Application Load Balancer ,使您无需提前启动或管理服务器即可运行基于 restful API 的应用程序。此时,Amazon Lambda 将以 JSON 格式的字符串接收 http 事件,并将其转换为对象,它将事件对象以及上下文传递给 Lambda 函数。而对于已经开发好的 Web 应用程序,您可能需要做一定的改造适配才能部署到已经存在的 Amazon Lambda。\n\n现在,我们推出了 Amazon Lambda Web Adapter 方案,您可以在不改造已有 Web 应用程序代码,使用熟悉的框架(例如 Express.js, Flask, SpringBoot 和 Laravel,或任何使用 HTTP 1.1/1.0)构建 Web 应用程序并在 Amazon Lambda 上运行它。\n\n### **文章目的**\n本文以 nodejs express web 应用程序为例,介绍如何在不修改原有 nodejs 代码情况下,使用 Amazon Lambda Web Adapter 开发和部署一个 express web 应用部署到 Amazon Lambda。\n### **如何工作**\nAmazon Lambda Web Adapter 实际上是一个 Lambda Extensions,当 docker 镜像在 Amazon Lambda 中运行时, Lambda 会自动启动 Adapter 和运行时进程。在 Amazon Lambda Web Adapter 启动应用程序后,将每 10 毫秒对 [http://localhost:8080/ ](http://localhost:8080/ )执行一次就绪检查。\n\n它将在收到应用程序的 200 响应后,启动 Amazon Lambda 运行时客户端,并将 http 请求转发到 [http://localhost:8080](http://localhost:8080)。这允许开发人员在不需要修改代码的情况下,将其 Web 应用程序打包为容器映像,并运行到 Amazon Lambda。\n\n![image.png](https://dev-media.amazoncloud.cn/ad89fac3ebab4be3a1c16a7864f349ea_image.png)\n\n目前 Amazon 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 执行代码逻辑,Amazon Lambda Adapter 将前端请求转换为 http 请求并发送到 Web 应用程序,等到 Web 应用程序处理好之后,再将 http 响应转换回 Lambda 事件响应。\n\n![image.png](https://dev-media.amazoncloud.cn/ff7f72a8149342599408fedf7ee9899a_image.png)\n\n### **开始使用 Lambda Web Adapter**\n可以选择 Docker 镜像或者 Zip 包两种方式进行代码部署,请选择自己喜欢的方式迁移或构建您的 Web 应用程序。\n\n前提条件:\n\n配置和安装 sam cli:\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#### **option1: 打包为 Docker 镜像或 OCI 镜像的 Lambda 函数**\n可选操作:\n要将 Amazon Lambda Web Adapter 与 Docker 镜像一起使用,请将您的 Web 应用程序 (http api) 打包到 Dockerfile 中,然后添加一行以将 Lambda Web Adapter 二进制文件复制到容器内的 /opt/extensions 。默认情况下,Amazon Lambda 适配器假定 Web 应用程序正在侦听端口 8080。如果不是,您可以通过配置指定端口。在 Amazon Lambda 之外运行时,Amazon Lambda Web Adapter 根本不运行。\n```\\nCOPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.3.2 /lambda-adapter /opt/extensions/lambda-adapter\\n```\nECR 公共存储库中提供了预编译的 Lambda 适配器二进制文件:public.ecr.aws/awsguru/aws-lambda-adapter。此 repo 中还提供了多架构镜像。适用于 x86_64 和 arm64 CPU 架构。\n\n下面是一个示例 nodejs 应用程序的 Dockerfile:\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开始迁移 nodejs express hello world:\n\n以下示例说明如何使用 Amazon 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/)):\n1.下载 example 代码到开发环境电脑,[https://github.com/awslabs/aws-lambda-web-adapter/](https://github.com/awslabs/aws-lambda-web-adapter/)\n2.进入 example 目录\n```\\ncd aws-lambda-web-adapter/examples/expressjs\\n```\n3.登陆 docker,用于构建 image 镜像\n\n```\\naws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aw\\n```\n4.构建和部署\n```\\nsam build\\nsam deploy --guided\\n```\n部署时需要输入一些选项,如下图所示:\n\n![image.png](https://dev-media.amazoncloud.cn/3fae5707e45c44bcab07e05b5754cc4f_image.png)\n\n5.执行以上命令成功后,输出 API url\n\n![image.png](https://dev-media.amazoncloud.cn/fe7d6b80923543e6af1175845c18fa55_image.png)\n\n6.进行 curl 测试访问,显示 “Hi there!”\n\n![image.png](https://dev-media.amazoncloud.cn/8e6e3e6cf0ad4eb0965a080152ccfd4c_image.png)\n\n7.清理资源\n```\\nsam delete\\n```\n部署过程中如果遇到报错,可以登陆控制台手动删除该 sam 对应的 cloudformation 模板,然后重新开始部署。\n\n以上 example 代码适用于除 Amazon 托管基础镜像之外的任何基础镜像。\n\n亚马逊云科技提供了一组可用于创建容器映像的基础映像,这些基础镜像包括运行时接口客户端,用于管理 Lambda 和函数代码之间的交互。要使用 Amazon 托管基础映像,您需要覆盖 ENTRYPOINT 以启动您的 Web 应用程序。以下 Dockfile 使用 Amazon Lambda 基础镜像:\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```\\nsam build\\nsam deploy --guided\\n```\n如果遇到测试报错,可以在 console 上找到部署的 Lambda 函数,查看 CloudWatch 日志。\n#### **option2: 打包为 Zip 包的 Lambda 函数(使用 Amazon 托管运行时)**\nAmazon Lambda Web Adapter 也适用于 Amazon 托管的 Lambda 运行时。\n\n你需要做三件事:\n\n1.将 Lambda Web Adapter layer 附加到您的函数。\n\na.x86_64:arn:aws:lambda:\${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:2\\nb.arm64:arn:aws:lambda:\${AWS::Region}:753240598075:layer:LambdaAdapterLayerArm64:2\n\n2.将 Lambda 环境变量 AWS_LAMBDA_EXEC_WRAPPER 配置为 /opt/bootstrap。\n\n3.将 function handler 设置为您的 Web 应用程序启动脚本。例如 sh\n\n以下示例说明如何使用 Amazon Lambda 适配器在运行 express.js 应用程序,部署工具使用 SAM ,因此前提条件是需要安装 aws cli, sam cli, nodejs:\n\n1.下载 example 代码到开发环境电脑,[https://github.com/awslabs/aws-lambda-web-adapter/](https://github.com/awslabs/aws-lambda-web-adapter/)\n\n2.进入 example 目录,cd aws-lambda-web-adapter/examples/expressjs-zip\n\n3.构建和部署\n```\\nsam build\\nsam deploy --guided\\n```\n部署时需要输入一些选项,如下图所示:\n\n![image.png](https://dev-media.amazoncloud.cn/18e50fe4f8ce4278af8818c3ed152436_image.png)\n\n4.执行以上命令成功后,输出 API url\n\n![image.png](https://dev-media.amazoncloud.cn/86d2077f42514097b97b0f527c29d7ca_image.png)\n\n5.进行 curl 测试访问,显示 “Hi there!”\n\n![image.png](https://dev-media.amazoncloud.cn/ddd6a0e2980843968ef36ed373bad8cb_image.png)\n\n6.清理资源\n```\\nsam delete\\n```\n### **配置说明**\n可以修改默认配置,使用环境变量配置就绪检查端口/路径和流量端口。这些环境变量可以在 docker 文件中定义,也可以定义为 Amazon Lambda 函数配置。\n\n![image.png](https://dev-media.amazoncloud.cn/4fc568fdb5b0413fb8cfa96ceac43fc7_image.png)\n\nREMOVE_BASE_PATH – 此环境变量的值告诉 Lambda Web Adapter 是否在 base path 下运行。例如,您可以将 API Gateway 配置为具有 /orders/{proxy+} 和 /catalog/{proxy+} 资源。每个资源都由单独的 Lambda 函数处理。因此,Lambda 内部的应用程序可能不知道 /orders 路径存在这一事实。将请求路由到应用程序时,使用 REMOVE_BASE_PATH 删除 /orders 前缀。默认为空字符串。\n\n### **各种语言的Example参考**\n\n除了使用 Nodejs express 之外,如果您使用的是 Flask, SpringBoot 等 Web 框架开发 Web 程序,可以从以下各种语言的 example 示例开始,方便您使用自己熟悉的框架开发基于 Lambda 的 Web 应用程序。\n\nFlask:\n[https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/flask](https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/flask)\nExpress.js:\n[https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs](https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/expressjs)\nExpress.js in Zip:\n[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)\nSpringBoot:\n[https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/springboot](https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/springboot)\nnginx:\n[https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/nginx](https://github.com/awslabs/aws-lambda-web-adapter/blob/main/examples/nginx)\nphp:\n[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### **收益和总结**\nHTTP 1.1 协议是目前最主流的应用层协议,借助 Amazon Lambda Web Adapter ,我们可以在 Amazon Lambda 中开发和部署任何兼容 HTTP 1.1/1.0 web 框架,例如 Nodejs express, php WordPress, python Flask, nginx, java SpringBoot 等等, 还能利用 Lambda 省去了大部分的运维工作,同时实现自动容量调配和弹性伸缩。\n### **参考资料**\nLambda Web Adapter 开源文档:\n[https://github.com/awslabs/aws-lambda-web-adapter](https://github.com/awslabs/aws-lambda-web-adapter)\nLambda 服务:\n[https://aws.amazon.com/cn/lambda/](https://aws.amazon.com/cn/lambda/)\nSAM CLI:\n[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)\nAmazon CLI:\n[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**谢佰臻**\nAmazon Web Services 公司解决方案架构师,负责基于云计算方案架构的咨询和设计,目前专注于 Serverless ,DevSecOps。\n\n\n**王寒冰**\n亚马逊云科技解决方案架构师,负责基于亚马逊云计算方案的架构咨询和设计实现,具有丰富的解决客户实际问题的经验,专注于容器化,[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)化的应用。\n\n[阅读原文](https://aws.amazon.com/cn/blogs/china/building-web-applications-on-lambda-using-the-lambda-web-adapter/)","render":"<h3><a id=\\"_0\\"></a><strong>前言</strong></h3>\\n<p>Amazon Lambda 可结合 Amazon API Gateway 或 Application Load Balancer ,使您无需提前启动或管理服务器即可运行基于 restful API 的应用程序。此时,Amazon Lambda 将以 JSON 格式的字符串接收 http 事件,并将其转换为对象,它将事件对象以及上下文传递给 Lambda 函数。而对于已经开发好的 Web 应用程序,您可能需要做一定的改造适配才能部署到已经存在的 Amazon Lambda。</p>\n<p>现在,我们推出了 Amazon Lambda Web Adapter 方案,您可以在不改造已有 Web 应用程序代码,使用熟悉的框架(例如 Express.js, Flask, SpringBoot 和 Laravel,或任何使用 HTTP 1.1/1.0)构建 Web 应用程序并在 Amazon Lambda 上运行它。</p>\n<h3><a id=\\"_5\\"></a><strong>文章目的</strong></h3>\\n<p>本文以 nodejs express web 应用程序为例,介绍如何在不修改原有 nodejs 代码情况下,使用 Amazon Lambda Web Adapter 开发和部署一个 express web 应用部署到 Amazon Lambda。</p>\n<h3><a id=\\"_7\\"></a><strong>如何工作</strong></h3>\\n<p>Amazon Lambda Web Adapter 实际上是一个 Lambda Extensions,当 docker 镜像在 Amazon Lambda 中运行时, Lambda 会自动启动 Adapter 和运行时进程。在 Amazon Lambda Web Adapter 启动应用程序后,将每 10 毫秒对 <a href=\\"http://localhost:8080/\\" target=\\"_blank\\">http://localhost:8080/ </a>执行一次就绪检查。</p>\\n<p>它将在收到应用程序的 200 响应后,启动 Amazon 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/ad89fac3ebab4be3a1c16a7864f349ea_image.png\\" alt=\\"image.png\\" /></p>\n<p>目前 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 事件响应。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/ff7f72a8149342599408fedf7ee9899a_image.png\\" alt=\\"image.png\\" /></p>\n<h3><a id=\\"_Lambda_Web_Adapter_18\\"></a><strong>开始使用 Lambda Web Adapter</strong></h3>\\n<p>可以选择 Docker 镜像或者 Zip 包两种方式进行代码部署,请选择自己喜欢的方式迁移或构建您的 Web 应用程序。</p>\n<p>前提条件:</p>\n<p>配置和安装 sam cli:<br />\\n<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<h4><a id=\\"option1__Docker__OCI__Lambda__25\\"></a><strong>option1: 打包为 Docker 镜像或 OCI 镜像的 Lambda 函数</strong></h4>\\n<p>可选操作:<br />\\n要将 Amazon Lambda Web Adapter 与 Docker 镜像一起使用,请将您的 Web 应用程序 (http api) 打包到 Dockerfile 中,然后添加一行以将 Lambda Web Adapter 二进制文件复制到容器内的 /opt/extensions 。默认情况下,Amazon Lambda 适配器假定 Web 应用程序正在侦听端口 8080。如果不是,您可以通过配置指定端口。在 Amazon Lambda 之外运行时,Amazon 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>以下示例说明如何使用 Amazon 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>):<br />\\n1.下载 example 代码到开发环境电脑,<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter/\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter/</a><br />\\n2.进入 example 目录</p>\n<pre><code class=\\"lang-\\">cd aws-lambda-web-adapter/examples/expressjs\\n</code></pre>\\n<p>3.登陆 docker,用于构建 image 镜像</p>\n<pre><code class=\\"lang-\\">aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aw\\n</code></pre>\\n<p>4.构建和部署</p>\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/3fae5707e45c44bcab07e05b5754cc4f_image.png\\" alt=\\"image.png\\" /></p>\n<p>5.执行以上命令成功后,输出 API url</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/fe7d6b80923543e6af1175845c18fa55_image.png\\" alt=\\"image.png\\" /></p>\n<p>6.进行 curl 测试访问,显示 “Hi there!”</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/8e6e3e6cf0ad4eb0965a080152ccfd4c_image.png\\" alt=\\"image.png\\" /></p>\n<p>7.清理资源</p>\n<pre><code class=\\"lang-\\">sam delete\\n</code></pre>\\n<p>部署过程中如果遇到报错,可以登陆控制台手动删除该 sam 对应的 cloudformation 模板,然后重新开始部署。</p>\n<p>以上 example 代码适用于除 Amazon 托管基础镜像之外的任何基础镜像。</p>\n<p>亚马逊云科技提供了一组可用于创建容器映像的基础映像,这些基础镜像包括运行时接口客户端,用于管理 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 函数,查看 CloudWatch 日志。</p>\n<h4><a id=\\"option2__Zip__Lambda__Amazon__101\\"></a><strong>option2: 打包为 Zip 包的 Lambda 函数(使用 Amazon 托管运行时)</strong></h4>\\n<p>Amazon Lambda Web Adapter 也适用于 Amazon 托管的 Lambda 运行时。</p>\n<p>你需要做三件事:</p>\n<p>1.将 Lambda Web Adapter layer 附加到您的函数。</p>\n<p>a.x86_64:arn:aws:lambda:<span class=\\"katex\\"><span class=\\"katex-mathml\\"><math><semantics><mrow><mrow><mi>A</mi><mi>W</mi><mi>S</mi><mo>:</mo><mo>:</mo><mi>R</mi><mi>e</mi><mi>g</mi><mi>i</mi><mi>o</mi><mi>n</mi></mrow><mo>:</mo><mn>7</mn><mn>5</mn><mn>3</mn><mn>2</mn><mn>4</mn><mn>0</mn><mn>5</mn><mn>9</mn><mn>8</mn><mn>0</mn><mn>7</mn><mn>5</mn><mo>:</mo><mi>l</mi><mi>a</mi><mi>y</mi><mi>e</mi><mi>r</mi><mo>:</mo><mi>L</mi><mi>a</mi><mi>m</mi><mi>b</mi><mi>d</mi><mi>a</mi><mi>A</mi><mi>d</mi><mi>a</mi><mi>p</mi><mi>t</mi><mi>e</mi><mi>r</mi><mi>L</mi><mi>a</mi><mi>y</mi><mi>e</mi><mi>r</mi><mi>X</mi><mn>8</mn><mn>6</mn><mo>:</mo><mn>2</mn><mi>b</mi><mi mathvariant=\\"normal\\">.</mi><mi>a</mi><mi>r</mi><mi>m</mi><mn>6</mn><mn>4</mn><mo>:</mo><mi>a</mi><mi>r</mi><mi>n</mi><mo>:</mo><mi>a</mi><mi>w</mi><mi>s</mi><mo>:</mo><mi>l</mi><mi>a</mi><mi>m</mi><mi>b</mi><mi>d</mi><mi>a</mi><mo>:</mo></mrow><annotation encoding=\\"application/x-tex\\">{AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:2\\nb.arm64:arn:aws:lambda:</annotation></semantics></math></span><span class=\\"katex-html\\" aria-hidden=\\"true\\"><span class=\\"strut\\" style=\\"height:0.69444em;\\"></span><span class=\\"strut bottom\\" style=\\"height:0.8888799999999999em;vertical-align:-0.19444em;\\"></span><span class=\\"base\\"><span class=\\"mord\\"><span class=\\"mord mathit\\">A</span><span class=\\"mord mathit\\" style=\\"margin-right:0.13889em;\\">W</span><span class=\\"mord mathit\\" style=\\"margin-right:0.05764em;\\">S</span><span class=\\"mrel\\">:</span><span class=\\"mrel\\">:</span><span class=\\"mord mathit\\" style=\\"margin-right:0.00773em;\\">R</span><span class=\\"mord mathit\\">e</span><span class=\\"mord mathit\\" style=\\"margin-right:0.03588em;\\">g</span><span class=\\"mord mathit\\">i</span><span class=\\"mord mathit\\">o</span><span class=\\"mord mathit\\">n</span></span><span class=\\"mrel\\">:</span><span class=\\"mord mathrm\\">7</span><span class=\\"mord mathrm\\">5</span><span class=\\"mord mathrm\\">3</span><span class=\\"mord mathrm\\">2</span><span class=\\"mord mathrm\\">4</span><span class=\\"mord mathrm\\">0</span><span class=\\"mord mathrm\\">5</span><span class=\\"mord mathrm\\">9</span><span class=\\"mord mathrm\\">8</span><span class=\\"mord mathrm\\">0</span><span class=\\"mord mathrm\\">7</span><span class=\\"mord mathrm\\">5</span><span class=\\"mrel\\">:</span><span class=\\"mord mathit\\" style=\\"margin-right:0.01968em;\\">l</span><span class=\\"mord mathit\\">a</span><span class=\\"mord mathit\\" style=\\"margin-right:0.03588em;\\">y</span><span class=\\"mord mathit\\">e</span><span class=\\"mord mathit\\" style=\\"margin-right:0.02778em;\\">r</span><span class=\\"mrel\\">:</span><span class=\\"mord mathit\\">L</span><span class=\\"mord mathit\\">a</span><span class=\\"mord mathit\\">m</span><span class=\\"mord mathit\\">b</span><span class=\\"mord mathit\\">d</span><span class=\\"mord mathit\\">a</span><span class=\\"mord mathit\\">A</span><span class=\\"mord mathit\\">d</span><span class=\\"mord mathit\\">a</span><span class=\\"mord mathit\\">p</span><span class=\\"mord mathit\\">t</span><span class=\\"mord mathit\\">e</span><span class=\\"mord mathit\\" style=\\"margin-right:0.02778em;\\">r</span><span class=\\"mord mathit\\">L</span><span class=\\"mord mathit\\">a</span><span class=\\"mord mathit\\" style=\\"margin-right:0.03588em;\\">y</span><span class=\\"mord mathit\\">e</span><span class=\\"mord mathit\\" style=\\"margin-right:0.02778em;\\">r</span><span class=\\"mord mathit\\" style=\\"margin-right:0.07847em;\\">X</span><span class=\\"mord mathrm\\">8</span><span class=\\"mord mathrm\\">6</span><span class=\\"mrel\\">:</span><span class=\\"mord mathrm\\">2</span><span class=\\"mord mathit\\">b</span><span class=\\"mord mathrm\\">.</span><span class=\\"mord mathit\\">a</span><span class=\\"mord mathit\\" style=\\"margin-right:0.02778em;\\">r</span><span class=\\"mord mathit\\">m</span><span class=\\"mord mathrm\\">6</span><span class=\\"mord mathrm\\">4</span><span class=\\"mrel\\">:</span><span class=\\"mord mathit\\">a</span><span class=\\"mord mathit\\" style=\\"margin-right:0.02778em;\\">r</span><span class=\\"mord mathit\\">n</span><span class=\\"mrel\\">:</span><span class=\\"mord mathit\\">a</span><span class=\\"mord mathit\\" style=\\"margin-right:0.02691em;\\">w</span><span class=\\"mord mathit\\">s</span><span class=\\"mrel\\">:</span><span class=\\"mord mathit\\" style=\\"margin-right:0.01968em;\\">l</span><span class=\\"mord mathit\\">a</span><span class=\\"mord mathit\\">m</span><span class=\\"mord mathit\\">b</span><span class=\\"mord mathit\\">d</span><span class=\\"mord mathit\\">a</span><span class=\\"mrel\\">:</span></span></span></span>{AWS::Region}:753240598075:layer:LambdaAdapterLayerArm64:2</p>\n<p>2.将 Lambda 环境变量 AWS_LAMBDA_EXEC_WRAPPER 配置为 /opt/bootstrap。</p>\n<p>3.将 function handler 设置为您的 Web 应用程序启动脚本。例如 sh</p>\n<p>以下示例说明如何使用 Amazon Lambda 适配器在运行 express.js 应用程序,部署工具使用 SAM ,因此前提条件是需要安装 aws cli, sam cli, nodejs:</p>\n<p>1.下载 example 代码到开发环境电脑,<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter/\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter/</a></p>\\n<p>2.进入 example 目录,cd aws-lambda-web-adapter/examples/expressjs-zip</p>\n<p>3.构建和部署</p>\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/18e50fe4f8ce4278af8818c3ed152436_image.png\\" alt=\\"image.png\\" /></p>\n<p>4.执行以上命令成功后,输出 API url</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/86d2077f42514097b97b0f527c29d7ca_image.png\\" alt=\\"image.png\\" /></p>\n<p>5.进行 curl 测试访问,显示 “Hi there!”</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/ddd6a0e2980843968ef36ed373bad8cb_image.png\\" alt=\\"image.png\\" /></p>\n<p>6.清理资源</p>\n<pre><code class=\\"lang-\\">sam delete\\n</code></pre>\\n<h3><a id=\\"_142\\"></a><strong>配置说明</strong></h3>\\n<p>可以修改默认配置,使用环境变量配置就绪检查端口/路径和流量端口。这些环境变量可以在 docker 文件中定义,也可以定义为 Amazon Lambda 函数配置。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/4fc568fdb5b0413fb8cfa96ceac43fc7_image.png\\" alt=\\"image.png\\" /></p>\n<p>REMOVE_BASE_PATH – 此环境变量的值告诉 Lambda Web Adapter 是否在 base path 下运行。例如,您可以将 API Gateway 配置为具有 /orders/{proxy+} 和 /catalog/{proxy+} 资源。每个资源都由单独的 Lambda 函数处理。因此,Lambda 内部的应用程序可能不知道 /orders 路径存在这一事实。将请求路由到应用程序时,使用 REMOVE_BASE_PATH 删除 /orders 前缀。默认为空字符串。</p>\n<h3><a id=\\"Example_149\\"></a><strong>各种语言的Example参考</strong></h3>\\n<p>除了使用 Nodejs express 之外,如果您使用的是 Flask, SpringBoot 等 Web 框架开发 Web 程序,可以从以下各种语言的 example 示例开始,方便您使用自己熟悉的框架开发基于 Lambda 的 Web 应用程序。</p>\n<p>Flask:<br />\\n<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><br />\\nExpress.js:<br />\\n<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><br />\\nExpress.js in Zip:<br />\\n<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><br />\\nSpringBoot:<br />\\n<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><br />\\nnginx:<br />\\n<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><br />\\nphp:<br />\\n<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<h3><a id=\\"_166\\"></a><strong>收益和总结</strong></h3>\\n<p>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 省去了大部分的运维工作,同时实现自动容量调配和弹性伸缩。</p>\n<h3><a id=\\"_168\\"></a><strong>参考资料</strong></h3>\\n<p>Lambda Web Adapter 开源文档:<br />\\n<a href=\\"https://github.com/awslabs/aws-lambda-web-adapter\\" target=\\"_blank\\">https://github.com/awslabs/aws-lambda-web-adapter</a><br />\\nLambda 服务:<br />\\n<a href=\\"https://aws.amazon.com/cn/lambda/\\" target=\\"_blank\\">https://aws.amazon.com/cn/lambda/</a><br />\\nSAM CLI:<br />\\n<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><br />\\nAmazon CLI:<br />\\n<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><br />\\n如何开发参考:<br />\\n<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<h3><a id=\\"_180\\"></a><strong>本篇作者</strong></h3>\\n<p><strong>谢佰臻</strong><br />\\nAmazon Web Services 公司解决方案架构师,负责基于云计算方案架构的咨询和设计,目前专注于 Serverless ,DevSecOps。</p>\n<p><strong>王寒冰</strong><br />\\n亚马逊云科技解决方案架构师,负责基于亚马逊云计算方案的架构咨询和设计实现,具有丰富的解决客户实际问题的经验,专注于容器化,无服务器化的应用。</p>\n<p><a href=\\"https://aws.amazon.com/cn/blogs/china/building-web-applications-on-lambda-using-the-lambda-web-adapter/\\" target=\\"_blank\\">阅读原文</a></p>\n"}
0
目录
关闭