'How to use StringMap parameters in SSM documents?

I have the following step in a SSM document. The result of the call is a Json, so I wanted to parse it as a stringMap (which seems to be the correct type for it) instead of creating an output for each variable I want to reference

I've tried referencing this as both:

{{ GetLoadBalancerProperties.Description.Scheme }}

and

{{ GetLoadBalancerProperties.Description[\"LoadBalancerName\"] }}

In both cases I get an error saying the variable was never defined

{
      "name": "GetLoadBalancerProperties",
      "action": "aws:executeAwsApi",
      "isCritical": true,
      "maxAttempts": 1,
      "onFailure": "step:deleteParseCloudFormationTemplate",
      "inputs": {
        "Service": "elb",
        "Api": "describe-load-balancers",
        "LoadBalancerNames": [
          "{{ ResourceId }}"
        ]
      },
      "outputs": [
        {
          "Name": "Description",
          "Selector": "$.LoadBalancerDescriptions[0]",
          "Type": "StringMap"
        }
      ]
    }

This is the actual message:

Step fails when it is validating and resolving the step inputs. Failed to resolve input: GetLoadBalancerProperties.Description["LoadBalancerName"] to type String. GetLoadBalancerProperties.Description["LoadBalancerName"] is not defined in the Automation Document.. Please refer to Automation Service Troubleshooting Guide for more diagnosis details.



Solution 1:[1]

I believe the answer you were searching is in here: https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-plugins.html#top-level-properties-type

Just to name a few examples:

Map type is a Python dict, hence if your output is a dict you should use StringMap in the SSM Document.

While List type is same as Python list.

So if your output is a List of Dictionary the type you want to use is MapList.

Solution 2:[2]

In some cases it seems that you cannot. I was able to work around this issue, by using a Python script in the SSM document to output the right type, but otherwise I believe the SSM document is not flexible enough to cover all cases.

The script I used:

- name: myMainStep
  action: aws:executeScript
  inputs:
    Runtime: python3.6
    Handler: myMainStep
    InputPayload:
      param: "{{ myPreviousStep.myOutput }}"
    Script: |-
      def myMainStep(events,context):
        myOutput = events['myOutput']
        for tag in myOutput:
          if tag["Key"] == "myKey":
            return tag["Value"]
        return "myDefaultValue"
  outputs:
  - Name: output
    Selector: "$.Payload"
    Type: String 

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Nimantha
Solution 2 vladimirror