如何从我的步骤函数工作流中调用动态 activity?
How to call a dynamic activity from my step functions workflow?
我想从我的工作流中调用“activity”任务,但 activity ARN 由外部资源定义(例如,activity ARN 可以来自输入,或者它可以作为工作流其他部分中 lambda 执行的输出。
但是,任务上的 Resource
属性 似乎不接受 JsonPath 替换语法。例如,对于此任务定义:
"DynamicActivity":{
"Type": "Task",
"Resource.$": "$.activityArn",
"Next":"Continue"
},
我立即从控制台的状态解析器中得到错误:
我知道 lambda 可以使用动态名称,因为使用 lambda,您可以从资源 ARN 中拆分函数名称,例如:
"DynamicLambda": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName.$": "$.functionName"
},
"Next": "Continue"
}
是否有用于在 Step Functions 中动态指定 activity 名称的等效语法?
"Resource": "arn:aws:states:::activity:???"
"Parameters": {
"ActivityName.$": "$.activityName"
}
如果没有,是否有任何其他方法可以在不知道静态 ARN 或名称的情况下动态启动 activity?能否从工作流本身以外的进程启动活动(即 lambda 函数能否启动 activity)?
[编辑]假设不成立,所以原来的答案不适用。现在合理的解决方案是:
- 在动态创建 activity 的同时,还将创建具有该 activity 任务和 arn 的单节点状态机。
- 后续任务将 运行 新创建的状态机并使用 wait state with polling mechanism or async callback 在 activity 状态机完成后继续执行的任务。
- 对于这两种模式,我们可以在当前状态机中通过 SDK 读取 activity 状态机的输出并继续流程。
- 当 activity 在某个时候被清理时,我们可能也会清理 activity 状态机。
[原答案]
假设:由于活动的数量和名称将始终是有限的和已知的。
您可以通过重新设计工作流程来解决此问题,这样,第一个状态确定要执行哪个 activity。
这将通过选择状态来完成。
"ChoiceStateX": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.activityName",
"StringEquals": "myActivity",
"Next": "myActivityState"
}
],
"Default": "DefaultState"
},
"myActivityState": {
"Type" : "Task",
"Resource": "arn:aws:states:us-east-1:123456789012:activity:activity-1",
"End": true
},
"DefaultState": {
"Type": "Fail",
"Cause": "No Matches!"
}
它可以扩展为任意数量的活动,并且在通过 SDK 或 CLI 运行 宁状态机时,您将必须传递 activity 名称。您可以将其作为当前状态机的一部分,或者根据耦合要求使用不同的状态机。
我想从我的工作流中调用“activity”任务,但 activity ARN 由外部资源定义(例如,activity ARN 可以来自输入,或者它可以作为工作流其他部分中 lambda 执行的输出。
但是,任务上的 Resource
属性 似乎不接受 JsonPath 替换语法。例如,对于此任务定义:
"DynamicActivity":{
"Type": "Task",
"Resource.$": "$.activityArn",
"Next":"Continue"
},
我立即从控制台的状态解析器中得到错误:
我知道 lambda 可以使用动态名称,因为使用 lambda,您可以从资源 ARN 中拆分函数名称,例如:
"DynamicLambda": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName.$": "$.functionName"
},
"Next": "Continue"
}
是否有用于在 Step Functions 中动态指定 activity 名称的等效语法?
"Resource": "arn:aws:states:::activity:???"
"Parameters": {
"ActivityName.$": "$.activityName"
}
如果没有,是否有任何其他方法可以在不知道静态 ARN 或名称的情况下动态启动 activity?能否从工作流本身以外的进程启动活动(即 lambda 函数能否启动 activity)?
[编辑]假设不成立,所以原来的答案不适用。现在合理的解决方案是:
- 在动态创建 activity 的同时,还将创建具有该 activity 任务和 arn 的单节点状态机。
- 后续任务将 运行 新创建的状态机并使用 wait state with polling mechanism or async callback 在 activity 状态机完成后继续执行的任务。
- 对于这两种模式,我们可以在当前状态机中通过 SDK 读取 activity 状态机的输出并继续流程。
- 当 activity 在某个时候被清理时,我们可能也会清理 activity 状态机。
[原答案] 假设:由于活动的数量和名称将始终是有限的和已知的。 您可以通过重新设计工作流程来解决此问题,这样,第一个状态确定要执行哪个 activity。
这将通过选择状态来完成。
"ChoiceStateX": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.activityName",
"StringEquals": "myActivity",
"Next": "myActivityState"
}
],
"Default": "DefaultState"
},
"myActivityState": {
"Type" : "Task",
"Resource": "arn:aws:states:us-east-1:123456789012:activity:activity-1",
"End": true
},
"DefaultState": {
"Type": "Fail",
"Cause": "No Matches!"
}
它可以扩展为任意数量的活动,并且在通过 SDK 或 CLI 运行 宁状态机时,您将必须传递 activity 名称。您可以将其作为当前状态机的一部分,或者根据耦合要求使用不同的状态机。