@csermet/multiprovider
Version:
cloud-graph provider plugin for AWS used to fetch AWS cloud data.
153 lines (152 loc) • 6.02 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const get_1 = __importDefault(require("lodash/get"));
const groupBy_1 = __importDefault(require("lodash/groupBy"));
const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
const upperFirst_1 = __importDefault(require("lodash/upperFirst"));
const ec2_1 = __importDefault(require("aws-sdk/clients/ec2"));
const sdk_1 = __importDefault(require("@cloudgraph/sdk"));
const logger_1 = __importDefault(require("../../properties/logger"));
const utils_1 = require("../../utils");
const format_1 = require("../../utils/format");
const errorLog_1 = __importDefault(require("../../utils/errorLog"));
const lt = { ...logger_1.default };
const { logger } = sdk_1.default;
const serviceName = 'VPC';
const errorLog = new errorLog_1.default(serviceName);
const endpoint = utils_1.initTestEndpoint(serviceName);
exports.default = async ({ regions, config, }) => new Promise(async (resolve) => {
const vpcData = [];
const regionPromises = [];
const additionalAttrPromises = [];
/**
* Step 1) Get all the VPC data for each region
*/
const listVpcData = async ({ ec2, region, token: NextToken = '', resolveRegion, }) => {
let args = {};
if (NextToken) {
args = { ...args, NextToken };
}
return ec2.describeVpcs(args, async (err, data) => {
if (err) {
errorLog.generateAwsErrorLog({
functionName: 'ec2:describeVpcs',
err,
});
}
/**
* No Vpc data for this region
*/
if (isEmpty_1.default(data)) {
return resolveRegion();
}
const { Vpcs: vpcs, NextToken: token } = data;
logger.debug(lt.fetchedVpcs(vpcs.length));
/**
* No Vpcs Found
*/
if (isEmpty_1.default(vpcs)) {
return resolveRegion();
}
/**
* Check to see if there are more
*/
if (token) {
listVpcData({ region, token, ec2, resolveRegion });
}
/**
* Get flow log data for the vpcs in the region
*/
const vpcIds = vpcs.map(({ VpcId }) => VpcId);
const flowLogsResult = [];
try {
let nextTokenWatcher = true;
while (nextTokenWatcher) {
const flowLogs = await ec2
.describeFlowLogs({
Filter: [{ Name: 'resource-id', Values: vpcIds }],
MaxResults: 100,
})
.promise();
if (flowLogs?.FlowLogs) {
for (const flowLog of flowLogs.FlowLogs) {
flowLogsResult.push(flowLog);
}
}
if (!flowLogs.NextToken) {
nextTokenWatcher = false;
}
}
}
catch (e) {
logger.debug('There was an issue getting vpc flow log data');
logger.debug(e);
}
/**
* Add the found Vpcs to the vpcData
*/
vpcData.push(...vpcs.map(vpc => {
const vpcFlowLogSet = flowLogsResult.filter(flowLog => flowLog.ResourceId === vpc.VpcId);
const flowLogTags = [];
for (const flowLog of vpcFlowLogSet) {
flowLogTags.push(...flowLog.Tags);
}
return {
...vpc,
region,
Tags: format_1.convertAwsTagsToTagMap(vpc.Tags.concat(flowLogTags)),
flowLogs: flowLogsResult.find(flowLog => flowLog.ResourceId === vpc.VpcId),
};
}));
/**
* If this is the last page of data then return
*/
if (!token) {
resolveRegion();
}
});
};
regions.split(',').map(region => {
const ec2 = new ec2_1.default({ ...config, region, endpoint });
const regionPromise = new Promise(resolveRegion => listVpcData({ ec2, region, resolveRegion }));
regionPromises.push(regionPromise);
});
await Promise.all(regionPromises);
/**
* Step 2) For each VPC get Enable DNS Support/Hostnames configuration
*/
const fetchVpcAttribute = (Attribute) => vpcData.map(({ region, VpcId }, idx) => {
const ec2 = new ec2_1.default({ ...config, region, endpoint });
const additionalAttrPromise = new Promise(resolveAdditionalAttr => ec2.describeVpcAttribute({ VpcId, Attribute }, (err, data) => {
if (err) {
errorLog.generateAwsErrorLog({
functionName: 'ec2:describeVpcAttribute',
err,
});
}
/**
* No attribute
*/
if (isEmpty_1.default(data)) {
return resolveAdditionalAttr();
}
/**
* Add the attribute to the VPC
*/
vpcData[idx][upperFirst_1.default(Attribute)] = get_1.default(data[upperFirst_1.default(Attribute)], 'Value');
resolveAdditionalAttr();
}));
additionalAttrPromises.push(additionalAttrPromise);
});
logger.debug(lt.fetchingVpcDnsSupportData);
fetchVpcAttribute('enableDnsSupport');
await Promise.all(additionalAttrPromises);
logger.debug(lt.fetchingVpcDnsHostnamesData);
fetchVpcAttribute('enableDnsHostnames');
await Promise.all(additionalAttrPromises);
errorLog.reset();
resolve(groupBy_1.default(vpcData, 'region'));
});