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”循环并在执行输出中保留共享状态。
- 不使用
Map
,而是插入 Choice
状态(在 UploadUser
之后)来检查“完成”条件。如果“完成”,则完成,否则循环回到 UploadUser
.
UploadUser
接受 user_data
数组作为输入。它将其输出附加到 uploaded
输出数组。
- 每个
UploadUser
迭代通过将其与 uploaded
数组进行比较来识别下一个 user_data
项目。处理最后一项的迭代也可以输出 done: true
以向 Choice
发出工作完成的信号。
Choice
状态循环回到 UploadUser
,同时还有更多要处理(即 done
不存在)。
还有其他方法可以构建步骤 2-3。例如,您可以在输出上添加 next_item
和 total_items
键以跟踪进度。重要的一点是 Choice
循环直到满足退出条件。
在 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”循环并在执行输出中保留共享状态。
- 不使用
Map
,而是插入Choice
状态(在UploadUser
之后)来检查“完成”条件。如果“完成”,则完成,否则循环回到UploadUser
. UploadUser
接受user_data
数组作为输入。它将其输出附加到uploaded
输出数组。- 每个
UploadUser
迭代通过将其与uploaded
数组进行比较来识别下一个user_data
项目。处理最后一项的迭代也可以输出done: true
以向Choice
发出工作完成的信号。 Choice
状态循环回到UploadUser
,同时还有更多要处理(即done
不存在)。
还有其他方法可以构建步骤 2-3。例如,您可以在输出上添加 next_item
和 total_items
键以跟踪进度。重要的一点是 Choice
循环直到满足退出条件。