How to access API Parameters of a node and add them as part of it's own output json in AWS Step Functions?

1

Here's some part of my StepFunction: https://i.stack.imgur.com/4Jxd9.png

Here's the workflow for the "Parallel" node:

    {
      "Type": "Parallel",
      "Branches": [
        {
          "StartAt": "InvokeEndpoint01",
          "States": {
            "InvokeEndpoint01": {
              "Type": "Task",
              "End": true,
              "Parameters": {
                "Body": "$.Input",
                "EndpointName": "dummy-endpoint-name1"
              },
              "Resource": "arn:aws:states:::aws-sdk:sagemakerruntime:invokeEndpoint"
            }
          }
        },
        {
          "StartAt": "InvokeEndpoint02",
          "States": {
            "InvokeEndpoint02": {
              "Type": "Task",
              "End": true,
              "Parameters": {
                "Body": "$.Input",
                "EndpointName": "dummy-endpoint-name2"
              },
              "Resource": "arn:aws:states:::aws-sdk:sagemakerruntime:invokeEndpoint"
            }
          }
        }
      ],
      "Next": "Lambda Invoke"
    },

I would like to access the EndpointName of each node inside this Parallel block and add it as one of the keys of that particular node's output, without modifying the existing output's body and other headers.(in the above json, EndpointName can be found for first node inside the Parallel at $.Branches[0].States.InvokeEndpoint01.Parameters.EndpointName)

Here's output of one of the node inside the Parallel block:

{
  "Body": "{xxxx}",
  "ContentType": "application/json",
  "InvokedProductionVariant": "xxxx"
}

and I would like to access the API Parameter and make it something like below:

{
  "Body": "{xxxx}",
  "ContentType": "application/json",
  "InvokedProductionVariant": "xxxx",
  "EndpointName": "dummy-endpoint-name1"
}

How do I do this?

已提问 2 年前405 查看次数
2 回答
1

Hi,

Two possible solution that I can see are:

  1. Define ResultSelector in each state to insert the static EndpointName value into the state's result. Adding a value "Output.$": "$" will copy the full, un-manipulated, state result into that key.

Example Definition

{
    "StartAt": "InvokeEndpoint02",
    "States":
    {
        "InvokeEndpoint02":
        {
            "Type": "Task",
            "End": true,
            "Parameters":
            {
                "Body": "$.Input",
                "EndpointName": "dummy-endpoint-name2"
            },
            "Resource": "arn:aws:states:::aws-sdk:sagemakerruntime:invokeEndpoint",
            "ResultSelector":
            {
                "Output.$": "$",
                "EndpointName": "dummy-endpoint-name2"
            }
        }
    }
}

Example Output

{
  "EndpointName": "dummy-endpoint-name2",
  "Output": {
    "Body": "{xxxx}",
    "ContentType": "application/json",
    "InvokedProductionVariant": "xxxx"
  }
}
  1. Pass the EndpointName into Amazon SageMaker's CustomAttributes Request/Response elements, SageMaker InvokeEndpoint Response Elements. Adding EndpointName to the model's response in the CustomAttributes element will result in the desired state result.
AWS
已回答 2 年前
0

2nd way from @Edward_S's answer does fulfill my needs. but, someone stumbling on this question in the future would want to learn how this can be accomplished.

I learned from AWS Support that it is not possible to access the parameters(or API Parameters) of a node. If you want to access the Parameters, make a node(at i-1th position) send the Parameters current node(at ith position) need as Parameters and fill them dynamically and then access them from it's output.

已回答 2 年前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则