通过API网关调用一个AWS Step函数,等待执行结果

Invoke a AWS Step functions by API Gateway and wait for the execution results

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

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

我想那是不可能的。

它是异步的,还有 API Gateway Timeout

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

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

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

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

这可能会起作用:创建一个 HTTP "gateway" 服务器,将请求分派到您的步骤工作流,然后保留请求对象,直到它收到允许它发送响应的通知。

网关服务器需要将关联 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的SQSAPI完全不同,但你明白了)

因此,在您的步骤工作流程结束时,您只需向 SQS 发布消息(可能通过 SNS)确保 correlationIdgatewayId 被保留。

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

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

当然,这整个方法只对您希望在适合浏览器和代理超时的时间正常完成的工作流有意义。