user2649640
user2649640

Reputation: 13

Sort EC2 Instances by Tag Name

So I'm using the aws cli to retrieve a list of instances in addition to the jq tool. I do so with the following command.

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

With the following example json response.

{
    "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
                }
            ]
        }
    ]
}

But for the instances that are returned I would like them to be sorted by their Tag Name. I've tried the following.

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

But jq complains with several error messages. Is there an easy way to sort the json by Name tag and then get the PrivateDNS entry in that sorted order?

Upvotes: 1

Views: 1520

Answers (1)

user3899165
user3899165

Reputation:

Okay, I'm not sure if I understood what you want. This is what I think you are asking for; please correct me if I'm wrong:

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

And this is what would solve that problem:

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

Alternatively, you may be asking for this:

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

Which would be solved by this:

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

(The behavior of this script is probably meaningless if there are several Instances in a Reservation)

As of getting the private DNS values out, just select those with something like:

.Reservations[].Instances[].PrivateDnsName

You can also pipe that after the sorting script.

Upvotes: 2

Related Questions