AWS StepFunctions - 将任务输出与原始输入合并并展平

xbe*_*eta 7 amazon-web-services aws-step-functions

我们如何使用Parameters,ResultPathResultSelector将 a 的结果Task与同一 JSON 级别中的原始输入结合起来?

我检查了AWS 上的文档,但似乎ResultSelector总是创建一个新字典,将其置于结果的下方 1 级。

输入示例


    {
        "status": "PENDING",
        "uuid": "00000000-0000-0000-0000-000000000000",
        "first_name": "John",
        "last_name": "Doe",
        "email": "john.doe@email.com",
        "orders": [
            {
                "item_uuid": "11111111-1111-1111-1111-111111111111",
                "quantities": 2,
                "price": 2.38,
                "created_at": 16049331038000
            }
        ]
    
    
    }

Run Code Online (Sandbox Code Playgroud)

状态机定义


    "Review": {
      "Type": "Task",
      "Resource": "arn:aws:states:us-east-1:123456789012:activity:Review",
      "ResultPath": null,
      "Next": "Processing",
      "Parameters": {
        "task_name": "REVIEW_REQUIRED",
        "uuid.$": "$.uuid"
      }
    },

Run Code Online (Sandbox Code Playgroud)

Review活动的输出示例


    {
        "review_status": "APPROVED"
    }

Run Code Online (Sandbox Code Playgroud)

问题 如何更新状态机定义以将Review活动的结果和原始输入合并为如下所示?


   {
        "status": "PENDING",
        "uuid": "00000000-0000-0000-0000-000000000000",
        "first_name": "John",
        "last_name": "Doe",
        "email": "john.doe@email.com",
        "orders": [
            {
                "item_uuid": "11111111-1111-1111-1111-111111111111",
                "quantities": 2,
                "price": 2.38,
                "created_at": 16049331038000
            }
        ],
        "review_status": "APPROVED"
    }


Run Code Online (Sandbox Code Playgroud)

注意 我无权访问活动代码,只能访问定义文件。

小智 6

虽然 Step Function 不允许您这样做,但您可以创建一个 Pass 状态来扁平化输入作为解决方法。

输入示例:

{
  "name": "John Doe",
  "lambdaResult": {
    "age": "35",
    "location": "Eastern Europe"
   }
}
  
Run Code Online (Sandbox Code Playgroud)

亚马逊国家语言:

"Flatten": {
  "State": "Pass",
  "Parameters": {
      "name.$" : "$.name",
      "age.$" : "$.lambdaResult.age",
      "location.$": "$.lambdaResult.location"
  },
  "Next": "MyNextState"
}     
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "name": "John Doe",
  "age": "35",
  "location": "Eastern Europe"
}
  
Run Code Online (Sandbox Code Playgroud)

这很乏味,但它可以完成工作。


小智 5

我建议不要按照上面建议的方式进行操作,因为您将删除所有不包含的数据。这不是一个长期的方法,您可以更轻松地这样做:

步进输入

{
    "a": "a_value",
    "b": "b_value",
    "c": {
        "c": "c_value"
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的 state-machine.json 中

"Flatten And Keep All Other Keys": {
    "Type": "Pass",
    "InputPath": "$.c.c",
    "ResultPath": "$.c",
    "Next": "Some Other State"
}
Run Code Online (Sandbox Code Playgroud)

步进输出

{
    "a": "a_value",
    "b": "b_value",
    "c": "c_value"
}
Run Code Online (Sandbox Code Playgroud)


小智 -2

谢谢你的提问。

看起来您不一定需要以任何方式操作输出,并且正在寻找一种方法将状态的输出与其输入结合起来,然后再将其传递到下一个状态。ResultPath字段允许您将任务结果与任务输入组合起来,或选择其中之一。您提供给 ResultPath 的路径控制传递到输出的信息。