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

x3n*_*r0s 3 amazon-ec2 amazon-web-services aws-cli

我当前正在使用以下CLI命令来获取给定实例名称标签“ myInstanceName” 的实例PublicIPAddressLaunchTime

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

结果如下:

[
    {
        "LaunchTime": "2019-01-25T11:49:06.000Z",
        "PublicIpAddress": "11.111.111.11"
    }
]
Run Code Online (Sandbox Code Playgroud)

很好,但是如果有两个具有相同名称的实例,我将在结果JSON中得到两个结果。我需要找到一种获取给定名称的最新实例的方法。

解决方案更新

这个问题是EC2实例特有的。可以使用两种不同的方法来解决该问题,下面对此进行回答:使用JMESPath
使用jq解析结果

请参阅此相关问题,以获取按日期对JMESPath进行更一般的排序以及进一步阅读的信息。

jar*_*mod 7

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

首先展平awcli结果,如下:

aws ec2 describe-instances  \
    --query 'Reservations[].Instances[].{ip: PublicIpAddress, tm: LaunchTime}' \
    --filters 'Name=tag:Name,Values= myInstanceName'
Run Code Online (Sandbox Code Playgroud)

请注意,我别名LaunchTimetm为简洁。这将导致(未排序的)输出,如下所示:

[
  {
    "ip": "54.4.5.6",
    "tm": "2019-01-04T19:54:11.000Z"
  },
  {
    "ip": "52.1.2.3",
    "tm": "2019-03-04T20:04:00.000Z"
  }
]
Run Code Online (Sandbox Code Playgroud)

接下来,将此结果jq通过管道传递并按降序排序tm(的别名LaunchTime),如下所示:

jq 'sort_by(.tm) | reverse'
Run Code Online (Sandbox Code Playgroud)

这将导致如下输出:

[
  {
    "ip": "52.1.2.3",
    "tm": "2019-03-04T20:04:00.000Z"
  },
  {
    "ip": "54.4.5.6",
    "tm": "2019-01-04T19:54:11.000Z"
  }
]
Run Code Online (Sandbox Code Playgroud)

最后,使用jq过滤掉除第一个结果以外的所有结果,如下所示:

jq 'sort_by(.tm) | reverse | .[0]'
Run Code Online (Sandbox Code Playgroud)

这将产生一个结果,即最近启动的实例:

{
  "ip": "52.1.2.3",
  "tm": "2019-03-04T20:04:00.000Z"
}
Run Code Online (Sandbox Code Playgroud)

放在一起,最后的命令是:

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


Joh*_*ein 6

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

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

sort_by(Reservations[].Instances[], &LaunchTime)[:-1]将返回最后启动的实例。然后从这些实例中检索字段。

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