按标签名称对 EC2 实例排序

Sort EC2 Instances by Tag Name

因此,除了 jq 工具之外,我还使用 aws cli 来检索实例列表。我使用以下命令执行此操作。

aws ec2 describe-instances | jq '.Reservations[].Instances[]'

用下面的例子json响应。

{
    "Reservations": [
        {
            "OwnerId": "1234", 
            "ReservationId": "r-124991k", 
            "Groups": [], 
            "Instances": [
                {
                    "Monitoring": {
                        "State": "disabled"
                    }, 
                    "PublicDnsName": "", 
                    "State": {
                        "Code": 16, 
                        "Name": "running"
                    }, 
                    "EbsOptimized": false, 
                    "LaunchTime": "2015-07-31T16:48:01.000Z", 
                    "PrivateIpAddress": "11.123.104.123", 
                    "ProductCodes": [], 
                    "VpcId": "vpc-sdfsdf9109", 
                    "StateTransitionReason": "", 
                    "InstanceId": "i-1223421", 
                    "ImageId": "ami-aklasd131", 
                    "PrivateDnsName": "private.dns.name", 
                    "KeyName": "testkey", 
                    "SecurityGroups": [
                        {
                            "GroupName": "secur-grou", 
                            "GroupId": "sg-a3d234a"
                        }
                    ], 
                    "ClientToken": "", 
                    "SubnetId": "subnet-57absfsdf", 
                    "InstanceType": "m3.large", 
                    "NetworkInterfaces": [
                        {
                            "Status": "in-use", 
                            "MacAddress": "12:c3:f2:5c:5f:4d", 
                            "SourceDestCheck": false, 
                            "VpcId": "vpc-sdfsdf9109", 
                            "Description": "", 
                            "NetworkInterfaceId": "eni-81b1234", 
                            "PrivateIpAddresses": [
                                {
                                    "Primary": true, 
                                    "PrivateIpAddress": "11.123.104.123"
                                }
                            ], 
                            "Attachment": {
                                "Status": "attached", 
                                "DeviceIndex": 0, 
                                "DeleteOnTermination": true, 
                                "AttachmentId": "eni-attach-5asdf234", 
                                "AttachTime": "2015-07-30T16:10:39.000Z"
                            }, 
                            "Groups": [
                                {
                                    "GroupName": "secur-grou", 
                                    "GroupId": "sg-a3d234a"
                                }
                            ], 
                            "SubnetId": "subnet-57absfsdf", 
                            "OwnerId": "1234", 
                            "PrivateIpAddress": "11.123.104.123"
                        }
                    ], 
                    "SourceDestCheck": false, 
                    "Placement": {
                        "Tenancy": "default", 
                        "GroupName": "", 
                        "AvailabilityZone": "us-east-1c"
                    }, 
                    "Hypervisor": "xen", 
                    "BlockDeviceMappings": [
                        {
                            "DeviceName": "/dev/sda1", 
                            "Ebs": {
                                "Status": "attached", 
                                "DeleteOnTermination": true, 
                                "VolumeId": "vol-28c882", 
                                "AttachTime": "2015-07-30T16:10:43.000Z"
                            }
                        }, 
                        {
                            "DeviceName": "/dev/sdb", 
                            "Ebs": {
                                "Status": "attached", 
                                "DeleteOnTermination": true, 
                                "VolumeId": "vol-3f1d5", 
                                "AttachTime": "2015-07-30T16:10:43.000Z"
                            }
                        }, 
                        {
                            "DeviceName": "/dev/sdg", 
                            "Ebs": {
                                "Status": "attached", 
                                "DeleteOnTermination": true, 
                                "VolumeId": "vol-81c8b", 
                                "AttachTime": "2015-07-30T16:10:43.000Z"
                            }
                        }
                    ], 
                    "Architecture": "x86_64", 
                    "RootDeviceType": "ebs", 
                    "RootDeviceName": "/dev/sda1", 
                    "VirtualizationType": "hvm", 
                    "Tags": [
                        {
                            "Value": "apple", 
                            "Key": "Name"
                        }, 
                        {
                            "Value": "tag", 
                            "Key": "extra"
                        }
                    ], 
                    "AmiLaunchIndex": 0
                }
            ]
        }, 
        {
            "OwnerId": "1234", 
            "ReservationId": "r-2a72342", 
            "Groups": [], 
            "Instances": [
                {
                    "Monitoring": {
                        "State": "disabled"
                    }, 
                    "PublicDnsName": "", 
                    "State": {
                        "Code": 16, 
                        "Name": "running"
                    }, 
                    "EbsOptimized": false, 
                    "LaunchTime": "2015-07-31T16:48:01.000Z", 
                    "PrivateIpAddress": "11.123.104.83", 
                    "ProductCodes": [], 
                    "VpcId": "vpc-sdfsdf9109", 
                    "StateTransitionReason": "", 
                    "InstanceId": "i-f9271451", 
                    "ImageId": "ami-aklasd131", 
                    "PrivateDnsName": "private.name.here", 
                    "KeyName": "testkey", 
                    "SecurityGroups": [
                        {
                            "GroupName": "secur-grou", 
                            "GroupId": "sg-a3d234a"
                        }
                    ], 
                    "ClientToken": "", 
                    "SubnetId": "subnet-5llqjwdf", 
                    "InstanceType": "m3.large", 
                    "NetworkInterfaces": [
                        {
                            "Status": "in-use", 
                            "MacAddress": "12:ea:06:8b:ff:86", 
                            "SourceDestCheck": false, 
                            "VpcId": "vpc-sdfsdf9109", 
                            "Description": "", 
                            "NetworkInterfaceId": "eni-82kjs91", 
                            "PrivateIpAddresses": [
                                {
                                    "Primary": true, 
                                    "PrivateIpAddress": "11.123.104.13"
                                }
                            ], 
                            "Attachment": {
                                "Status": "attached", 
                                "DeviceIndex": 0, 
                                "DeleteOnTermination": true, 
                                "AttachmentId": "eni-attach-35312341", 
                                "AttachTime": "2015-07-30T17:29:00.000Z"
                            }, 
                            "Groups": [
                                {
                                    "GroupName": "secur-grou", 
                                    "GroupId": "sg-a3d234a"
                                }
                            ], 
                            "SubnetId": "subnet-57absfsdf", 
                            "OwnerId": "1234", 
                            "PrivateIpAddress": "11.123.104.83"
                        }
                    ], 
                    "SourceDestCheck": false, 
                    "Placement": {
                        "Tenancy": "default", 
                        "GroupName": "", 
                        "AvailabilityZone": "us-east-1c"
                    }, 
                    "Hypervisor": "xen", 
                    "BlockDeviceMappings": [
                        {
                            "DeviceName": "/dev/sda1", 
                            "Ebs": {
                                "Status": "attached", 
                                "DeleteOnTermination": true, 
                                "VolumeId": "vol-ee1c21", 
                                "AttachTime": "2015-07-30T17:29:02.000Z"
                            }
                        }, 
                        {
                            "DeviceName": "/dev/sdb", 
                            "Ebs": {
                                "Status": "attached", 
                                "DeleteOnTermination": true, 
                                "VolumeId": "vol-13awer", 
                                "AttachTime": "2015-07-30T17:29:02.000Z"
                            }
                        }, 
                        {
                            "DeviceName": "/dev/sdg", 
                            "Ebs": {
                                "Status": "attached", 
                                "DeleteOnTermination": true, 
                                "VolumeId": "vol-3111", 
                                "AttachTime": "2015-07-30T17:29:02.000Z"
                            }
                        }
                    ], 
                    "Architecture": "x86_64", 
                    "RootDeviceType": "ebs", 
                    "RootDeviceName": "/dev/sda1", 
                    "VirtualizationType": "hvm", 
                    "Tags": [
                        {
                            "Value": "banana", 
                            "Key": "Name"
                        }, 
                        {
                            "Value": "tag", 
                            "Key": "extra"
                        }
                    ], 
                    "AmiLaunchIndex": 0
                }
            ]
        }
    ]
}

但对于返回的实例,我希望它们按标签名称排序。我尝试了以下方法。

jq '.Reservations[]|=sort_by(.Instances[].Tags[.Key="Name"].Value)'

但是 jq 抱怨有几条错误消息。有没有一种简单的方法可以按名称标签对 json 进行排序,然后按该排序顺序获取 PrivateDNS 条目?

好的,我不确定我是否理解你想要的。这就是我认为你要求的;如果我错了请纠正我:

In each Reservation, I want the Instances inside to be sorted by the Value of the Tag whose Key is "Name"

这就是解决该问题的方法:

jq '.Reservations[].Instances |= sort_by(.Tags[] | select(.Key == "Name").Value)'

或者,您可能会要求:

I want the Reservations to be sorted by the Value of the Tag whose Key is "Name" inside the Instances.

可以这样解决:

jq '.Reservations |= sort_by(.Instances[].Tags[] | select(.Key == "Name").Value)'

(如果 Reservation 中有多个 Instances,此脚本的行为可能毫无意义)

关于获取私有 DNS 值,只有 select 那些具有类似内容的值:

.Reservations[].Instances[].PrivateDnsName

您也可以在排序脚本之后通过管道传输它。