aws cli ec2 描述实例 table 输出

aws cli ec2 describe-instances table output

我想要 运行 ec2 describe-instances 命令并以 table 格式获得如下输出(其中名称是带有键 '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 table 而不是 --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

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

需要使用管道表达式过滤Tag结果,得到第一个值如:

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

这里有一个不错的相关博客 post:Get a list of instance with id, name and type

这是一个 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  )

然后您可以将输出稍微操纵为 select 仅 运行 个实例并放入格式正确的列列表:

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

最后一点,正如我所说的,我是 Volkan 提供的 one liner 的粉丝。我只是想知道如何操作列排序。我发现 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