首页 > 解决方案 > AWS Step Functions - 将数据批量发送到子/嵌套 Step Function 状态机

问题描述

我正在寻找一种将数据批量发送到子状态机的方法,从专利状态机,一次 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 个对象到子状态机。

我为什么要这样做?

如果我要在一个状态机中处理这一切,我会遇到很多限制,我试图将其拆分为多个步进功能状态机,以确保我不会遇到任何限制。

这可能吗?

标签: amazon-web-servicesyamlstate-machineaws-step-functions

解决方案


此处的限制基于您每个区域的整个 AWS 账户。因此,如果您拆分,您仍然会受到限制。

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

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

"${JenkinsUsersFunctionArn}"期望返回这个

{
  "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

推荐阅读