【问题标题】:Flask web application deployment via AWS Lambda通过 AWS Lambda 部署 Flask Web 应用程序
【发布时间】:2020-10-22 14:50:57
【问题描述】:

我对 AWS Lambda 非常陌生,并且根据我在网上找到的许多示例(+阅读无休止的文档)来努力理解它的功能。我了解使用此类服务​​的主要目标是通过允许 Lambda 和 API Gateway 承担管理您的服务器的角色来实现一个成本低且可能省力的无服务器架构(因此无服务器并不意味着您不使用一个服务器,但架构会为你处理事情)。我将我的研究组织为开发人员在将 Flask Web 应用程序部署到 Lambda 时采用的两种通用方法:

  1. 使用 zappa 将整个应用程序部署到 Lambda,zappa 配置(json 文件)将是 API Gateway 身份验证。

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

(还有3个,它不使用API​​ Gateway,而是调用应用程序本身的Lambda函数——但我真的很想亲身体验一下使用API​​ Gateway)

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

对于 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 上,我将在其中放置我的前端 html 文件并托管一个网站)?另外,回到 1(抱歉,我试图以一种连贯的方式组织我的想法,但它运行得不太好),只要我保持 API Gateway 端点打开,应用程序会持续运行吗?

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

【问题讨论】:

    标签: flask aws-lambda aws-api-gateway serverless


    【解决方案1】:
    1. Zappa 有自己的代码来处理请求并使它们与“Flask”格式兼容。请记住,在使用 Lambda 的任何一种情况下,您都没有真正按照预期使用 Flask。只有在调用时才会调用 Lambda,flask 通常会继续运行以查找请求。但是持续运行的部分由这里的 API Gateway 处理。 Zappa 实质上在 API 网关上创建了一个 ANY 请求,该请求被传递给您的 lambda 处理程序,后者对其进行解释并使用它来调用您的烧瓶函数。

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

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

    【讨论】:

    • 谢谢!我认为您对 1 的回答确实帮助我澄清了一些事情。但是对于 2,我仍然对 lambda 函数的内部工作原理感到有些困惑。如果我不使用 Flask,如何调用不同的 url 以及如何配置不同的 lambda 函数——假设我的应用程序有多个页面?网关在没有实际 API 的情况下接收什么输入以及如何输入?如果不使用 Flask 来路由不同的页面和输入,我认为我无法理解这个过程。 (您还提到了 lambda 处理程序。“事件”与调用 lambda 函数的“调用”不同吗?)
    • 在 API 网关中,您可以创建多个“资源”,就像您在烧瓶中的方法一样。您还可以在资源下创建多个“方法”来指定调用的类型(POST、GET、ANY 等)。然后,您可以将这些“方法”中的每一个链接到一个 lambda。您可以为不同的方法创建不同的 lambda,也可以创建单个 lambda,然后编写代码来处理 API 网关将某些参数传递给 lambda 时要调用的函数。
    • 创建一个测试 lambda 和 API 资源+方法。这样会更容易理解。
    • 哇,这真的澄清了一切。再次感谢你。我应该首先测试网关控制台上的功能并熟悉它提供的资源。最后一个问题:除非我尝试在本地测试我的应用程序,否则假设使用 Flask+API Gateway+Lambda 效率低下是否正确?如果我尝试使用这种方法将我的实际应用程序部署到云中,我将不得不依赖其他云服务,这又是低效的——可能成本不高?
    • 在成本方面完全不会损害您的利益。它的构建和更新会更简单,但会为您提供更少的自定义和更少的同时调用,因为它迫使您只使用一个 lambda。但如果这不是问题,您可以继续使用 zappa 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2015-09-30
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2019-07-02
    相关资源
    最近更新 更多