27

我遵循了有关创建和调用步进函数的教程

我在 api 的 GET 请求中得到输出

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

但是,我想要我的阶跃函数输出而不是上述响应,它由结束状态给出,如下所示。

{
   "name":"Hellow World"
}

如何做到这一点?

4

5 回答 5

37

更新:您现在可以将 Express Step Functions 用于同步请求。

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

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

这是DescribeExecution 文档

于 2017-05-19T02:50:32.840 回答
11

AWS Step Functions 的新同步快速工作流就是答案: 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-函数-startsyncexecution-http-apis/

于 2020-12-07T20:16:43.583 回答
7

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

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

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

有关使用 AWS IOT 的 WebSockets 的更多详细信息,请参阅中篇文章使用 websockets 在浏览器中接收 AWS IoT 消息

于 2017-12-20T16:07:47.837 回答
7

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

在此处输入图像描述

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

在此处输入图像描述

并为 application/json Content-Type 包含以下模板:

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

之后,返回 Method Execution 并转到 Integration Response,然后转到 Mapping Templates 部分:

在此处输入图像描述

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

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

我的测试 Step Function 是这样的:

在此处输入图像描述

我的 Lambda 函数代码是:

在此处输入图像描述

部署您的 API Gateway 阶段。

现在,如果你去 Postman 并使用任何 json 正文发送 POST 请求,现在你会得到这样的响应:

在此处输入图像描述

于 2021-08-06T22:03:54.740 回答
4

扩展 AWS 的 @MikeD 所说的内容,如果您确定 Step Function 不会超过 30 秒超时,您可以创建一个执行 step 函数的 lambda,然后在轮询结果时阻塞。一旦它得到结果,它就可以返回它。

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

于 2017-12-20T15:55:00.670 回答