Использование JMESPath и aws ec2 описывают экземпляры для вывода нескольких значений тегов

Я пытаюсь вывести несколько тегов из описания экземпляров ec2. Значения тега, которые мне нужны, это Name и aws: autoscaling: groupName.

 "Tags": [
                        {
                            "Value": "somename", 
                            "Key": "Name"
                        }, 
                        {
                            "Value": "some-asg-name", 
                            "Key": "aws:autoscaling:groupName"
                        }, 
                        {
                            "Value": "somethingelse", 
                            "Key": "project"
                        }
                    ], 

Вот что у меня так далеко:

aws ec2 describe-instances --instance-ids i-12345678 --query 'Reservations[].Instances[].[Tags[? contains(`["aws:autoscaling:groupName","Name"]`, Key)] | [0].Value,[1].Value,InstanceId]' --output text

Что приводит к:

somename       None    i-12345678

Вместо:

somename       some-asg-name    i-12345678

Я пробовал обе двойные трубы || а также contains но не могу получить результат, который мне нужен. Кроме того, я не уверен [1].Value это правильный способ получить 2-й соответствующий тег.

2 ответа

Об этом может быть проще подумать, если вы разделите фильтрацию тегов и выделите выходные данные на отдельные части.

Шаг за шагом:

Сначала выберите все экземпляры:

Reservations[].Instances[]

Затем направьте фильтр только для экземпляров с обоими желаемыми тегами:

| [? Tags[? Key == 'Name']] | [? Tags[? Key == 'aws:autoscaling:groupName']]

Затем выберите InstanceId и значения тегов:

.[InstanceId,Tags[? Key == 'Name' || Key == 'aws:autoscaling:groupName'].Value]

Полный пример:

aws ec2 describe-instances --query "Reservations[].Instances[] | [? Tags[? Key == 'Name']] | [? Tags[? Key == 'aws:autoscaling:groupName']].[InstanceId,Tags[? Key == 'Name' || Key == 'aws:autoscaling:groupName'].Value]"

Пример вывода

i-aaaa1234
myNameValue myASGvalue
i-bbbb1234
myNameValue myASGvalue

Дальнейшее чтение

Я думал о синтаксисе канала неправильно. Это работает:

aws ec2 describe-instances --instance-ids i-12345678 --query 'Reservations[].Instances[].[Tags[?Key==`Name`] | [0].Value,Tags[?Key==`aws:autoscaling:groupName`] | [0].Value,InstanceId]' --output text

и выводы:

somename       some-asg-name    i-12345678

Кроме того, это решение помещает выходные данные в одну строку для каждого экземпляра, поэтому его можно использовать со многими экземплярами в --output table

Другие вопросы по тегам