我想从我的工作流中调用“事件”任务,但事件 ARN 由外部资源定义(例如,事件 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 中动态指定事件名称的等效语法?
"Resource": "arn:aws:states:::activity:???"
"Parameters": {
"ActivityName.$": "$.activityName"
}
如果不是,是否有任何其他方法可以在不知道其 ARN 或静态名称的情况下动态启动事件?是否可以从工作流本身以外的进程启动事件(即 lambda 函数是否可以启动事件)?
最佳答案
[编辑] 假设不正确,因此原始答案不适用。现在合理的解决方案是:
- 在动态创建事件的同时,还将创建具有该事件任务和 arn 的单节点状态机。
- 后续任务将运行新创建的状态机,并使用具有轮询机制的 wait state 或在事件状态机完成后继续执行的 async callback 任务。
- 对于这两种模式,我们都可以在当前状态机中通过 SDK 读取事件状态机的输出并继续流程。
- 当 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 运行状态机时,您必须传递事件名称。您可以将其作为当前状态机的一部分,或者根据耦合要求使用不同的状态机。
关于amazon-web-services - 如何从我的步骤函数工作流中调用动态事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65939993/