通过API Gateway调用AWS Step函数并等待执行结果

时间:2017-08-11 17:04:11

标签: amazon-web-services aws-lambda aws-step-functions

是否可以通过API Gateway端点调用AWS Step功能并监听响应(直到工作流完成并从结束步骤返回结果)?

目前我能够从文档中找到步骤函数本质上是异步的,并且最后有一个最终的回调。我需要API调用响应从步骤函数流中获取最终结果而不进行轮询。

2 个答案:

答案 0 :(得分:6)

我想这是不可能的。

它是异步的,还有API Gateway Timeout

您不需要通过轮询获得结果,您可以结合使用Lambda,Step Functions,SNS和Websockets来实时获得结果。

如果您想将通知推送到客户端(Web浏览器)并且您不想管理自己的infra结构(扩展套接字服务器等),您可以使用AWS IOT。本教程可以帮助您入门:

http://gettechtalent.com/blog/tutorial-real-time-frontend-updates-with-react-serverless-and-websockets-on-aws-iot.html

如果您只需要将结果发送到后端(例如Web服务端点),SNS应该没问题。

答案 1 :(得分:0)

这可能会起作用:创建一个HTTP“网关”服务器,该服务器将请求分派到您的Steps工作流程,然后保留请求对象,直到它收到允许其发送响应的通知为止。

网关服务器将需要向有效负载添加一个关联ID,而步骤工作流程将需要将其传递出去。

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

Node / Express含糊的某些伪代码:

const cache = new Cache(); // pick your favourite cache library
const gatewayId = guid(); // this lets us scale horizontally
const subscription = subscribeToQueue({ 
    filter: { gatewayId },
    topic: topicName,
});

httpServer.post( (req, res) => {
   const correlationId = guid();
   cache.add(correlationId, res);
   submitToStepWorkflow(gatewayId, correlationId, req);
});

subscription.onNewMessage( message => {
   const req = cache.pop(message.attributes.correlationId);
   req.send(extractResponse(message));
   req.end();
});

(这里假设的队列读取API与aws-sdk的SQS API完全不同,但是您知道了)

因此,在步骤工作流程结束时,您只需要向SQS发布一条消息(也许通过SNS)即可,以确保保留correlationIdgatewayId

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

cache.onExpiry( (key, req) => {
   req.status(502);
   req.send(gatewayTimeoutMessage());
   req.end();
}

当然,对于您希望正常完成的工作流,这种整体方法仅适用于浏览器超时和代理超时的时间。