【问题标题】:Api gateway get output results from step function?Api 网关从 step 函数获取输出结果?
【发布时间】:2017-10-17 22:01:35
【问题描述】:

我按照教程创建和调用step functions

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

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

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

{
   "name":"Hellow World"
}

如何做到这一点?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    这是DescribeExecution documentation

    【讨论】:

    • 该死。我想我会回到嵌入式 lambda 调用。如果有一个同步复选框会很好,但我不确定如果没有父 lambda 处理初始 http 请求和响应,AWS 将如何做到这一点。
    • DescribeExecution 不受EXPRESS 状态机的支持
    • 如何调用“使用 DescribeExecution 操作”?我在文档网址中找不到它。
    【解决方案2】:

    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-functions-startsyncexecution-http-apis/

    【讨论】:

    • 感谢您提供此信息!如果 step 函数的执行速度不够快,无法满足 API 要求,会发生什么情况?
    • 类似于 API Gateway 执行具有更大超时的 Lambda 函数。如果您有需要更多处理时间的内容,则 Async 工作流程更适合。创建一个端点来接受请求并创建另一个端点来获取进程的状态。
    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      改用 Express Step Functions。这种类型的 Step Functions 可以被同步调用。转到您的 API 网关并在集成请求部分确保您有 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 请求,现在你会得到这样的响应:

      【讨论】:

      • 这应该是现在的答案了。
      【解决方案5】:

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

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

      猜你喜欢
      • 1970-01-01
      • 2022-10-23
      • 2022-11-23
      • 1970-01-01
      • 2018-12-16
      • 2023-01-14
      • 2019-02-11
      相关资源
      最近更新 更多