【问题标题】:AWS StepFunctions - Merge and flatten the task output combined with the original inputAWS StepFunctions - 合并和展平与原始输入相结合的任务输出
【发布时间】:2022-01-07 05:48:45
【问题描述】:

我们如何使用ParametersResultPathResultSelectorTask 的结果与相同JSON 级别的原始输入结合起来?

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

示例输入


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

Review Activity 的示例输出


    {
        "review_status": "APPROVED"
    }

问题 如何更新状态机定义以将Review Activity 的结果和原始输入组合成如下内容?


   {
        "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"
    }


注意 我无法访问 Activity 代码,只能访问定义文件。

【问题讨论】:

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


    【解决方案1】:

    虽然 Step Function 不允许您这样做,但您可以创建一个通过状态将输入展平作为一种解决方法。

    示例输入:

    {
      "name": "John Doe",
      "lambdaResult": {
        "age": "35",
        "location": "Eastern Europe"
       }
    }
      
    

    亚马逊州语言:

    "Flatten": {
      "State": "Pass",
      "Parameters": {
          "name.$" : "$.name",
          "age.$" : "$.lambdaResult.age",
          "location.$": "$.lambdaResult.location"
      },
      "Next": "MyNextState"
    }     
    

    输出:

    {
      "name": "John Doe",
      "age": "35",
      "location": "Eastern Europe"
    }
      
    

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

    【讨论】:

      【解决方案2】:

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

      分步输入

      {
          "a": "a_value",
          "b": "b_value",
          "c": {
              "c": "c_value"
          }
      }
      

      在你的 state-machine.json 中

      "Flatten And Keep All Other Keys": {
          "Type": "Pass",
          "InputPath": "$.c.c",
          "ResultPath": "$.c",
          "Next": "Some Other State"
      }
      

      步骤输出

      {
          "a": "a_value",
          "b": "b_value",
          "c": "c_value"
      }
      

      【讨论】:

        【解决方案3】:

        感谢您的提问。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-24
          • 1970-01-01
          • 1970-01-01
          • 2018-05-30
          • 1970-01-01
          相关资源
          最近更新 更多