Api 网关从步骤函数中获取输出结果?
Api gateway get output results from step function?
我遵循了有关创建和调用的教程step functions
我在 api 的 GET 请求中得到的输出是
{
"executionArn": "arn:aws:states:ap-northeast-1:123456789012:execution:HelloWorld:MyExecution",
"startDate": 1.486772644911E9
}
但是,我想要我的步进函数输出而不是上面的响应,它由如下结束状态给出。
{
"name":"Hellow World"
}
如何实现?
更新:您现在可以使用 Express Step Functions 进行同步请求。
AWS Step Functions 是异步的,不会立即 return 它们的结果。 API 网关方法是同步的,最大超时为 29 秒。
要从 Step Function 获取函数输出,您必须在 API Gateway 中添加第二个方法,该方法将使用 DescribeExecution 操作调用 Step Function。 API 网关客户端必须定期调用(轮询)直到 returned 状态不再是“运行”。
扩展 AWS 的 @MikeD 所说的内容,如果您确定 Step Function 不会超过 30 秒超时,您可以创建一个 lambda 来执行 step 函数,然后在轮询结果。一旦有了结果,它就可以return了。
最好让第一个调用 return 立即使用执行 ID,然后在完成后将该 ID 传递给第二个调用以检索结果。
首先,步骤函数异步执行,API网关只能调用步骤函数(启动流程)。
如果您正在等待来自 Web 应用程序的步骤函数调用的结果,您可以为此使用 AWS IOT WebSockets。步骤如下
- 使用 WebSockets 设置 AWS IOT 主题。
- 配置 API 网关和步骤函数调用。
- 作为 WebSocket 侦听器从 Web 前端订阅 IOT 主题。
- 在 Step Functions 工作流程的最后一步(以及错误步骤中),使用 AWS SDK 触发 IOT 主题,该主题将使用 WebSockets 将结果广播到浏览器中的 Web 应用 运行。
有关使用 AWS IOT 的 WebSockets 的更多详细信息,请参阅媒体文章 Receiving AWS IoT messages in your browser using websockets。
适用于 AWS Step Functions 的新同步快速工作流就是答案:
https://aws.amazon.com/blogs/compute/new-synchronous-express-workflows-for-aws-step-functions/
Amazon API Gateway 现在支持与 Step Functions StartSyncExecution for HTTP APIs 集成:
https://aws.amazon.com/about-aws/whats-new/2020/12/amazon-api-gateway-supports-integration-with-step-functions-startsyncexecution-http-apis/
改用 Express Step Functions。这种类型的 Step Functions 可以同步调用。转到您的 API 网关并在“集成请求”部分确保您有 StartSyncExecution 操作:
之后,在同一页面中向下一点到映射模板:
并为 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"
}
之后,返回方法执行并转到集成响应,然后转到映射模板部分:
并使用以下模板从您的 lambda 中获得自定义响应:
#set ($parsedPayload = $util.parseJson($input.json('$.output')))
$parsedPayload
我测试的Step Function是这样的:
我的 Lambda 函数代码是:
部署您的 API 网关阶段。
现在,如果您转到 Postman 并发送带有任何 json 正文的 POST 请求,现在您会得到如下响应:
我遵循了有关创建和调用的教程step functions
我在 api 的 GET 请求中得到的输出是
{
"executionArn": "arn:aws:states:ap-northeast-1:123456789012:execution:HelloWorld:MyExecution",
"startDate": 1.486772644911E9
}
但是,我想要我的步进函数输出而不是上面的响应,它由如下结束状态给出。
{
"name":"Hellow World"
}
如何实现?
更新:您现在可以使用 Express Step Functions 进行同步请求。
AWS Step Functions 是异步的,不会立即 return 它们的结果。 API 网关方法是同步的,最大超时为 29 秒。
要从 Step Function 获取函数输出,您必须在 API Gateway 中添加第二个方法,该方法将使用 DescribeExecution 操作调用 Step Function。 API 网关客户端必须定期调用(轮询)直到 returned 状态不再是“运行”。
扩展 AWS 的 @MikeD 所说的内容,如果您确定 Step Function 不会超过 30 秒超时,您可以创建一个 lambda 来执行 step 函数,然后在轮询结果。一旦有了结果,它就可以return了。
最好让第一个调用 return 立即使用执行 ID,然后在完成后将该 ID 传递给第二个调用以检索结果。
首先,步骤函数异步执行,API网关只能调用步骤函数(启动流程)。
如果您正在等待来自 Web 应用程序的步骤函数调用的结果,您可以为此使用 AWS IOT WebSockets。步骤如下
- 使用 WebSockets 设置 AWS IOT 主题。
- 配置 API 网关和步骤函数调用。
- 作为 WebSocket 侦听器从 Web 前端订阅 IOT 主题。
- 在 Step Functions 工作流程的最后一步(以及错误步骤中),使用 AWS SDK 触发 IOT 主题,该主题将使用 WebSockets 将结果广播到浏览器中的 Web 应用 运行。
有关使用 AWS IOT 的 WebSockets 的更多详细信息,请参阅媒体文章 Receiving AWS IoT messages in your browser using websockets。
适用于 AWS Step Functions 的新同步快速工作流就是答案: https://aws.amazon.com/blogs/compute/new-synchronous-express-workflows-for-aws-step-functions/
Amazon API Gateway 现在支持与 Step Functions StartSyncExecution for HTTP APIs 集成: https://aws.amazon.com/about-aws/whats-new/2020/12/amazon-api-gateway-supports-integration-with-step-functions-startsyncexecution-http-apis/
改用 Express Step Functions。这种类型的 Step Functions 可以同步调用。转到您的 API 网关并在“集成请求”部分确保您有 StartSyncExecution 操作:
之后,在同一页面中向下一点到映射模板:
并为 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"
}
之后,返回方法执行并转到集成响应,然后转到映射模板部分:
并使用以下模板从您的 lambda 中获得自定义响应:
#set ($parsedPayload = $util.parseJson($input.json('$.output')))
$parsedPayload
我测试的Step Function是这样的:
我的 Lambda 函数代码是:
部署您的 API 网关阶段。
现在,如果您转到 Postman 并发送带有任何 json 正文的 POST 请求,现在您会得到如下响应: