Как получить последний запущенный экземпляр EC2 с AWS CLI? - PullRequest
2 голосов
/ 21 марта 2019

В настоящее время я использую следующую команду CLI для получения экземпляра PublicIPAddress и LaunchTime для данного экземпляра Name tag, 'myInstanceName':

aws ec2 describe-instances --filters 'Name=tag:Name,Values=myInstanceName' \ 
    --region us-east-1 \
    --query 'Reservations[*].Instances[*].{PublicIpAddress: PublicIpAddress, LaunchTime: LaunchTime}'

Это приводит к следующему:

[
    {
        "LaunchTime": "2019-01-25T11:49:06.000Z",
        "PublicIpAddress": "11.111.111.11"
    }
]

Это нормально, но если есть два экземпляра с одинаковым именем, я получу два результата в моем результате JSON.Мне нужно найти способ получить самый последний экземпляр для данного имени.

Обновление решения

Этот вопрос довольно специфичен для экземпляров EC2.Проблема может быть решена с помощью двух различных методов, ответ на которые приведен ниже:
Результат анализа с помощью jq
Использование JMESPath

Пожалуйста, посмотрите это relatedвопрос для более общей сортировки по дате с помощью JMESPath и для дальнейшего чтения.

Ответы [ 2 ]

6 голосов
/ 22 марта 2019

Вот метод для поиска последнего запущенного экземпляра и отображения данных о нем:

aws ec2 describe-instances  --query 'sort_by(Reservations[].Instances[], &LaunchTime)[:-1].[InstanceId,PublicIpAddress,LaunchTime]'

sort_by(Reservations[].Instances[], &LaunchTime)[:-1] вернет последний запущенный экземпляр. Затем поля извлекаются из этих экземпляров.

Чтобы понять этот тип веселья, см .:

6 голосов
/ 21 марта 2019

Попробуйте использовать утилиту jq .Это анализатор командной строки JSON.Если вы не знакомы с ним, я бы порекомендовал jq площадку для экспериментов.

Сначала сгладьте результаты awcli следующим образом:

aws ec2 describe-instances  \
    --query 'Reservations[].Instances[].{ip: PublicIpAddress, tm: LaunchTime}' \
    --filters 'Name=tag:Name,Values= myInstanceName'

Примечаниечто я использовал псевдоним от LaunchTime до tm для краткости.Это приведет к (несортированному) выводу, подобному следующему:

[
  {
    "ip": "54.4.5.6",
    "tm": "2019-01-04T19:54:11.000Z"
  },
  {
    "ip": "52.1.2.3",
    "tm": "2019-03-04T20:04:00.000Z"
  }
]

Затем перенаправьте этот результат в jq и отсортируйте по убыванию tm (псевдоним для LaunchTime) следующим образом:

jq 'sort_by(.tm) | reverse'

Это приведет к выводу, подобному этому:

[
  {
    "ip": "52.1.2.3",
    "tm": "2019-03-04T20:04:00.000Z"
  },
  {
    "ip": "54.4.5.6",
    "tm": "2019-01-04T19:54:11.000Z"
  }
]

Наконец, используйте jq, чтобы отфильтровать все, кроме первого результата, следующим образом:

jq 'sort_by(.tm) | reverse | .[0]'

Это даст один результат, самый последний запущенный экземпляр:

{
  "ip": "52.1.2.3",
  "tm": "2019-03-04T20:04:00.000Z"
}

Собрав все вместе, последняя команда:

aws ec2 describe-instances  \
    --query 'Reservations[].Instances[].{ip: PublicIpAddress, tm: LaunchTime}' \
    --filters 'Name=tag:Name,Values= myInstanceName' | \
    jq 'sort_by(.tm) | reverse | .[0]'
...