2017-02-14 8 views
0

私はJavaScriptには比較的新しいので、明らかな質問があればお詫び申し上げます。他の投稿を見直してもわかりませんでした。入れ子オブジェクトからのデータの抽出 - node.jsのAWS ec2.describeInstances

私は、describeInstancesを使用してEC2インスタンスに関するAWSから特定の情報を抽出しようとしています。具体的には、InstanceIdsのリストを提供し、結果オブジェクトからKey:Keyというタグの値を抽出できるようにします。ここでベースコード:

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

このコードを実行すると、大毛深い、およびネストされたオブジェクトが返されます。このJSON.stringify()バージョンは、ここに示されています:

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

これは私が必要とするか、または望むよりも方法の詳細情報です。 Reservations.Instances.Tags.NameキーからReservations.Instances.Tags.Valueの値だけを取得する方法を探したいと思います。

私はそのように書くだけでうまくいくと思っていました。

Success undefined

何午前:

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

これは、その結果:しかし、不思議なことに、私はReservations.Instancesがすべてでオブジェクトにアクセスするように見えることはできません私は間違っている?インスタンス内の下位レベルのデータにアクセスするにはどうすればよいですか?それは明らかにJSON.stringify()に現れますが、明らかに私はそれを抽出するための正しいプロトコルを持っていません。

ご協力いただきありがとうございます。

(PSので、AWSの資格情報を、あなたは小さな変更せずに私のコードを実行することはできません。あなたがあなた自身の資格情報、および独自のEC2インスタンスからInstanceIdsを参照する必要があります。)

答えて

2

Reservations、あなたの内

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

とNot

Reservations.Instances.Tags.Value 
+0

Whaddayaが知っている。完璧に動作します。ありがとうございました。 – rucker

+0

あなたはようこそ –

1

InstancesTagsすべては「年代なぜ配列です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; 

を使用することができます。

関連する問題