原生无服务器与无服务器 Express

Native Serverless vs Serverless Express

现在,我正在按照 Serverless Stack Team 准备的指南进行操作。他们正在使用 React 和许多 AWS 功能,例如 lambdaAPI getaway。为了练习它,我正在用 Serverless 堆栈重写我的一个旧 Express 示例。

我还看到了一个名为 aws-serverless-express 库或工具 。此库或工具允许您以 serverless 形式 运行 您的 express 应用。

这将是一个奇怪的问题,但我想知道 native serverless build 和 serverless express.[=19= 之间的区别]

Cold start已经有缺点了。我知道它。除此之外,serverless express的消极或积极方面是什么?
原生无服务器的消极或积极方面是什么?

serverless express的缺点:

  1. 这些额外的依赖项可能导致额外的冷启动时间
  2. 无法为每个路由(例如,一个路由访问 S3 而另一个访问 DynamoDB)提供单独的细化权限

优点:

  1. 减少样板文件
  2. 避免 CloudFormation 堆栈中的资源限制

更多信息:

https://github.com/jeremydaly/lambda-api#why-another-web-framework

https://www.jeremydaly.com/build-serverless-api-serverless-aws-lambda-lambda-api/#comment-19036

保持无服务器代码尽可能简单总是最好的,lambda 应该 运行 只是您的业务逻辑,它应该只是一个函数。

如上所述,冷启动是无服务器的主要限制因素。

运行 express on serverless 是无用的,因为它 运行 是一个节点服务器并监听一些端口,这不是必需的。 Lambda 并非始终可用,它在 运行 时间。

什么构成“原生”无服务器可能有争议,并且构成了一个范围。有很多方法可以利用托管服务来最大限度地减少 lambda 函数的使用,但是有很多用例需要自定义逻辑,例如与第三方服务集成。

我首先会问自己,您现有的应用程序是做什么的,以及您将投入多少时间来重构为尽可能“无服务器”。如果这是您纯粹用于学习目的的项目,您可能需要进行完全转换以最大化您的学习。如果这是为企业创收的应用程序,则这可能是对资源的不当使用。

也就是说,当前最佳实践 serverless 和 serverless-express 的使用之间的主要区别是:

  • 存在其他依赖项。这将需要一些额外的时间在运行时解决 [1],需要在部署时正确管理(打包),并且需要额外的努力 update/patch/audit(安全)。
  • 权限粒度 - 由于所有路由管理都委托给 express,因此您将无法在基础架构级别为每个路由精细地设置权限。
  • 您将无法在每个路由的基础上设置资源限制

另一方面:

  • 您将避免大型云形成模板
  • 利用您现有的工具和 express 知识

虽然它确实取决于应用程序 is/does,但您不太可能注意到单一用途 lambda 函数的冷启动惩罚,并且可能是过早优化的情况。无服务器思维的一部分是关注价值——所以如果是我这样做,我会尽可能少地在 lambda 中获取应用程序 运行——开始使用 X-Ray 和 CloudWatch [2] 检测路由],然后优化需要它的路由。

从学习的角度来看,如果您选择使用 serverless-express,您可能会错过更多了解服务集成、VTL 转换、request/response 映射等的机会如果您采用更细分的方法,就会接触到。您可以仅使用 API Gateway 和 DynamoDB 构建一些非常酷的东西 - 甚至无需接触 lambda 函数。

这并不是说以这种方式使用 express 是一件坏事 - AWS 自己注意到这是构建无服务器应用程序和新功能(如 [=54 的 HTTP API 功能)的有效方法=] 网关 [3] 帮助解决这个问题。事实上,AWS 发布的 [real world serverless application [4] 示例遵循单一功能原则,尽管 Java 而不是 express 应用程序。

[1] https://www.freecodecamp.org/news/just-how-expensive-is-the-full-aws-sdk-3713fed4fe70/

[2]https://theburningmonk.com/2019/11/check-list-for-going-live-with-api-gateway-and-lambda/

[3] https://aws.amazon.com/blogs/compute/announcing-http-apis-for-amazon-api-gateway/

[4]https://github.com/awslabs/realworld-serverless-application