0

I am relatively new to JavaScript.

I am trying to extract specific information from AWS about my EC2 instances using describeInstances. Specifically, I want to be able to provide a list of InstanceIds and extract from the resulting object the value of the Tags with Key: "Name". Here is the base code:

// Load the SDK for JavaScript
var AWS = require('aws-sdk');

// Load credentials and set region from JSON file
AWS.config.loadFromPath('./.aws/config.json');

// Create EC2 service object
var ec2 = new AWS.EC2({apiVersion: '2016-11-15'});

var params = {
  DryRun: false,
  InstanceIds: ['i-0be50217a4028a044', 'i-08b83c1c428e9a1d2']
};

ec2.describeInstances(params, function(err, data) {
  if (err) {
    console.log("Error", err.stack);
  } else {
    console.log("Success", JSON.stringify(data));
  }
});

Upon running this code, a large, hairy, and nested object is returned. The JSON.stringify() version of this is shown here:

{
    "Reservations": [{
        "ReservationId": "r-04e32387e546387ba",
        "OwnerId": "543800113692",
        "Groups": [],
        "Instances": [{
            "InstanceId": "i-08b83c1c428e9a1d2",
            "ImageId": "ami-8aa998ea",
            "State": {
                "Code": 16,
                "Name": "running"
            },
            "PrivateDnsName": "ip-10-77-113-210.us-west-2.compute.internal",
            "PublicDnsName": "ec2-35-165-200-222.us-west-2.compute.amazonaws.com",
            "StateTransitionReason": "",
            "KeyName": "Security1",
            "AmiLaunchIndex": 0,
            "ProductCodes": [],
            "InstanceType": "t2.micro",
            "LaunchTime": "2017-02-14T14:59:11.000Z",
            "Placement": {
                "AvailabilityZone": "us-west-2b",
                "GroupName": "",
                "Tenancy": "default"
            },
            "Monitoring": {
                "State": "disabled"
            },
            "SubnetId": "subnet-228da755",
            "VpcId": "vpc-af0f0dca",
            "PrivateIpAddress": "10.77.113.210",
            "PublicIpAddress": "35.165.200.222",
            "Architecture": "x86_64",
            "RootDeviceType": "ebs",
            "RootDeviceName": "/dev/sda1",
            "BlockDeviceMappings": [{
                "DeviceName": "/dev/sda1",
                "Ebs": {
                    "VolumeId": "vol-00e55d6bf114bfcaa0",
                    "Status": "attached",
                    "AttachTime": "2017-02-09T15:37:34.000Z",
                    "DeleteOnTermination": true
                }
            }],
            "VirtualizationType": "hvm",
            "ClientToken": "vOiiS1486654656072",
            "Tags": [{
                "Key": "Name",
                "Value": "Fenris"
            }],
            "SecurityGroups": [{
                "GroupName": "launch-wizard-2",
                "GroupId": "sg-2312072c"
            }],
            "SourceDestCheck": true,
            "Hypervisor": "xen",
            "EbsOptimized": false
        }]
    }, {
        "ReservationId": "r-0bbcb12e5c1162c23",
        "OwnerId": "543800113692",
        "Groups": [],
        "Instances": [{
            "InstanceId": "i-0be50217a40028a044",
            "ImageId": "ami-8ba011ea",
            "State": {
                "Code": 80,
                "Name": "stopped"
            },
            "PrivateDnsName": "ip-10-77-118-17.us-west-2.compute.internal",
            "PublicDnsName": "",
            "StateTransitionReason": "User initiated (2016-12-05 16:49:45 GMT)",
            "KeyName": "Security3",
            "AmiLaunchIndex": 0,
            "ProductCodes": [],
            "InstanceType": "t2.medium",
            "LaunchTime": "2016-12-02T15:50:08.000Z",
            "Placement": {
                "AvailabilityZone": "us-west-2b",
                "GroupName": "",
                "Tenancy": "default"
            },
            "Monitoring": {
                "State": "disabled"
            },
            "SubnetId": "subnet-228da700",
            "VpcId": "vpc-af0f1ccb",
            "PrivateIpAddress": "10.77.118.17",
            "StateReason": {
                "Code": "Client.UserInitiatedShutdown",
                "Message": "Client.UserInitiatedShutdown: User initiated shutdown"
            },
            "Architecture": "x86_64",
            "RootDeviceType": "ebs",
            "RootDeviceName": "/dev/sda1",
            "BlockDeviceMappings": [{
                "DeviceName": "/dev/sda1",
                "Ebs": {
                    "VolumeId": "vol-1c211ac8",
                    "Status": "attached",
                    "AttachTime": "2016-11-22T01:54:52.000Z",
                    "DeleteOnTermination": true
                }
            }],
            "VirtualizationType": "hvm",
            "ClientToken": "RQbhg1479762230132",
            "Tags": [{
                "Key": "Name",
                "Value": "Heimdall"
            }, {
                "Key": "Type",
                "Value": "Product Dev"
            }],
            "SecurityGroups": [{
                "GroupName": "LinuxAPIdev",
                "GroupId": "sg-5ea11777"
            }],
            "SourceDestCheck": true,
            "Hypervisor": "xen",
            "EbsOptimized": false
        }]
    }]
}

This is way more info than I need or want. I want to find a way to get only the values of Reservations.Instances.Tags.Value from the Reservations.Instances.Tags.Name key.

I thought that just writing it that way would work. But strangely, I can't seem to access the Reservations.Instances object at all:

// Load the SDK for JavaScript
var AWS = require('aws-sdk');

// Load credentials and set region from JSON file
AWS.config.loadFromPath('./.aws/config.json');

// Create EC2 service object
var ec2 = new AWS.EC2({apiVersion: '2016-11-15'});

var params = {
  DryRun: false,
  InstanceIds: ['i-0be5987a41191a044', 'i-08b83c3fc28e9a1d2']
};

// call EC2 to retrieve policy for selected bucket
ec2.describeInstances(params, function(err, data) {
  if (err) {
    console.log("Error", err.stack);
  } else {
    console.log("Success", JSON.stringify(data.Reservations.Instances));
  }
});

This results in:

Success undefined

What am I doing wrong? How do I access the lower level of data within Instances? It is obviously there... it shows up in JSON.stringify(), but clearly I don't have the right protocol for extracting it.

(P.S. Because of AWS credentials, you won't be able to run my code without minor changes. You'll need to reference your own credentials, and InstanceIds from your own EC2 instances.)

2 Answers 2

3

Reservations, Instances and Tags All are arrays that''s why :

Reservations[0].Instances[0].Tags[0].Value
// value of 1ˢᵗ tag of 1ˢᵗ instance of 1ˢᵗ reservation 

and Not

Reservations.Instances.Tags.Value
Sign up to request clarification or add additional context in comments.

2 Comments

Whaddaya know. Works perfectly. Thank you.
Your are Welcome 👋 👋
1

Within your describeInstances() method, you can simply use

// for InstanceId : "i-08b83c1c428e9a1d2"
data.Reservations[0].Instances[0].Tags[0].Value;
// and for InstanceId : "i-0be50217a40028a044"
data.Reservations[1].Instances[0].Tags[0].Value;

You can anyway create a function, if required, to return the tags value if the object structure is known.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.