从嵌套对象中提取数据 - node.js中的AWS ec2.describeInstances

时间:2017-02-14 19:29:51

标签: javascript json node.js object amazon-ec2

我对javascript相对较新,所以如果这是一个显而易见的问题我会道歉。也就是说,在查看其他帖子之后我还没有找到答案,所以这里有:

我正在尝试使用describeInstances从AWS中提取有关我的EC2实例的特定信息。具体来说,我希望能够提供InstanceIds列表,并从结果对象中提取带有键的标签值:" Name"。这是基本代码:



react-native-device-info




运行此代码后,将返回一个大而多毛的嵌套对象。这里显示了JSON.stringify()版本:



// 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));
  }
});




这比我需要或想要的更多信息。我想找到一种方法,只从Reservations.Instances.Tags.Name键中获取Reservations.Instances.Tags.Value的值。

我认为只要用那种方式写它就行了。但奇怪的是,我似乎无法访问Reservations.Instances对象:



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




这导致:



// 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));
  }
});




我做错了什么?如何访问Instances中的较低级别的数据?它显然存在......它出现在JSON.stringify()中,但显然我没有正确的提取它的协议。

提前感谢您的帮助。

(PS由于AWS凭据,您无法在不进行细微更改的情况下运行我的代码。您需要引用自己的凭据,并从您自己的EC2实例中引用InstanceIds。)

2 个答案:

答案 0 :(得分:2)

ReservationsInstancesTags所有数组都是这样的原因:

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

而不是

Reservations.Instances.Tags.Value

答案 1 :(得分:1)

在describeInstances()方法中,您只需使用

即可
// 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;

如果需要,您可以创建一个函数,以便在已知对象结构时返回标记值。