I am new to NodeJS. I am confused regarding how to have multiple API calls done in single lambda function. This is not lambda/aws specific question it's more of a callback related confusion.
Here's the requirement.
I want to get all the instances and all the RDS list and collect them both in single array and return them.
Here's some code I have written, which semantically works I verified.
'use strict';
const AWS = require('aws-sdk');
function getInstancesByRegion(regionName) {
var instances = [];
var ec2withRegion = new AWS.EC2({
region: regionName
});
ec2withRegion.describeInstances({}, function(err, data) {
if (err) {
console.error(err.toString());
} else {
var currentTime = new Date();
console.log(currentTime.toString());
for (var r = 0, rlen = data.Reservations.length; r < rlen; r++) {
var reservation = data.Reservations[r];
for (var i = 0, ilen = reservation.Instances.length; i < ilen; ++i) {
var instance = reservation.Instances[i];
var name = '';
for (var t = 0, tlen = instance.Tags.length; t < tlen; ++t) {
if (instance.Tags[t].Key === 'Name') {
name = instance.Tags[t].Value;
}
}
instances.push({
id: instance.InstanceId,
type: instance.InstanceType,
name: name
});
}
}
return instances;
}
});
}
function getDatabasesByRegion(regionName) {
var dbInstances = [];
var rdsWithRegion = new AWS.RDS({
region: regionName
});
rdsWithRegion.describeDBInstances({}, function(err, data) {
if (err) {
console.error(err.toString());
} else {
var currentTime = new Date();
console.log(currentTime.toString());
for (var r = 0, rlen = data.DBInstances.length; r < rlen; r++) {
var dbInstance = data.DBInstances[r];
dbInstances.push({
id: dbInstance.DBInstanceIdentifier
});
}
return dbInstances;
}
});
}
exports.handler = (event, context, callback) => {
var ec2 = new AWS.EC2();
var params = {};
var resources = [];
ec2.describeRegions(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
for (var i = 0; i < data.Regions.length; i++) {
var regionName = data.Regions[i].RegionName;
console.log("Current RegionName is " + regionName);
resources.push({
region: regionName,
instances: getInstancesByRegion(regionName),
databases: getDatabasesByRegion(regionName)
});
}
});
callback(null, resources);
};