AWS CLI:如何查询列表值?

15

aws cli有一个--query选项,它允许您仅选择一些信息。

例如,我只对从ec2 describe-instances中获取安全组名称感兴趣。如果我运行:

aws ec2 describe-instances --output text --query 'Reservations[*].Instances[*].[InstanceId,InstanceType,SecurityGroups]

我的输出看起来像:

i-xxxxxxx m1.type [{u'GroupName': 'groupName', u'GroupId': 'sg-xxxxx'}]

我也可以通过索引访问列表中的元素:

aws ec2 describe-instances --output text --query 'Reservations[*].Instances[*].[InstanceId,InstanceType,Tags[0].Value,Tags[0].Name]

是否有可能查询标签,以便我可以根据指定的名称搜索标签,而不是使用Tag[0]这样的方式?


你不能直接从输出中提取吗? - Andrey
@Andrey:我希望查询中有类似SecurityGroups{Name=Foo}的东西。另一种选择是使用json格式并将其传输到jq,但我想先确定我没有遗漏任何东西。 - chris
为什么要使用两个工具,如果一个工具就可以完成呢? - chris
因为你所说的只是美好的完美主义口号,而实际上你只需要事情完成。因为你已经花费了更多的时间来解决问题,然后只是把它们扔进 jb 中。这实际上非常符合 Unix 的方式,编写更简单的应用程序并将它们组合起来:http://en.wikipedia.org/wiki/Unix_philosophy - Andrey
2
我明白,但我正在尝试了解本地命令行工具的功能 - 是否有一种方法可以引用列表项的属性?您可以引用结构的属性并从列表中选择项目,但是否可能将两者结合起来? - chris
显示剩余2条评论
4个回答

15

从1.3.0开始,您现在可以像这样查询该信息:

 --query 'Reservations[*].Instances[*].Tags[?Key==`<keyname>`].Value[]'

所以你有这个:

      "Tags" : [
        {
          "Value" : "webserver01",
          "Key" : "InstanceName"
        },

您会想要这样做:

aws ec2 describe-instances --query 'Reservations[*].Instances[*].Tags[?Key==`InstanceName`].Value[]'

1
嗯...不成功,我得到了一些空结果而不是值[ [], [], [] ... ]。我使用的版本是aws-cli/1.7.3 Python/2.7.9 Windows/7。 - sonjz
1
解决了,这与PowerShell如何对其进行编码有关,如果我使用双引号:aws ec2 describe-instances --query "Reservations[].Instances[].Tags[?Key==InstanceName].Value[]"。请注意,需要使用双重重音符进行转义。 - sonjz
1
如果查询在双引号内,则可以使用单引号代替反引号: aws ec2 describe-subnets --query "Subnets[*].[AvailabilityZone,SubnetId,CidrBlock,Tags[?Key=='Name'].Value[]]" - David Cobb

3
您可能想使用的是 --filters 选项:
aws ec2 describe-instances --output text --filters "Name=tag-key, Values=SecurityGroups, Name=tag-value, Values=Foo" --region us-east-1

你可以更改过滤器以“查询”您要查找的确切字段。
请查看这个slideshare,来自亚特兰大AWS meetup小组关于新AWS CLI的讲座,获取更多示例。

0
select security_groups from aws.aws_ec2_instance;

> select security_groups from aws.aws_ec2_instance limit 1;
+---------------------------------------------------------------------------------------------------------------------------------+
|                                                         security_groups                                                         |
+---------------------------------------------------------------------------------------------------------------------------------+
| [{"GroupId":"sg-xxxx","GroupName":"xxxx"},{"GroupId":"sg-xxxxxx","GroupName":"xxxx"}] |
+---------------------------------------------------------------------------------------------------------------------------------+

这将只列出您实例的安全组。

您还可以使用

select security_groups from aws.aws_ec2_instance where instance_id = 'i-xxxxxx';


0
这是我的解决方法:(仅适用于1.3.0及以上版本)
aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId, Tags[?Key==`Name`].Value[*]]'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接