将Node.js API与AWS Lambda混合使用

时间:2017-09-14 07:11:44

标签: javascript node.js aws-lambda serverless-framework serverless-architecture

我和我的经理讨论过AWS Lambda的使用问题。我想从你们其中一个人那里得到一些帮助。

我对生产级项目使用无服务器架构有点犹豫不决。首先,测试我在本地设置中构建的内容有点耗时。即使我们可以通过单元测试来测试代码,我们也无法消除模拟请求和响应对象的可能性。我在本地设置中无法调用lambda这一事实让我在开发过程中测试Lambda编写的API时感到非常无聊。其次,就目前为止我所知,AWS Lambda没有承诺的SLA可用性和可靠性。这让我有点犹豫,采用Lambda来构建RESTful API。

所以现在我所做的只是使用Lambda来捕获从AWS触发的事件。例如,在用户将其个人资料图片上传到S3存储桶之后执行某些操作,或者在用户通过Cognito注册后执行某些操作。

然而,我的经理期望将我的Node.js API与AWS Lambda混合用于单个项目。从我的角度来看,它完全没有意义。一旦我们在EC2实例上设置了Node API,我认为考虑设置自动扩展或如何利用当前EC2上运行的所有资源会更有效率。但我的经理坚持要我完全设置Node API和Lambda API。例如,服务A和B将由节点API以及AWS Lambdas提供的服务C,D和E提供。

我之前尝试过,但它给我带来了很多困惑。我觉得在构建API时选择Node API或AWS Lambda API会更好,而不是将它们混合在一起。

我不想说我的经理是完全错误的,我是对的。在这种情况下,我想要一个明确的答案。对于这种情况,我真的很感激任何评论和答案。

3 个答案:

答案 0 :(得分:2)

好的,让我们一一去。首先是第一件事。您的第一个问题是在本地测试Lambda,完全可以使用SAM。

请查看 - http://docs.aws.amazon.com/lambda/latest/dg/test-sam-local.html

最重要的设计决策,如果您的应用程序是单片的,并且您不想将其重新设计为微服务,那么坚持使用EC2。

接下来介绍您的混合API设计(Lambda和EC2)。我不认为这是一种反模式或坏主意。它完全基于您的要求。假设您在EC2中有一套现有的API(可能是单片),并且您希望将其慢慢迁移到无服务器和微服务。您不需要将它们全部迁移到无服务器。你可以逐个开始。请记住,通过Http进行通信,如果您的服务在EC2和Lambda之间进行了分配,这并不重要。在微服务领域,服务在同一台服务器上或在许多服务器上进行分配并不重要。

通信速度在过去几年中发生了巨大变化,这是微服务出现的主要原因之一。

因此,在坚果壳中,拥有混合API并不完全是基于您的设计架构。如果是单片的,那么就不要去Lambda了。

答案 1 :(得分:2)

只是对以前的答案添加一些想法:

  

首先,测试我在本地设置中构建的内容有点耗时。即使我们可以通过单元测试来测试代码,我们也无法消除模拟请求和响应对象的可能性。我在本地设置中无法调用lambda这一事实让我在开发过程中测试Lambda编写的API时感到非常无聊

您肯定可以在本地环境中构建,测试和模拟Lambda Invoke,它只是一个新的范例,并且some tools可以帮助您。

  

其次,就目前为止我所知,AWS Lambda没有承诺的SLA可用性和可靠性。这让我有点犹豫,采用Lambda来构建RESTful API。

AWS Lambda在AWS"计算层"上运行基础设施,所以我相信如果他们在计算层面临问题,那么你的EC2实例肯定也会面临中断。

  

一旦我们在EC2实例上设置了Node API,我认为考虑设置自动扩展或如何利用当前EC2上运行的所有资源会更有效率

我不这么认为。无服务器堆栈可以轻松扩展,您无需管理基础架构。

  

我之前尝试过,但它给我带来了很多困惑。我觉得在构建API时选择Node API或AWS Lambda API会更好,而不是将它们混合在一起。

欢迎使用微型和分离式服务!开发服务很容易,但管理整个基础设施很困难。

与管理人员讨论架构时要记住的另一件事:成本

很难争辩,当他们看到以低成本经营业务的可能性时,每个经理的眼睛都会闪耀。使用无服务器堆栈运行服务非常便宜。

底线:

不,按照经理的意愿混合资源并不是一个坏主意。

是的,更容易获得编写api的框架,设置EC2实例和自动缩放组。

是的,在解耦服务时会有很大的提升,但是在生产中运行会付出代价。

答案 2 :(得分:1)

有些情况下,您确实需要同时运行Lambda和EC2实例(例如,Monolith到Microservices迁移项目,NodeJS和Express作为WebServer),这可能是有意义的。

有多种方法可以实现这一目标。使用两种常用方法(用于请求 - 响应)。

  1. 如果您计划仅提供Lambda和&amp ;;的RESTful API。 NodeJS EC2实例可以使用API​​网关作为它们的代理。
  2. 如果NodeJS EC2实例用作WebServer以同时提供动态页面和等等,然后您可以使用AWS CloudFront作为代理&仍然需要API网关与Lambda连接。
  3. enter image description here

    注意:对于异步工作流,您可以根据工作流的性质将Lambda与其他AWS服务(如AWS Step Functions,SQS,SNS)一起使用。