背景
我有一个API网关端点,代理到一个Lambda函数(Lambda A),用于为我的React应用程序获取客户数据。
这个lambda函数发出API调用以获取客户数据,但响应格式有很多不足之处。因此,我想重新格式化它。
我没有将此重新格式化的逻辑放入Lambda A中,而是编写了另一个Lambda函数(Lambda B)。当我的API网关端点被触发时,我需要同时调用这两个函数,并且第一个函数的输出是第二个函数的输入。
首先想到的: 步骤函数
步骤函数似乎是一个自然的选择,但是在阶段之间传输的数据有效载荷的大小有32kb的限制。我们的客户数据json blob通常超过了这个限制。
我听说的唯一的“最佳实践”是将有效负载写入S3,并只将对象键传递给下一个阶段。
这没什么问题,但我不太喜欢必须要写和删除那么多短暂存在的S3对象。每天可能会有几十万或数百万个这样的请求。 所以我放弃了步骤函数的方法(目前)。
当前方案
我目前正在使用JavaScript SDK直接从Lambda A调用Lambda B。这有相当大的缺点,特别是我有时同时运行两个lambda而没有性能好处。换句话说,我为了等待Lambda B的响应(我也在支付)而支付Lambda A的费用。
感觉像一种反模式,并且我听说过它被描述为这样的。
问题
这似乎是一个相对常见的情况 - 发出API调用(函数A),然后执行一些额外的逻辑以补充,重新格式化或以其他方式修改该响应(函数B),然后将其传回给调用者。
我肯定不是第一个想要使用两个Lambda函数来做这样事情的人。
如果不能使用步骤函数,我如何使用两个Lambda函数来完成这个任务?
除了使用S3之外,有没有其他方法来解决步骤函数32kb有效负载大小限制的问题?
如果我愚蠢地想要避免S3 /步骤函数方法,那么说明为什么我担心是无关紧要的答案也会受到欢迎。
编辑
为什么你甚至考虑将获取数据和处理数据的功能拆分为两个不同的AWS Lambda函数?
想象一下,除了Lambda A之外,我还有另外两打需要使用Lambda B功能的lambda。
因此,我将Lambda B的功能打包起来,并将其发布到Nexus中,我的其他两打Lambda都在构建时使用它。所有的Lambda都会因此变得更加臃肿,而且随着我积累越来越多的“Lambda B”,我不得不发布更多的npm包。这正是我想要避免的。
我希望我的“Lambda A”能够消费其他lambda,而不是npm包,以实现广泛共享的功能。也许我过于字面地理解了“lambda function”中的“函数”,或者我只是试图充分利用FaaS的潜力。