Step Functions - 从之前的地图迭代访问状态

Step Functions - Access State from previous Map Iteration

在 Amazon Step Functions 中使用 MaxConcurrency: 1 时,如何在下一次迭代中获取先前 Map Iterations 的结果?

这是我的代码示例

{
  "StartAt": "UploadUsers",
  "States": {
    "UploadUsers": {
      "Type": "Map",
      "MaxConcurrency": 1,
      "ItemsPath": "$.data.users",
      "Parameters": {
        "data.$": "$$.Map.Item.Value.data",
        "friends.$": "$.?????? Get created users ids"
      },
      "Iterator": {
        "StartAt": "UploadUser",
        "States": {
          "UploadUser": {
            "End": true,
            "Parameters": {
              "FunctionName": "${FnUploadUser}",
              "Payload": {
                "data.$": "$.user_data",
                "friends.$": "$.??????"
              }
            },
            "Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken",
            "ResultPath": "$.data. ???",
            "Type": "Task"
          }
        }
      },
      "End": true,
      "ResultPath": "$.data.UploadUsers",
      "ResultSelector": {
        "result.$": "$"
      }
    }
  }
}

假设 FnUploadUser 是一个 lambda,它 returns 创建的用户的 id。 我想获取之前创建的用户的 ID,并将该值用于我即将创建的下一个用户。

你不能。 Map 状态迭代不共享状态。两种解决方法:

(1) 在外部管理共享状态: 每次 Map 迭代写入和读取 DynamoDB table.

(2) 重构为“for”循环并在执行输出中保留共享状态。

  1. 不使用 Map,而是插入 Choice 状态(在 UploadUser 之后)来检查“完成”条件。如果“完成”,则完成,否则循环回到 UploadUser.
  2. UploadUser 接受 user_data 数组作为输入。它将其输出附加到 uploaded 输出数组。
  3. 每个 UploadUser 迭代通过将其与 uploaded 数组进行比较来识别下一个 user_data 项目。处理最后一项的迭代也可以输出 done: true 以向 Choice 发出工作完成的信号。
  4. Choice 状态循环回到 UploadUser,同时还有更多要处理(即 done 不存在)。

还有其他方法可以构建步骤 2-3。例如,您可以在输出上添加 next_itemtotal_items 键以跟踪进度。重要的一点是 Choice 循环直到满足退出条件。