AWS Step Function 同步任务令牌

AWS Step Function Synchronous Task Token

我有一个用例想使用 Step Functions 来解决,但我找不到解决这个问题的方法。非常感谢您的帮助。

问题是这样的:我有一个 Amazon API 网关,它有一个 /start 端点。此端点的 POST 应该启动数据处理会话,return 一个 URL 到 API 客户端可以用来捕获一些数据的应用程序。数据捕获完成后,会在最终响应通过回调发送到 API 客户端之前进行一些处理。

正如您在下面看到的,我的想法是生成一个任务令牌并将其发送到数据捕获服务。然后,当用户数据捕获完成时,该服务可以向 Step Function API 发送请求,表明该阶段已完成。问题是我如何从 Step Function 中将 return URL 发送给客户端?我不想使用回调来执行此操作。

一种选择是在 'Step Function Initiator' Lambda 中创建数据捕获会话,但我该如何为数据捕获服务提供任务令牌?

真的,我需要的是某种机制,可以从 Step Function 到 Lambda 同步 return 某些东西(来自该调用的 URL 或来自第一阶段的任务令牌开始执行。这可能吗?你会如何解决这个问题?

  • 在 step function initiator lambda 中,您必须执行 start-execution 其中 returns 和 executionArn
  • 接下来,您可以循环调用get-execution-history api,任务令牌将成为'capture data'任务参数的一部分。由于这是第一步,这确实应该在几秒钟内完成,因此,我们可以保持 运行 每秒循环一次,直到启动 step 函数中的所需步骤并获得任务令牌。

举个例子,我将任务令牌传递给当前步骤函数调用的另一个步骤函数。

{
   "StartAt":"ChildTask",
   "States":{
      "ChildTask":{
         "End":true,
         "Type":"Task",
         "Resource":"arn:aws:states:::states:startExecution.waitForTaskToken",
         "Parameters":{
            "Input":{
               "token.$":"$$.Task.Token",
               "foo":"bar"
            },
            "StateMachineArn":"arn:aws:states:us-east-1:110011001100:stateMachine:ChildStateMachine",
            "Name":"MyExecutionName"
         }
      }
   }
}

获取执行历史:

aws stepfunctions get-execution-history --execution-arn arn:aws:states:us-east-1:110011001100:execution:ParentStateMachine:667102b3-b19c-b7ab-b119-9ec6cf23e505

结果:

执行历史记录和任务令牌中的前几个条目之一是参数的一部分。我们可以退出循环,抓住它,将其发送回 Api 网关。

{
    "timestamp": "2021-03-12T13:56:58.097000-05:00",
    "type": "TaskScheduled",
    "id": 3,
    "previousEventId": 2,
    "taskScheduledEventDetails": {
        "resourceType": "states",
        "resource": "startExecution.waitForTaskToken",
        "region": "us-east-1",
        "parameters": "{\"Input\":{\"foo\":\"bar\",\"token\":\"o6QVQ9gls.......=\"},\"StateMachineArn\":\"arn:aws:states:us-east-1:110011001100:stateMachine:ChildStateMachine\",\"Name\":\"MyExecutionName\"}"
    }
}