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

0
0
{"value":"\n\n#### **背景介绍**\n\n\nAmazon Lambda 可结合 Amazon API Gateway 或 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 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 云计算方案的架构咨询和设计实现,具有丰富的解决客户实际问题的经验,专注于容器化,无服务器化的应用。","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
目录
关闭