Amazon web services 通过API网关调用AWS步骤函数并等待执行结果

Amazon web services 通过API网关调用AWS步骤函数并等待执行结果,amazon-web-services,aws-lambda,aws-step-functions,Amazon Web Services,Aws Lambda,Aws Step Functions,是否可以通过API网关端点调用AWS步骤函数并侦听响应(直到工作流完成并从结束步骤返回结果) 目前,我能够从文档中发现step函数本质上是异步的,并且在最后有一个回调。我需要API调用响应在不轮询的情况下从步骤函数流获取最终结果。我想这是不可能的 它是异步的,还有 您不需要通过轮询获得结果,您可以结合Lambda、Step函数、SNS和Websockets来实时获得结果 如果您想将通知推送到客户端(web浏览器),但又不想管理自己的基础设施(缩放套接字服务器等),则可以使用AWS IOT。本教程

是否可以通过API网关端点调用AWS步骤函数并侦听响应(直到工作流完成并从结束步骤返回结果)


目前,我能够从文档中发现step函数本质上是异步的,并且在最后有一个回调。我需要API调用响应在不轮询的情况下从步骤函数流获取最终结果。

我想这是不可能的

它是异步的,还有

您不需要通过轮询获得结果,您可以结合Lambda、Step函数、SNS和Websockets来实时获得结果

如果您想将通知推送到客户端(web浏览器),但又不想管理自己的基础设施(缩放套接字服务器等),则可以使用AWS IOT。本教程可能会帮助您开始:


如果您只需要将结果发送到后端(例如web服务端点),SNS应该可以。这可能会起作用:创建一个HTTP“网关”服务器,将请求发送到您的Steps工作流,然后保留请求对象,直到它接收到允许其发送响应的通知

网关服务器将需要向有效负载添加相关ID,步骤工作流将需要执行该操作

接收通知的一种可行方式是使用SQS

有些psuedocode模糊不清地带有Node/Express的味道:

const cache=new cache();//选择您最喜欢的缓存库
const gatewayId=guid();//这让我们可以水平伸缩
const subscription=subscriptbetoqueue({
筛选器:{gatewayId},
主题:主题名称,
});
httpServer.post((请求、回复)=>{
const correlationId=guid();
add(correlationId,res);
submitToStepWorkflow(网关ID、关联ID、请求);
});
subscription.onNewMessage(消息=>{
const req=cache.pop(message.attributes.correlationId);
请求发送(提取响应(消息));
请求结束();
});
(此处假设的队列读取API与aws sdk的SQS API完全不同,但您可以理解)

因此,在步骤工作流结束时,您只需向SQS发布一条消息(可能通过SNS),以确保
correlationId
gatewayId
得到保留

要处理失败并避免缓存被孤立的请求对象填充,您可能需要在缓存上设置过期时间并处理过期事件:

cache.onExpiry((键,请求)=>{
请求状态(502);
请求发送(gatewayTimeoutMessage());
请求结束();
}

整个方法仅适用于您希望在浏览器和代理超时时间内正常完成的工作流。

谢谢@Tom,我还考虑过将AWS IOT用于WebSocket以实现与此相同的解决方法。您有任何示例代码吗?@Ashan可以肯定,使用AWS IOT您可以实现这一点。我想ss这个例子将帮助你开始:。如果你只需要将结果发送到后端,SNS应该足够了。谢谢@Tom。如果你能用IOT信息更新答案会更好