有没有一种方法可以使用AWS步骤功能中的状态输入来插值OutputPath的JsonPath?

时间:2020-06-04 14:50:10

标签: amazon-web-services jsonpath aws-step-functions

基本上,我有以下输入内容:

{
   "name": "abc",
   "choice": "choice1"
}

我的dynamoDB表具有以下结构:

  1. 分区键-“名称”
  2. 具有以下选项的复杂json:

    {
      "choices": 
      {
         "choice1": ......,
         "choice2": ......
      }    
    }
    

我想直接从dynamodb阅读,并在相关选择下获得一个子项目:

{
  "StartAt": "Read Next Message from DynamoDB",
  "States": {
        "Read Next Message from DynamoDB": {
      "Type": "Task",
      "Resource": "arn:aws:states:::dynamodb:getItem",
      "Parameters": {
        "TableName": "my_table",
        "Key": {
          "customerName": {"S.$": "$.name"}
        }
      },
      "OutputPath": "$.Item.choices.M.choice1.M.myvalue.S",
      "Next": "World"
    },
    "World": {
      "Type": "Pass",
      "End": true
    }
  }
}

基本上,我想做类似“ $。Item.choices.M。{$。choice} .M.myvalue.S” 的操作,并从输入中获取输出的键之一。这可能吗?

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找的是JsonPath插值,但是根据thread在AWS论坛上不支持。

据我所知,步进函数仅允许通过$.[]运算符(Reference Path)进行路径引用。

我不知道您对DynamoDB表的数据有多少控制权,但我认为如果您的选择类型采用以下方式建模,则可以轻松解决您的问题

{
  "choices": [{
    "choiceType": "choice1",
    ........
  },
  {
    "choiceType": "choice2",
    ........
  }]
}
  1. 现在,您可以使用map state遍历choices数组。请注意,不要忘记将期望的choiceType传递给每个迭代。
  2. 地图迭代器的第一个状态可以是choice state,它比较choiceType并移至适当的下一个状态。因此,基本上,您的其余工作流将在步骤1中建模为地图状态的迭代器。

现在,如果您无法控制DynamoDB表,则可以在AWS Lambda中处理查询结果。