将 Node.js API 与 AWS Lambda 混合使用
Mixing Node.js API with AWS Lambda
我与我的经理就 AWS Lambda 的使用进行了永无休止的讨论。我想得到你们其中一位的帮助。
我对将无服务器架构用于生产级项目有点犹豫。首先,测试我在本地设置中构建的内容有点耗时。即使我们可以通过单元测试来测试代码,我们也不能消除模拟请求和响应对象失败的可能性。事实上,我无法在本地设置中调用 lambda,这让我在开发过程中测试我的 Lambda 编写的 API 时感到非常无聊。其次,据我所知,AWS Lambda 的可用性和可靠性没有承诺的 SLA。这让我有点犹豫采用 Lambda 来构建 RESTful API.
所以现在我要做的是仅在捕获从 AWS 触发的事件时使用 Lambda。例如,在用户将个人资料图片上传到 S3 存储桶后执行某些操作,或者在用户通过 Cognito 注册后执行某些操作。
但是,我的经理希望将我的 Node.js API 与 AWS Lambda 混合用于单个项目。从我的角度来看,这完全没有意义。一旦我们在 EC2 实例上设置了节点 API,我认为考虑设置自动缩放或如何利用当前 EC2 上的所有资源 运行 会更有效率。但是我的经理坚持要我同时设置 Node API 和 Lambda API。例如,服务 A 和 B 将由节点 API 提供服务,而服务 C、D 和 E 将由 AWS Lambdas 提供。
我之前试过,但是给我造成了很大的困惑。我觉得在构建 API 时选择 Node API 或 AWS Lambda API 比将它们混合在一起会更好。
我不想说我的经理是完全错误的,我是对的。在这种情况下,我只想得到一个明确的答案。非常感谢对这种情况的任何评论和回答。
在某些情况下,您确实需要 运行 Lambda 和 EC2 实例(例如 Monolith 到微服务的迁移项目,NodeJS 和 Express 作为 WebServer)。
有多种方法可以实现这一点。两种常见的方法(对于请求-响应)是使用。
- 如果您计划仅从 Lambda 和 NodeJS EC2 实例提供 RESTful APIs,您可以使用 API 网关作为它们的代理。
- 如果将 NodeJS EC2 实例用作 WebServer 来为动态页面等提供服务,那么您可以使用 AWS CloudFront 作为代理,但您仍然需要 API 网关来连接 Lambda。
注意:对于异步工作流,您可以根据工作流的性质将 Lambda 与其他 AWS 服务(例如 AWS Step Functions、SQS、SNS)一起使用。
好的,让我们一一来吧。首先是第一件事。您的第一个问题是在您的本地测试 Lambda,并且完全可以使用 SAM。
请看- http://docs.aws.amazon.com/lambda/latest/dg/test-sam-local.html
最重要的设计决策,如果您的应用程序是整体式的并且您不想将其重新设计为微服务,那么请坚持使用 EC2。
接下来是关于您的混合设计 API(Lambda 和 EC2)。我不认为这是一个反模式或坏主意。它完全基于您的要求。假设您在 EC2 中有一组现有的 API(可能是整体的)并且您希望将其慢慢迁移到无服务器和微服务。您不需要将它们全部迁移到无服务器。你可以一个一个开始。请记住,通信是通过 Http 进行的,并且您的服务是否在 EC2 和 Lambda 之间分配并不重要。在微服务世界中,服务是在同一台服务器上还是分布在许多服务器上都没有关系。
通信速度在过去几年发生了翻天覆地的变化,这也是微服务出现的主要原因之一。
所以简而言之 shell 混合 API 是个不错的主意,但完全基于您的设计架构。如果是整体式的,那么不要选择 Lambda。
只是对之前的答案补充一些想法:
First of all, its a bit time-consuming to test what I am building in the local setup. Even if we can test the code through the unit testing, we cannot remove the possiblity of faliure of mocked request and response objects. The fact that I cannot invoke the lambda in my local setup makes me very bored when I am testing my Lambda-written API during the development process
确保您可以在本地环境中构建、测试和模拟 Lambda 调用,这只是一个新范例,some tools 可以帮助您。
Secondly, as far as I know so far, there is no promised SLA for AWS Lambda for its availability and reliability. This just make me kind of hesitate adopting Lambda to build RESTful API.
AWS Lambda 在 AWS "compute layer" 基础设施上运行,所以我相信如果他们在计算层遇到问题,您的 EC2 实例肯定也会面临中断。
Once we have set up Node API on EC2 instances, I think it will be more productive to think about setting up auto-scaling or how to utilize all the resources running on the current EC2s
我不这么认为。无服务器堆栈可轻松扩展,您无需管理基础架构。
I tried it before, but it caused a lot of confusion to me. I feel like it will be better to choose either Node API or AWS Lambda API when building an API instead of mixing them together.
欢迎使用微服务和解耦服务!开发服务很容易,但管理整个基础架构很难。
与管理人员谈论架构时要记住的另一件事:成本
很难争辩,当每个经理看到 运行 以低成本开展业务的可能性时,他们的眼睛都会放光。让您的服务 运行 成为无服务器堆栈真的很便宜。
底线:
不,按照经理的意愿混合资源并不是一个坏主意。
是的,只需要一个框架来编写api、设置一个 EC2 实例和一个自动扩展组就更容易了。
是的,解耦服务会带来很大的提升,但在 运行 投入生产时会付出代价。
我与我的经理就 AWS Lambda 的使用进行了永无休止的讨论。我想得到你们其中一位的帮助。
我对将无服务器架构用于生产级项目有点犹豫。首先,测试我在本地设置中构建的内容有点耗时。即使我们可以通过单元测试来测试代码,我们也不能消除模拟请求和响应对象失败的可能性。事实上,我无法在本地设置中调用 lambda,这让我在开发过程中测试我的 Lambda 编写的 API 时感到非常无聊。其次,据我所知,AWS Lambda 的可用性和可靠性没有承诺的 SLA。这让我有点犹豫采用 Lambda 来构建 RESTful API.
所以现在我要做的是仅在捕获从 AWS 触发的事件时使用 Lambda。例如,在用户将个人资料图片上传到 S3 存储桶后执行某些操作,或者在用户通过 Cognito 注册后执行某些操作。
但是,我的经理希望将我的 Node.js API 与 AWS Lambda 混合用于单个项目。从我的角度来看,这完全没有意义。一旦我们在 EC2 实例上设置了节点 API,我认为考虑设置自动缩放或如何利用当前 EC2 上的所有资源 运行 会更有效率。但是我的经理坚持要我同时设置 Node API 和 Lambda API。例如,服务 A 和 B 将由节点 API 提供服务,而服务 C、D 和 E 将由 AWS Lambdas 提供。
我之前试过,但是给我造成了很大的困惑。我觉得在构建 API 时选择 Node API 或 AWS Lambda API 比将它们混合在一起会更好。
我不想说我的经理是完全错误的,我是对的。在这种情况下,我只想得到一个明确的答案。非常感谢对这种情况的任何评论和回答。
在某些情况下,您确实需要 运行 Lambda 和 EC2 实例(例如 Monolith 到微服务的迁移项目,NodeJS 和 Express 作为 WebServer)。
有多种方法可以实现这一点。两种常见的方法(对于请求-响应)是使用。
- 如果您计划仅从 Lambda 和 NodeJS EC2 实例提供 RESTful APIs,您可以使用 API 网关作为它们的代理。
- 如果将 NodeJS EC2 实例用作 WebServer 来为动态页面等提供服务,那么您可以使用 AWS CloudFront 作为代理,但您仍然需要 API 网关来连接 Lambda。
注意:对于异步工作流,您可以根据工作流的性质将 Lambda 与其他 AWS 服务(例如 AWS Step Functions、SQS、SNS)一起使用。
好的,让我们一一来吧。首先是第一件事。您的第一个问题是在您的本地测试 Lambda,并且完全可以使用 SAM。
请看- http://docs.aws.amazon.com/lambda/latest/dg/test-sam-local.html
最重要的设计决策,如果您的应用程序是整体式的并且您不想将其重新设计为微服务,那么请坚持使用 EC2。
接下来是关于您的混合设计 API(Lambda 和 EC2)。我不认为这是一个反模式或坏主意。它完全基于您的要求。假设您在 EC2 中有一组现有的 API(可能是整体的)并且您希望将其慢慢迁移到无服务器和微服务。您不需要将它们全部迁移到无服务器。你可以一个一个开始。请记住,通信是通过 Http 进行的,并且您的服务是否在 EC2 和 Lambda 之间分配并不重要。在微服务世界中,服务是在同一台服务器上还是分布在许多服务器上都没有关系。
通信速度在过去几年发生了翻天覆地的变化,这也是微服务出现的主要原因之一。
所以简而言之 shell 混合 API 是个不错的主意,但完全基于您的设计架构。如果是整体式的,那么不要选择 Lambda。
只是对之前的答案补充一些想法:
First of all, its a bit time-consuming to test what I am building in the local setup. Even if we can test the code through the unit testing, we cannot remove the possiblity of faliure of mocked request and response objects. The fact that I cannot invoke the lambda in my local setup makes me very bored when I am testing my Lambda-written API during the development process
确保您可以在本地环境中构建、测试和模拟 Lambda 调用,这只是一个新范例,some tools 可以帮助您。
Secondly, as far as I know so far, there is no promised SLA for AWS Lambda for its availability and reliability. This just make me kind of hesitate adopting Lambda to build RESTful API.
AWS Lambda 在 AWS "compute layer" 基础设施上运行,所以我相信如果他们在计算层遇到问题,您的 EC2 实例肯定也会面临中断。
Once we have set up Node API on EC2 instances, I think it will be more productive to think about setting up auto-scaling or how to utilize all the resources running on the current EC2s
我不这么认为。无服务器堆栈可轻松扩展,您无需管理基础架构。
I tried it before, but it caused a lot of confusion to me. I feel like it will be better to choose either Node API or AWS Lambda API when building an API instead of mixing them together.
欢迎使用微服务和解耦服务!开发服务很容易,但管理整个基础架构很难。
与管理人员谈论架构时要记住的另一件事:成本
很难争辩,当每个经理看到 运行 以低成本开展业务的可能性时,他们的眼睛都会放光。让您的服务 运行 成为无服务器堆栈真的很便宜。
底线:
不,按照经理的意愿混合资源并不是一个坏主意。
是的,只需要一个框架来编写api、设置一个 EC2 实例和一个自动扩展组就更容易了。
是的,解耦服务会带来很大的提升,但在 运行 投入生产时会付出代价。