aws cli ec2 describe-instances表输出

时间:2015-10-29 11:19:45

标签: amazon-web-services amazon-ec2 command-line-interface

我想运行ec2 describe-instances命令并以表格格式获取输出,如下所示(其中name是带键的标记的值'名称'):

----------------------------------------------------------
|                    DescribeInstances                   |
+-------------+----------------+--------------+----------+
| instance_id |  ip_address    |    name      |  state   |
+-------------+----------------+--------------+----------+
|  i-g93g494d |  99.99.99.01   |  name1       |  running |
|  i-a93f754c |  99.99.99.02   |  name2       |  running |
+-------------+----------------+--------------+----------+

我可以运行以下命令:

aws ec2 describe-instances --instance-ids i-g93g494d i-a93f754c --query "Reservations[*].Instances[*].{name: Tags[?Key=='Name'].Value, instance_id: InstanceId, ip_address: PrivateIpAddress, state: State.Name}" --output json

并获得输出:

[
    [
        {
            "instance_id": "i-g93g494d",
            "state": "running",
            "ip_address": "99.99.99.01",
            "name": [
                "name1"
            ]
        }
    ],
    [
        {
            "instance_id": "i-a93f754c",
            "state": "running",
            "ip_address": "99.99.99.02",
            "name": [
                "name2"
            ]
        }
    ]
]

但是,当我使用--output表而不是--output json运行相同的命令时,我收到错误。

命令:

aws ec2 describe-instances --instance-ids i-g93g494d i-a93f754c --query "Reservations[*].Instances[*].{name: Tags[?Key=='Name'].Value, instance_id: InstanceId, ip_address: PrivateIpAddress, state: State.Name}" --output json

输出:

list index out of range

我希望表格输出看起来像上面的例子,但我很难解决这个问题。我非常感谢任何人可以提供的任何帮助。

2 个答案:

答案 0 :(得分:14)

您需要使用管道表达式来过滤标记结果并获取第一个值,例如:

aws ec2 describe-instances --instance-ids i-g93g494d i-a93f754c --query "Reservations[*].Instances[*].{name: Tags[?Key=='Name'] | [0].Value, instance_id: InstanceId, ip_address: PrivateIpAddress, state: State.Name}" --output table

这里有一篇很好的相关博文:Get a list of instance with id, name and type

答案 1 :(得分:1)

这是一个python程序,可用于从descibe-instances命令生成列表:

import json
import sys

with open( sys.argv[1] ) as f:
  aws = json.load( f ) 
  Reservations = aws['Reservations']
  for Reservation in Reservations:
    Instances = Reservation['Instances']
    for Instance in Instances:
      Tags = Instance['Tags']
      for Tag in Tags:
        if Tag['Key'] == "Name":
          print Tag['Value'],Instance['PrivateIpAddress'],Instance['InstanceId'],Instance['State']['Name']

顺便说一句,我绝对喜欢沃尔坎·帕克索伊(Volkan Paksoy)的回答。这就是我的招数。上面的python可能具有使您的搜索条件更具表现力或以某种方式组合结果的优势。简而言之,它是python,您无需弄清楚如何使用aws语法。

以下是调用上述python脚本的方法:

python parse.py  <( aws ec2 describe-instances  )

当然,您的里程可能会有所不同。例如,您可能没有默认使用区域,因此,您可能需要添加一个额外的参数,如下所示:

python parse.py  <( aws ec2 --region us-east-2 describe-instances  )

然后,您可以对输出进行一些操作,以仅选择正在运行的实例并放入格式正确的列列表中:

python parse.py  <( aws ec2 --region us-east-2 describe-instances  ) | column -t | sort -k1,1 | cat -n  | grep running  

最后一点,正如我所说,我是Volkan提供的一种衬垫的粉丝。我只是想知道如何可以操纵列排序。我发现aws按字母顺序对列进行排序。为了使排序更明显,我在属性名称前添加了数字。但是,这些属性名称未正确解释为标识符,因此我必须用双引号将它们引起来。这就是我要解决的问题,请注意细微的引用更改(而不是'Name'周围的细微引用):

aws ec2 describe-instances  --query 'Reservations[*].Instances[*].{"01-name": Tags[?Key=='"'Name'"'] | [0].Value, "03-instance_id": InstanceId, "02-ip_address": PrivateIpAddress, "04-state" : State.Name}' --output table