如何使用AWS CLI获取最近启动的EC2实例?

时间:2019-03-21 16:01:31

标签: amazon-web-services amazon-ec2 aws-cli

我当前正在使用以下CLI命令来获取给定实例 Name 标签'myInstanceName'的实例 PublicIPAddress LaunchTime

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实例。可以使用两种不同的方法来解决该问题,请在下面回答:
Parsing Result with jq
Using JMESPath

请参阅此related question,以获取使用JMESPath按日期进行的更一般的排序以及进一步的阅读。

2 个答案:

答案 0 :(得分:6)

这是一种用于查找最新启动的实例并显示有关它的数据的方法:

var jsonData = JSON.parse(responseBody);
var schema = {...contains multiple error}
var results = tv4.validateMultiple(jsonData, schema);

if(results.valid){
    pm.test('Response has valid schema') = true;

} else {
    for (var i = 0; i < results.errors.length; i++) {
        pm.test("Contract: JSON Response has invalid schema in path [" + results.errors[i].dataPath + " | " + results.errors[i]); 
    }
}

aws ec2 describe-instances --query 'sort_by(Reservations[].Instances[], &LaunchTime)[:-1].[InstanceId,PublicIpAddress,LaunchTime]' 将返回上一次启动的实例。然后从这些实例中检索字段。

要了解这种乐趣,请参阅:

答案 1 :(得分:5)

尝试使用jq实用程序。这是一个命令行JSON解析器。如果您不熟悉它,那么我建议您试用jq playground

首先将awcli结果平坦化,如下所示:

<?php
//Including Database configuration file.
include "db.php";
//Getting value of "search" variable from "script.js".
if (isset($_GET['search'])) {
//Search box value assigning to $Name variable.
$Name = $_GET['search'];
//Search query.
$Query = "SELECT Name FROM search WHERE Name LIKE '$Name%' LIMIT 5";
//Query execution
$ExecQuery = MySQLi_query($con, $Query);
//Creating unordered list to display result.
    if ($ExecQuery->num_rows > 0) {
          echo "<ul>";
          while ($Result = MySQLi_fetch_array($ExecQuery)) {
            echo "<li onclick='fill".$Result['Name']."'>".$Result['Name']." 
     </li>";
     }
    echo "</ul>";
   }
  }
 die();
?>

请注意,为简洁起见,我将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" } ] 中,并按降序排列jqtm的别名)进行排序,如下所示:

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"
}