AWS Step Functions - 将数据批量发送到 Child/Nested Step Function 状态机

AWS Step Functions - Batch Send Data to Child/Nested Step Function State Machine

我正在寻找一种将数据从专利状态机批量发送到子状态机的方法,一次发送 50 条记录。

这是什么意思?

我有两个 AWS Step Functions 状态机。一个父子状态机。父状态机的目的是从我们的 Jenkins 平台获取所有用户。它看起来像这样:

Comment: >-
  A state machine that coordinates the end-to-end process for Jenkins
StartAt: Get Jenkins Users
States:
  Get Jenkins Users:
    Type: Task
    Resource: "${JenkinsUsersFunctionArn}"
    TimeoutSeconds: 65
    HeartbeatSeconds: 30
    Retry:
      - ErrorEquals:
          - Lambda.ServiceException
          - Lambda.AWSLambdaException
          - Lambda.SdkClientException
          - States.Timeout
        IntervalSeconds: 2
        MaxAttempts: 3
        BackoffRate: 2
    Catch:
      - ErrorEquals:
          - States.ALL
        ResultPath: "$"
        Next: Process Error
    ResultPath: "$"
    Next: Filter Jenkins Users

这会输出一个对象数组,其中约有 1,500 个对象到 $.users 对象。

我想做的是将所有 1,500 个对象发送到子状态机,我想一次只发送 50 个。这意味着如果有 1,500 个对象,它将总共调用 30 个状态机。

我想到了这样的东西:

  Filter Jenkins Users:
    Type: Map
    InputPath: "$.users"
    MaxConcurrency: 50
    Iterator:
      StartAt: Filter
      States:
        Filter:
          Type: Task
          Resource: arn:aws:states:::states:startExecution
          Parameters:
            StateMachineArn:
            Input: 
              Users: "$"
              AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$: "$$.Execution.Id"
          End: true
    ResultPath: "$.users"
    Next: Success State

但这同时启动了 50 个状态机,这不是我想要的。我想批量发送 50 个对象到子状态机。

我为什么要这样做?

如果我要在一个状态机中处理所有这些,我会遇到很多限制,我试图将它拆分为多个步进函数状态机以确保我不会遇到任何限制。

这可能吗?

此处的限制基于每个区域的整个 AWS 账户。所以如果你分裂,你仍然有那个限制。

无论如何,这就是我的做法。

  1. 改为使用您的 lambda return 一个数组中有 1500 个用户,将其分块为每个分块 50 个用户
  2. 使用并发为 1 的 Map 状态,输入是分块数组(50 个)

"${JenkinsUsersFunctionArn}" 期望 return 这个

{
  "users": [
    [
      50 users...
    ],
    [
      50 users...
    ],
    ...
    [
      15 users...
    ]
  ]
}

这是您的地图状态

  Filter Jenkins Users:
    Type: Map
    InputPath: "$.users"
    MaxConcurrency: 1
    Iterator:
      StartAt: Filter
      States:
        Filter:
          Type: Task
          Resource: arn:aws:states:::states:startExecution
          Parameters:
            StateMachineArn:
            Input: 
              Users: "$"
              AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$: "$$.Execution.Id"
          End: true
    ResultPath: "$.users"
    Next: Success State