通过AWS Lambda部署Flask web应用程序

通过AWS Lambda部署Flask web应用程序,flask,aws-lambda,aws-api-gateway,serverless,Flask,Aws Lambda,Aws Api Gateway,Serverless,我对AWS Lambda非常陌生,根据我在网上找到的许多示例(阅读无穷无尽的文档),我很难理解它的功能。我理解使用这种服务的主要目标是实现一个无服务器架构,该架构通过允许Lambda和API网关承担管理服务器的角色(因此,无服务器并不意味着您不使用服务器,但该架构为您解决了一些问题),从而具有成本效益和工作效率。我对开发人员在Lambda上部署Flask web应用程序时采用的两种通用方法进行了研究: 使用zappa将整个应用程序部署到Lambda,zappa配置(json文件)将作为API网关

我对AWS Lambda非常陌生,根据我在网上找到的许多示例(阅读无穷无尽的文档),我很难理解它的功能。我理解使用这种服务的主要目标是实现一个无服务器架构,该架构通过允许Lambda和API网关承担管理服务器的角色(因此,无服务器并不意味着您不使用服务器,但该架构为您解决了一些问题),从而具有成本效益和工作效率。我对开发人员在Lambda上部署Flask web应用程序时采用的两种通用方法进行了研究:

  • 使用zappa将整个应用程序部署到Lambda,zappa配置(json文件)将作为API网关身份验证

  • 仅部署函数,该解析黑盒将用户输入转换为后端端点期望的形式(以及向后)->从配置Lambda代理的API网关获取代理url->拥有使用该url的单独应用程序

  • (还有3个,它不使用API网关,在应用程序本身中调用Lambda函数,但我真的想亲身体验使用API网关)

    以下是我对上述两种方法的问题:

    对于1,我不理解Lambda是如何调用Flask应用程序中的函数的。根据我的理解,Lambda只调用具有参数event和context的函数,或者是url调用(由API网关制定的url),实际上是调用Flask应用程序中单独函数的事件,因此使Lambda能够作为“无服务器”环境运行,这对我来说没有意义,因为,在我分析的大多数示例中,都是用户输入的数据。这意味着应用程序中的一些函数没有事件,而另一些函数有事件,这意味着Lambda神奇地知道如何处理不同的函数调用

    我也知道Lambda的容量有限,所以这是最好的方法吗?这似乎是在Lambda上部署web应用程序的标准方式

    对于2,我理解将API网关URL合并到Flask应用程序中的步骤。因此,Flask应用程序将使用url访问Lambda函数,并具有供用户访问的HTTP端点。但是,这意味着,如果我的本地计算机上有Flask应用程序,那么只有在我的计算机上运行应用程序时,应用程序才会被托管—我希望它具有持久的公共访问权限(希望如此)。我读过AWS Cloud9,这是一个好的解决方案吗?我应该在哪里部署应用程序本身来优化该体系结构,而不使用消除该体系结构不严格性的服务(比如EC2实例或S3实例,在S3上,我将放置前端html文件并托管网站)?另外,回到1(很抱歉,我试图以一种连贯的方式组织我的想法,但效果不太好),只要我保持API网关端点打开,应用程序是否会持续运行

    我不知道使用AWS Lambda和API网关部署Flask应用程序的最佳实践是什么,但根据我的发现,上面两种是最常用的。如果你能回答我的问题,这样我就可以真正开始玩AWS Lambda了,这将非常有帮助!非常感谢。(+我确实阅读了所有亚马逊的文档,这些是我开始实验之前最后剩下的问题:)

  • Zappa有自己的代码来处理请求,并使它们与“Flask”格式兼容。请记住,在使用Lambda的任何情况下,您都没有真正按照预期使用烧瓶。lambda仅在调用时被调用,flask通常保持运行以查找请求。但是持续运行的部分在这里由API网关处理。Zappa本质上在API网关上创建一个单一的ANY请求,该请求被传递给lambda处理程序,该处理程序解释该请求并使用它调用flask函数

  • 如果您正在构建API网关+Lambda,则不需要使用Flask。简单地创建一个由API网关传递给lambda处理程序的参数调用的函数会容易得多。可以在S3上托管的前端应用程序(如果是静态的或角度的)


  • 我想说,这里的最佳实践是不使用Flask,而是使用API网关+Lambda选项。这使您可以对API进行自定义安全性和检查,并使应用程序更加稳定,因为每个请求都有自己的lambda。

    谢谢!我认为你对1的回答确实帮助我澄清了事情。但是对于2,我仍然对lambda函数的内部工作方式有点困惑。如果我没有使用Flask,那么在假设我的应用程序有多个页面的情况下,如何调用不同的URL以及如何配置不同的lambda函数?网关在没有实际API的情况下接收什么输入?如何接收?如果不使用Flask路由不同的页面和输入,我想我不理解这个过程。(您还提到lambda处理程序。“事件”与调用lambda函数的“调用”不同吗?)在API网关中,您可以创建多个“资源”,它们与flask中的方法类似。您还可以在资源下创建多个“方法”,以指定调用的类型(POST、GET、ANY等)。然后可以将这些“方法”中的每一个链接到lambda。您可以为不同的方法创建不同的lambda,也可以创建单个lambda,然后编写代码来处理API网关将某些参数传递给lambda时要调用的函数。创建测试lambda和API资源+方法。这样会更容易理解。哇,这真的澄清了一切。再次感谢你。我应该首先测试网关控制台上的功能,并熟悉r