使用 Deno 子托管与 AWS Lambda 运行不受信任的用户代码
Deno 子托管 是在 Web 上运行用户不受信任代码的最便捷方式。由于它是基于 Deno Deploy v8 多租户隔离云构建的,因此它针对部署和运行 JavaScript 进行了优化,可实现最小的开销和最大的安全性。
虽然许多用户喜欢通过 Deno 子托管 REST API 以编程方式部署 JavaScript 的简便性,但其他人也询问为什么他们不能使用 AWS Lambda 构建相同的东西。简短的答案是:您绝对可以!由于 AWS Lambda 是一个更小的“构建块”,因此如果您有 Deno 子托管无法处理的特定需求,并且有时间实现许多关键功能(例如代码和部署管理、安全性和最大租户隔离以及部署的自动扩展),它将是一个不错的选择。
在本博文中,我们将介绍使用 Deno 子托管或 AWS Lambda 构建部署平台时的关键区别,例如功能、性能和计费模式。
比较 Deno 子托管与 AWS Lambda
在构建用户可以在 Web 上部署和运行其代码的平台时,有两个关键方面需要做好
- 安全:如果一个用户的代码可以访问另一个用户的代码,那么没有人会足够信任该平台以继续使用它
- 性能:部署和运行代码应该在几秒内完成,而不是几分钟,否则您可能会因为糟糕的体验而面临用户流失的风险
虽然这两点至关重要,但我们还列出了其他我们认为与评估集成部署平台的解决方案相关的重要方面
Deno 子托管 | AWS Lambda | |
---|---|---|
支持的语言 | JavaScript/TypeScript | JavaScript、Java、Go、PowerShell、Node.js、C#、Python、Ruby |
性能:冷启动 | 毫秒 | 秒 |
性能:部署时间 | 秒 | 分钟 |
部署和代码管理 | 是 | 否 - 您必须自行构建 |
安全性和租户隔离 | 是 | 否 - 您必须自行构建 |
全球 | 是 | 区域 |
虽然 AWS Lambda 支持比 Deno 子托管更多的语言,但我们选择仅支持 JavaScript 和 TypeScript 使我们能够 优化整个体验,以实现最大限度的部署和冷启动性能。但是,如果您的开发人员强烈偏好使用非 JavaScript 或 TypeScript 的语言,那么使用 AWS Lambda 构建我们的解决方案是有意义的。
由于 AWS Lambda 是一个无服务器函数,因此它比 Deno 子托管灵活得多,但这也意味着您需要重新实现关键的基础设施部分,例如
编排和管理部署
将代码以编程方式放入 lambda 并部署它只是构建部署平台的一小部分。使用 AWS Lambda 构建此功能需要确定通过 HTTP 传输代码的最佳方式、对代码进行压缩和解压缩以加载到 lambda 中、如何存储和检索代码等等。使用 Deno 子托管,这些步骤不仅得到了解决和实现,而且还针对速度进行了优化,以确保无缝的用户体验。
此外,在使用 AWS Lambda 构建时,您需要创建进程来检测何时结束用户代码失败或挂起并终止它们,以此来防止资源累积账单。使用 Deno 子托管,这些边缘情况已经得到解决,因此您只需要专注于提供良好的用户体验。
安全性和租户隔离
任何可以在云中运行不受信任代码的平台都必须将安全视为重中之重。我们如何防止有人运行尝试访问其他用户代码甚至您内部系统的恶意代码?
使用 AWS Lambda 从头开始构建此功能需要实现进程来隔离 lambda 以防止它们相互访问以及基础 AWS 帐户中的任何其他系统。另一方面,Deno 子托管 从一开始就旨在尽可能安全,具有最大的租户隔离和检测资源滥用的进程。
这些组件对于构建运行第三方不受信任用户代码的部署平台至关重要,如果使用 AWS Lambda 构建,则需要从头开始实现。但是,如果您正在寻找无需大量开发和持续维护的解决方案,那么 Deno 子托管更简单,因为它旨在安全地运行不受信任的代码,并支持基本功能。
计费模式和定价
评估任何技术时,另一个关键考虑因素是定价。虽然很难比较子托管和 AWS Lambda 之间的整体定价,因为 lambda 价格不包括与其他云服务相关的成本(例如数据存储),这些成本 包含在子托管中,但关键的区别是计费模式。
Deno 子托管(和 Deno Deploy)使用基于计算的计费模式,而 AWS Lambda 使用实时(或“挂钟时间”)计费模式。这意味着在 Deno 子托管中,您在服务器进行计算时付费,而不是在它等待外部系统的响应时付费。将其与 AWS Lambda 相比较,在 AWS Lambda 中,从 lambda 接收请求到处理该请求,您都会付费,即使它将大部分时间都花在等待来自第三方的 HTTP 响应上。
在上面的流程中,“实时”(也称为“挂钟时间”)计费从应用程序接收 POST 请求开始,到应用程序响应客户端结束。相比之下,“CPU 时间”仅在函数实际处理时经过,由蓝色线条表示。从这个意义上说,CPU 时间按执行的工作量收费,并且更“无服务器”,因为您不会为空闲时间付费。
哪种解决方案适合您?
如果您想要一个更开箱即用的解决方案,该解决方案使用更简单的设置来处理 JavaScript 和 TypeScript,我们建议您查看 Deno 子托管。它针对运行不受信任的代码进行了优化,因此它设计了租户隔离、部署的扩展和缩减、路由流量以及生成子域,因此您不必自己实现这些基本功能。此外,通过仅支持 JavaScript,它针对性能进行了优化,可以实现更快的部署和更快的冷启动时间。
但是,如果您有时间来实现基本功能,并且想要构建一个更自定义的部署平台来满足您的产品的特定需求,或者想要支持 Go、Python 和 Java 等语言,那么 AWS Lambda 是一个不错的选择。
您是否还有其他关于 Deno 子托管如何为您的产品解锁增长的疑问?