【问题标题】:Lambda function with Api gateway (reverse proxy) using Serverless with Express使用无服务器和 Express 的 Lambda 函数和 Api 网关(反向代理)
【发布时间】:2021-04-25 09:10:54
【问题描述】:

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

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

有人可以解释一下在 node.js 中为 API 网关调用创建路由的最佳方法是什么,也许这最好用某个框架来完成,还是像 lambda 中那样简单?

【问题讨论】:

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


    【解决方案1】:

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

    解释不同的术语/工具

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

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

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

    了解差异

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

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

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

    实现它的工具

    如开头所述,有几个项目或工具自称为serverless-express 或类似名称。例如,https://github.com/vendia/serverless-express 包含一些胶水代码,用于将您的 Lambda 函数中的 HTTP 事件 与 Express 应用程序代码连接起来。但是这个项目没有使用 Serverless 框架。相反,它使用的是 Serverless Application Model (SAM),这是 AWS 直接提供的 CLI 工具。但是,也有 Serverless Express 尝试使用无服务器框架以稍微不同的方式实现相同的目标。

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

    虽然在 AWS Lambda 上运行 Express 应用程序听起来不错,但我绝对不推荐它。正如我在上面的解释中可能已经认识到的那样,您复制了大部分路由内容。如果您想了解更多不应该这样做的原因,我可以推荐阅读this blog post,其中包含更多详细信息。

    【讨论】:

    • @Arturo 不客气!无服务器框架不会包含在 AWS Lambda 函数中。它只是帮助您将 Lambda 函数部署到 AWS。 Lambda 函数就是任何类型的 Node.js 文件,它导出处理函数并实现 (event, context, callback) 函数(或以更现代的方式实现 async (event, context) => {})。您不需要在 Lambda 中捆绑 Serverless 框架(而且您不应该这样做)。
    • bundle 我的意思是您不需要将无服务器框架作为依赖项包含在您上传到 AWS Lambda 的 Lambda 函数工件中。您可以将 Lambda 函数代码与 node_modules 文件夹一起压缩,然后将所有内容上传到 AWS Lambda(在 AWS 控制台中手动或使用某些脚本)。但是node_modules 文件夹不需要包含 Serverless 依赖项。 (至少我认为这也是让你困惑的地方)
    • 但是,请注意无服务器框架正在为您做这件事:捆绑您的代码并将其上传到 AWS Lambda - 您不必手动执行此操作。
    • 如果您想使用现有的 HTTP API 或 DynamoDB 表,您可以使用它们的 ARN 在无服务器模板文件中引用它们。 (我看不出您想要这样做的充分理由 - 而是确保您在模板中创建所有资源,例如 HTTP API 或表,然后部署整个模板)
    • 是的,我同意,有很多不同的工具和服务,需要一段时间才能理解所有内容;)是的,建议使用基础架构即代码在模板中编写所有内容。但是,您可能肯定有原因要使用例如引用其他资源。他们的 ARN 并且不要将它们包含在您的模板中。但是对于您当前的用例,我不明白为什么有必要;)因此,如果我的回答对您有所帮助,请随时接受:)
    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2016-08-01
    • 2020-06-04
    • 2018-10-24
    • 2023-03-16
    • 2019-05-16
    相关资源
    最近更新 更多