编排AWS lambda函数

时间:2017-12-20 19:30:37

标签: javascript amazon-web-services aws-lambda aws-api-gateway aws-step-functions

背景

我有一个API网关端点,它代理一个Lambda函数(Lambda A),用于我的React应用程序来获取客户数据。

这个lambda函数进行API调用以获取客户数据,但响应的格式还有很多不足之处。所以我想重新格式化。

我没有把这个重新格式化的逻辑填充到Lambda A中,而是编写了一个单独的Lambda函数(Lambda B)。当我的API网关端点被命中时,我需要调用这两个函数,第一个的输出是第二个的输入。

首先想到的是:步骤功能

步骤函数看起来很自然,但是可以在各阶段之间传递的数据有效负载大小有32kb的限制。我们的json blob客户数据经常超出此范围。

唯一的"最佳做法"我听说这种情况是将有效负载写入S3,然后将对象密钥传递给下一阶段。

这很好,但是我不必为S3编写和删除如此多的短期对象而感到兴奋。每天可能有数十或数十万个这样的请求。所以我放弃了阶梯函数方法(现在)。

当前方法

我目前正在使用javascript SDK直接从Lambda A调用Lambda B.这有很大的不利因素;值得注意的是,我有时同时运行两个lambdas而没有性能优势。换句话说,我支付Lambda A只是坐在那里等待Lambda B(我也付钱)的回复。

这感觉就像一个反模式,我已经听说过它的特征。

问题

这似乎是一个相对常见的场景 - 进行API调用(函数A),然后执行一些额外的逻辑来补充,重新格式化或以其他方式修改该响应(函数B),然后再将其传递给调用者。

当然,我并不是第一个想要使用两个Lambda函数来做这样的事情的人。

  • 假设我不能使用步骤函数,我可以选择使用两个lambda函数吗?

  • 还有其他解决步骤功能的方法吗?除了使用S3之外还有32kb的有效载荷大小限制?

  • 如果我想避免使用S3 / Step Function方法,那么我们也欢迎解释为什么我的担忧是无根据的答案。

修改

  

为什么你甚至考虑拆分获取数据并将其处理成两个不同的AWS Lambda函数的功能?

想象一下,我不仅仅是Lambda A,还有二十几个需要消耗Lambda B功能的Lambda。

所以,我将Lambda B打包(发布),将其发布到Nexus,我的其他二十几个Lambdas都在构建时使用它。我的所有lambda都在膨胀,我必须发布更多的npm包,因为我积累了更多的" Lambda B" s。这是我想要避免的。

我希望我的" Lambda A" s使用其他lambda而不是npm包,以获得广泛共享的功能。也许我正在使用"功能"在" lambda函数"从字面上看,或者我只是想充分发挥FaaS的潜力。

2 个答案:

答案 0 :(得分:3)

根据您的问题,我可以阅读以下要求:

  • 您需要AWS Lambda函数(在API网关后面)作为客户端应用程序的API端点
  • 您的AWS Lambda函数必须从后端系统获取数据并对其进行处理以供客户端应用程序使用
  • 这样的请求是同步的,它们得到的答案越快越好(当然也越便宜)
  • 您需要运行的逻辑并不太复杂,执行时间可能只需几毫秒

为什么您甚至考虑拆分获取数据并将其处理为两个不同的AWS Lambda函数的功能?不要将“AWS Lambda函数”中的“函数”视为字面:您在AWS Lambda函数中运行的代码可能非常复杂。只需在单个AWS Lambda函数中运行所有内容,然后在逻辑上拆分代码。这是最有效和最干净的方式。

答案 1 :(得分:0)

您没有告诉您进程A和B之间的有效负载有多大。但是,如果它小于250Kb,我建议设置一个中间SQS队列,其中进程A发布结果,进程B由队列中的新消息触发。