AWS步骤

时间:2017-08-24 20:54:10

标签: aws-step-functions

AWS Step中是否有一种方法可以将输出从一个状态映射到下一个状态的输入,而不是InputPathOutputPathResultPath

e.g。第一个州的输出示例:

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

下一个州希望输入以下表格:

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

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

基本上我需要这样的东西:

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

1 个答案:

答案 0 :(得分:0)

我认为目前没有一种很好的通用方法可以在州语言中操纵JSON。如你所说,如果Pass的“Result”值更具表现力,那将会很有用。

您可以创建一个中间步骤lambda,生成您需要的JSON。令人沮丧的是,如果你做了类似“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"设置的访问令牌字符串。不幸的是,状态机与每个状态的输入和输出之间存在紧密耦合(以及并行状态数组中的顺序,这使我无所不在。)