1

AWS Step 中是否有一种方法可以将输出从一个状态映射到下一个状态的输入,超出了InputPath, OutputPath,的提供范围ResultPath

例如,第一个状态的示例输出:

{
    "status": "1",
    "body": {
          "access_token":"example_token"
     }
}

下一个州期望输入以下形式:

{
    "method": "foo",
    "payload": {
         "access_token":<my_access_token>,
         "other_key":"other_value"
    },
    "other_params":["a","b","c"]
}

目前尚不清楚如何将一种状态的输出任意映射到另一种状态的输入。唯一的解决方案似乎是重写 Lambda。

基本上我需要类似的东西:

"Remap": {
  "Type": "Pass",     
  "Result": {
    "method":"foo",
    "payload":{
        "access_token":"$.body.access_token",
        "other_key":"other_value"
    },
    "other_params":["a","b","c"]
  },
  "Next": "NextStage"
},
4

1 回答 1

0

我认为目前没有一种很好的通用方法可以从状态语言中操作 JSON。正如您所说,如果 Pass 的“结果”值可以更具表现力,那将会很有用。

您可以制作一个生成所需 JSON 的中间步骤 lambda。令人沮丧的是,如果您制作了诸如“set-json-path”之类的通用活动,则调用它很笨拙,因为您需要额外的 Pass 步骤来设置其参数,并且必须将它们添加到输入的其余部分. 状态语言似乎需要一种用自己的输入/输出来做“子机器”的方法。

您几乎可以使用 Parallel 获得此功能,但不幸的是结果始终在数组中。这几乎可以工作,但它将 access_token 放在一个数组中,而不仅仅是一个字符串:

{
   "StartAt": "Setup",

   "States": {

     "Setup": {
       "Type": "Pass",
       "Result": {
         "method":"foo",
         "payload":{
           "other_key":"other_value"
         },
         "other_params":["a","b","c"]
       },
       "Next": "Step1"
     },

     "Step1": {
       "Type": "Parallel",
       "Branches": [
         {
           "StartAt": "GetToken",
           "States": {
             "GetToken": {
               "Type": "Pass",
               "Result": {
                 "status": "1",
                 "body": {
                   "access_token":"example_token"
                 }
               },
               "OutputPath": "$.body.access_token",
               "End": true
             }
           }
         }
       ],
       "ResultPath": "$.payload.access_token",
       "Next": "Step2"
     },

     "Step2": {
       "Type": "Task",
       "Resource": "arn:....foo",
       "End": true
    }
  }
}

产量:

{
  "output": {
    "method": "foo",
    "payload": {
      "other_key": "other_value",
      "access_token": [
        "example_token"
      ]
    },
    "other_params": [
      "a",
      "b",
      "c"
    ]
  }
}

在你的情况下,我认为最简单的事情是修改你的第一个 lambda 任务,只返回你可以使用设置的访问令牌字符串ResultPath": "$.payload.access_token"。不幸的是,状态机与每个状态的输入和输出之间存在紧密耦合(以及并行状态数组中的顺序,这让我感到无休止。)

于 2017-08-24T21:11:15.633 回答