amazon-web-services - 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 个对象到子状态机。
我为什么要这样做?
如果我要在一个状态机中处理这一切,我会遇到很多限制,我试图将其拆分为多个步进功能状态机,以确保我不会遇到任何限制。
这可能吗?
解决方案
此处的限制基于您每个区域的整个 AWS 账户。因此,如果您拆分,您仍然会受到限制。
无论如何,这就是我将如何做到的。
- 相反,您的 lambda 在一个数组中返回 1500 个用户,将其分块为每个块 50 个用户
- 使用并发为 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