当这些属性处于同一级别时,aws cli 查询多个属性

era*_*amm 6 amazon-ec2 amazon-web-services aws-cli jmespath aws-security-group

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

aws ec2 describe-network-interfaces --filters Name=group-id,Values=sg-123456 --output json
Run Code Online (Sandbox Code Playgroud)

这返回(部分输出)

{
    "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"
                }
            ],
Run Code Online (Sandbox Code Playgroud)

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

--query 'NetworkInterfaces[*].Attachment.InstanceId'
Run Code Online (Sandbox Code Playgroud)

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

--query 'NetworkInterfaces[*].Groups[*].GroupId'
Run Code Online (Sandbox Code Playgroud)

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

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

以下内容无效:

--query 'NetworkInterfaces[*].Attachment.InstanceId','NetworkInterfaces[*].Groups[*].GroupName'
Run Code Online (Sandbox Code Playgroud)

β.ε*_*.βε 5

您当然可以,您必须使用 JMESPath 在示例中描述的过滤器和多选哈希

这样,您可以通过沿着树向下查询来重新创建一个对象。

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

NetworkInterfaces[*].{ 
  InstanceId: Attachment.InstanceId, 
  GroupNames: Groups[*].GroupName 
}
Run Code Online (Sandbox Code Playgroud)

和 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"
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

它给:

[
  {
    "InstanceId": "i-12345678",
    "GroupNames": [
      "sg-number1",
      "sg-number_2"
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

所以你的命令最终是:

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