0 votes
1 view
in AWS by (9.2k points)

Using aws-cli 1.3.6 I am trying to get a simple table of my ec2 instances with the Name and state. I have been looking at the --query and JMESpath documentation and I have been able to select the "Value" item of a Map which "Key" item is equal to Name. This is useful to get the instance-name. Therefore, the code below seems to work

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value'

And delivers this:

--------------------------

|DescribeInstances|

+-----------------------+

|  Name1                |

|  Name2                |

+-----------------------+

However, if I want to add the state, things get not as I would have expected. Using

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value,State.Name]'

Delivers

--------------------------

|DescribeInstances|

+-----------------------+

|  Name1                |

|  stopped               |  

|  Name2                |

|  stopped               |

+-----------------------+

instead of a two column table with name and state.

If we turn the output to JSON, we can see that the Tags selection returns a list (one-element list) and that's probably the issue:

[

    [

        [

            "Name1"

        ],

        "stopped"

    ],

    [

        [

            "Name2"

        ],

        "stopped"

    ]

]

I have not been able to turn this list into an scalar by selecting the first element. This, does not work. Returns an empty list as the Name.

aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[0],State.Name]'

The same as this

aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[][0],State.Name]'

The only way I have figured out of addressing this is by means of the join function. Since I only expect one element, it is ok but I seems to be a little bit hacky.

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[join(`,`,Tags[?Key==`Name`].Value),State.Name]'

--------------------------------

|    DescribeInstances    |

+-------------+---------------+

|  Name1      |  stopped  |

|  Name2      |  stopped  |

+-------------+---------------+

The question, therefore, is: is there any way of picking the first element of the result of the filter (?Key==XXXX) bearing in mind that suffixing it with [0] seems not to work?

Thanks in advance!

1 Answer

0 votes
by (18.5k points)

The most convenient solution for your problem might be Pipe Expressions which has been made available in AWS CLI version 1.3.7.

A pipe expression simply combines two expressions that are separated by '|' character.

So if you want to pick the first element of the result of the filter, you can use the following command:

aws ec2 describe-instances --output table \

  --query 'Reservations[].Instances[].[Tags[?Key==`Name`] | [0].Value, State.Name]'

Welcome to Intellipaat Community. Get your technical queries answered by top developers !


Categories

...