首页 > 解决方案 > 当这些属性在同一级别时,aws cli 查询多个属性

问题描述

我正在使用以下内容查找有关与特定安全组关联的实例的信息

aws ec2 describe-network-interfaces --filters Name=group-id,Values=sg-123456 --output json

这返回(部分输出)

{
    "NetworkInterfaces": [
        {
            "Attachment": {
                "AttachTime": "2019-10-09T07:15:44+00:00",
                "AttachmentId": "eni-attach-01234567",
                "InstanceId": "i-12345678",
                "InstanceOwnerId": "123456789",
                "Status": "attached"
            },
            "AvailabilityZone": "us-east-1c",
            "Description": "Primary network interface",
            "Groups": [
                {
                    "GroupName": "sg-number1",
                    "GroupId": "sg-123456"
                },
                {
                    "GroupName": "sg-number_2",
                    "GroupId": "sg-654321"
                }
            ],

如果我只想获取实例 ID,那么我可以使用 --query 并沿着树向下走

--query 'NetworkInterfaces[*].Attachment.InstanceId'

我也可以做类似的事情来获得所有 SG

--query 'NetworkInterfaces[*].Groups[*].GroupId'

我的问题是如何在一个查询中获取 InstanceID 和 Group.GroupName ?

或者当这些属性处于同一级别时,如何更好地查询多个属性?

以下没有工作:

--query 'NetworkInterfaces[*].Attachment.InstanceId','NetworkInterfaces[*].Groups[*].GroupName'

标签: amazon-web-servicesamazon-ec2aws-cliaws-security-groupjmespath

解决方案


您当然可以,您将不得不使用示例中描述的 JMESPath 作为过滤器和多选哈希

有了这个,您可以重新创建一个对象,查询顺着树向下。

在您的情况下,使用以下查询:

NetworkInterfaces[*].{ InstanceId: Attachment.InstanceId, GroupNames: Groups[*].GroupName }

和 JSON 数据:

{
    "NetworkInterfaces": [
        {
            "Attachment": {
                "AttachTime": "2019-10-09T07:15:44+00:00",
                "AttachmentId": "eni-attach-01234567",
                "InstanceId": "i-12345678",
                "InstanceOwnerId": "123456789",
                "Status": "attached"
            },
            "AvailabilityZone": "us-east-1c",
            "Description": "Primary network interface",
            "Groups": [
                {
                    "GroupName": "sg-number1",
                    "GroupId": "sg-123456"
                },
                {
                    "GroupName": "sg-number_2",
                    "GroupId": "sg-654321"
                }
            ]
        }
    ]
}

它给:

[
  {
    "InstanceId": "i-12345678",
    "GroupNames": [
      "sg-number1",
      "sg-number_2"
    ]
  }
]

所以你的命令最终是:

aws ec2 describe-network-interfaces --filters Name=group-id,Values=sg-123456 --output json --query 'NetworkInterfaces[*].{ InstanceId: Attachment.InstanceId, GroupNames: Groups[*].GroupName }'

推荐阅读