Lambda函数与Api网关(反向代理)使用Serverless与Express



我对lambda函数如何与API网关一起工作感到困惑。有很多框架可以使用,我经常听到的是serverlessserverless-express。是无服务器像Express,但Lambda函数与API网关?

例如,如果我想在lambda中定义多个路由,就像在Express应用中那样,该怎么办?

有人能告诉我在node.js中为api网关调用创建路由的最佳方法是什么吗?也许这是最好使用某个框架完成的,或者它像lambda一样简单?

让我试着澄清你的困惑,我可以理解它😉但是,注意有多个工具/项目称为serverless-express或类似的,它们有不同的含义(见我的回答结束)。我假设下面你想在Lambda函数中使用Express。

解释不同的术语/工具

Serverless是一个工具/框架,用于简化AWS Lambda等服务的基础设施部署过程(但也支持其他功能即服务提供商或工具)。这意味着无服务器框架可以帮助您将函数编写为基础设施即代码,因此,您可以轻松地将Lambda函数与其他服务(如API Gateway, SQS, SNS等)连接起来。

API网关是定义端点或路由并将HTTP请求转发到另一个目的地的服务。这可以是Lambda函数,也可以是完全不同的HTTP端点。

Express的主要目的是管理路由和一些中间件,因此您可以为特定端点实现业务逻辑。Express启动HTTP服务器,然后将请求转发给您的业务逻辑。

了解差异

你可以说在某种程度上,一般来说,Express应用程序就像API网关和AWS Lambda的组合,因为它知道如何路由请求(= API网关正在做什么)到你的业务逻辑(= AWS Lambda函数正在做什么)。唯一的区别是,一个典型的Express应用运行在自己的服务器上,而API Gateway和AWS Lambda是分开的服务,需要连接在一起。这就是你可以用基础设施作为代码来做的事情。(你也可以手动完成,但不建议用于较大的项目)然后,你只需要"需要在Lambda函数中实现业务逻辑。

Express应用程序如何在AWS Lambda上运行

然而,在AWS Lambda上运行Express应用程序是可能的,因为你可以在AWS Lambda上运行几乎任何类型的Node.js程序。在这种情况下,你仍然需要结合API网关和AWS Lambda来接收HTTP事件在Lambda函数中。这是必要的,因为AWS Lambda本身无法接收任何HTTP请求,它只能接收'事件的任何结构。API网关不是直接在Lambda中接收HTTP请求,而是转发所有HTTP请求到Lambda函数(=您可以配置为转发所有请求,独立于url路径或HTTP方法),并将它们转换为HTTP事件可以用Lambda函数来处理。然后,Lambda函数中的Express应用程序使用此HTTP事件,以便它知道在代码中路由请求/事件的位置。最终,这意味着您只需使用AWS Lambda作为运行Express应用程序的一种方式,而不是使用单独的服务器。

实现工具

如开头所述,有几个项目或工具自称为serverless-express或类似的。例如,https://github.com/vendia/serverless-express包含一些粘合代码,用于连接HTTP事件在Lambda函数中使用Express应用程序代码。但是这个项目没有使用无服务器框架。相反,它使用的是无服务器应用程序模型(SAM),这是AWS直接提供的CLI工具。然而,也有Serverless Express试图实现同样的事情,但使用Serverless框架的方式略有不同。

您应该重新考虑在AWS Lambda上运行Express的方法的原因

虽然在AWS Lambda上运行Express应用程序听起来是个不错的主意,但我绝对不推荐它。您可能已经从我上面的解释中认识到,您复制了大多数路由内容。如果你想知道更多你不应该这样做的理由,我可以推荐你阅读这篇博客文章,里面有更多的细节。

最新更新