Api网关从步进功能获得输出结果?

时间:2017-05-18 07:56:17

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

我遵循了有关创建和调用step functions

的教程

我在api的GET请求中输出

 {
  "executionArn": "arn:aws:states:ap-northeast-1:123456789012:execution:HelloWorld:MyExecution",
  "startDate": 1.486772644911E9
}

但是,除了上面的响应,我想要我的步骤函数输出,它由end state给出,如下所示。

{
   "name":"Hellow World"
}

如何实现这一目标?

5 个答案:

答案 0 :(得分:17)

AWS Step Functions是异步的,不会立即返回结果。 API网关方法是同步的,最大超时时间为29秒。

要从Step Function获取函数输出,您必须在API Gateway中添加第二个方法,该方法将使用DescribeExecution操作调用Step Function。 API网关客户端必须定期调用此方法(轮询),直到返回的状态不再为" RUNNING"。

这里是DescribeExecution documentation

答案 1 :(得分:3)

首先,步骤函数异步执行,API Gateway只能调用步骤函数(启动流程)。

如果您正在等待来自Web应用程序的步骤函数调用的结果,则可以使用AWS IOT WebSockets进行此操作。步骤如下。

  • 使用WebSockets设置AWS IOT主题。
  • 配置API网关和步骤函数调用。
  • 从Web前端订阅IOT主题作为WebSocket侦听器。
  • 在步骤功能工作流程的最后一步(以及错误步骤)中,使用AWS开发工具包触发IOT主题,该主题将使用WebSockets将结果广播到在浏览器中运行的Web App。

有关使用AWS IOT的WebSockets的更多详细信息,请参阅中篇文章Receiving AWS IoT messages in your browser using websockets

答案 2 :(得分:1)

扩展AWS上的@MikeD说,如果您确定步骤函数不会超过30秒超时,您可以创建一个执行步进函数的lambda,然后在轮询结果时阻塞。一旦有结果,它就可以返回它。

最好让第一个调用立即返回执行id,然后将该id传递给第二个调用,以便在结束后检索结果。

答案 3 :(得分:0)

AWS Step Functions的新Synchronous Express Workflows是答案: https://aws.amazon.com/blogs/compute/new-synchronous-express-workflows-for-aws-step-functions/

Amazon API Gateway现在支持与HTTP API的Step Functions StartSyncExecution集成: https://aws.amazon.com/about-aws/whats-new/2020/12/amazon-api-gateway-supports-integration-with-step-functions-startsyncexecution-http-apis/

答案 4 :(得分:0)

改用 Express Step Functions。这种类型的 Step Functions 可以被同步调用。转到您的 API 网关并在集成请求部分确保您具有 StartSyncExecution 操作:

enter image description here

之后,在同一页面中稍低一点到映射模板:

enter image description here

并为 application/json 内容类型包含以下模板:

#set($input = $input.json('$'))
{
   "input": "$util.escapeJavaScript($input)",
   "stateMachineArn": "arn:aws:states:us-east-1:your_aws_account_id:stateMachine:your_step_machine_name"
}

之后,返回方法执行并转到集成响应,然后转到映射模板部分:

enter image description here

并使用以下模板从您的 lambda 中获得自定义响应:

#set ($parsedPayload = $util.parseJson($input.json('$.output')))
$parsedPayload

我的测试 Step Function 是这样的:

enter image description here

我的 Lambda 函数代码是:

enter image description here

部署您的 API Gateway 阶段。

现在,如果你去 Postman 并发送一个带有任何 json 正文的 POST 请求,现在你有这样的响应:

enter image description here