Подтвердить что ты не робот

Имя экземпляра экземпляра среди других данных с помощью aws-cli 1.3.6

Использование aws-cli 1.3.6 Я пытаюсь получить простую таблицу экземпляров ec2 с именем и состоянием. Я смотрел документацию --query и JMESpath, и мне удалось выбрать элемент "Значение" на карте, элемент "Ключ" равен имени. Это полезно для получения имени экземпляра. Таким образом, приведенный ниже код работает

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

И поставляет это:

-------------------
|DescribeInstances|
+-----------------+
|  Name1          |
|  Name2          |
+-----------------+

Однако, если я хочу добавить состояние, все будет не так, как я ожидал. Использование

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

Обеспечивает

-------------------
|DescribeInstances|
+-----------------+
|  Name1          |
|  stopped        |
|  Name2          |
|  stopped        |
+-----------------+

вместо двух столбцов с именем и состоянием.

Если мы переведем вывод в JSON, мы увидим, что выбор тегов возвращает список (список из одного элемента) и, вероятно, проблема:

[
    [
        [
            "Name1"
        ],
        "stopped"
    ],
    [
        [
            "Name2"
        ],
        "stopped"
    ]
]

Я не смог превратить этот список в скаляр, выбрав первый элемент. Это не работает. Возвращает пустой список в качестве имени.

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

То же, что и этот

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

Единственный способ, с помощью которого я понял это, - это функция соединения. Поскольку я ожидаю только один элемент, это нормально, но я, кажется, немного взломан.

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

---------------------------
|    DescribeInstances    |
+-------------+-----------+
|  Name1      |  stopped  |
|  Name2      |  stopped  |
+-------------+-----------+

Таким образом, возникает вопрос: существует ли способ выбора первого элемента результата фильтра (?Key==XXXX) с учетом того, что суффикс его с [0] кажется неработоспособным?

Спасибо заранее!

4b9b3361

Ответ 1

Таким образом, возникает вопрос: существует ли способ выбора первого элемента результата фильтра (? Key == XXXX) с учетом того, что суффикс его с [0], похоже, не работает?

Как вы сформулировали этот вопрос, на самом деле намекает на решение, а именно Выражения труб (доступно только с версии 1.3.7 aws-cli, поэтому невозможно определить время вопроса):

pipe-expression  = expression "|" expression

Выражение трубы объединяет два выражения, разделенные символом | персонаж. Это похоже на подвыражение с двумя важными различия:

  • Любое выражение можно использовать с правой стороны. Суб-выражение ограничивает тип выражения, которое можно использовать в правой части сторона.
  • Трубное выражение останавливает проекции с левой стороны для распространения в правой части. Если левое выражение создает проекции, это не относится к правой стороне.

Подчеркнутая часть является ключевой, как показано в последующих примерах, в частности:

Если вам нужен только первый дополнительный список, [ "first1", "second1" ], вы можете использовать выражение pipe:

foo[*].bar[0] -> ["first1", "first2"]
foo[*].bar | [0] -> ["first1", "second1"]

Решение

Таким образом, применение выражения pipe дает желаемый результат:

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

----------------------------------
|        DescribeInstances       |
+--------------------+-----------+
|  Name1             |  stopped  |
|  Name2             |  stopped  |
+--------------------+-----------+

Ответ 2

Он сообщает идентификатор экземпляра вместе с состоянием сервера

Command:
aws ec2 describe-instances --filter Name=tag:Name,Values=eep --query 'Reservations[*].Instances[*].{id:State,ID:InstanceId}' --output table

Query part in the above command
It changes as per the requirement
--query 'Reservations[*].Instances[*].{id:State,ID:InstanceId}' --output table

Ответ 3

#!/bin/bash
for r in 'aws ec2 describe-regions --query Regions[*].RegionName --output text'
do

    #echo $r
    aws ec2 describe-instances --region $r --query 'Reservations[*].Instances[*].{ID:InstanceId, type:InstanceType, launched:LaunchTime, name:Tags[?Key=='Name'].Value[]}' --output json | jq --arg R $r -r '.[] | .[] | [$R, .ID, .type, .launched, .name[0]] | @csv'

done

Выход:

"us-east-1","i-054f8253b9ed0746d","t2.micro","2018-10-31T01:57:52.000Z","xxx"
"us-east-1","i-0638792b8b3057ce2","t2.nano","2018-10-23T03:49:24.000Z","yyy"