如何从我的步骤函数工作流中调用动态 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 名称。您可以将其作为当前状态机的一部分,或者根据耦合要求使用不同的状态机。