UNPKG

cloud-report

Version:

Collects and analyzes cloud resources

84 lines (83 loc) 3.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const Moment = require("moment"); const utils_1 = require("../../../utils"); const aws_1 = require("../../../utils/aws"); const base_1 = require("../../base"); class EC2InstancesCollector extends base_1.BaseCollector { collect() { return this.getAllInstances(); } async getAllInstances() { const serviceName = "EC2"; const ec2Regions = this.getRegions(serviceName); const instances = {}; for (const region of ec2Regions) { try { const ec2 = this.getClient(serviceName, region); instances[region] = []; let fetchPending = true; let marker; while (fetchPending) { const instancesResponse = await ec2.describeInstances({ NextToken: marker }).promise(); if (instancesResponse && instancesResponse.Reservations) { instances[region] = instances[region].concat(instancesResponse.Reservations.reduce((instancesFromReservations, reservation) => { if (!reservation.Instances) { return instancesFromReservations; } else { return instancesFromReservations.concat(reservation.Instances); } }, [])); marker = instancesResponse.NextToken; fetchPending = marker !== undefined && marker !== null; await utils_1.CommonUtil.wait(200); } else { fetchPending = false; } } for (const instance of instances[region]) { if (instance.hasOwnProperty("BlockDeviceMappings")) { for (const blockDeviceMap of instance.BlockDeviceMappings) { blockDeviceMap.Ebs.Snapshots = await this.getSnapshotsByVolume(ec2, blockDeviceMap.Ebs.VolumeId); } } } } catch (error) { aws_1.AWSErrorHandler.handle(error); continue; } } return { instances }; // change instances } async getSnapshotsByVolume(ec2Obj, volumeId) { let snapshots = []; let fetchPending = true; let marker; const dataStringsToSearch = utils_1.CommonUtil.removeDuplicates([this.getDateStringForSearch(30), this.getDateStringForSearch(0)]); while (fetchPending) { const params = { Filters: [ { Name: "volume-id", Values: [volumeId] }, { Name: "start-time", Values: dataStringsToSearch }, { Name: "status", Values: ["completed"] }, ], NextToken: marker, }; const response = await ec2Obj.describeSnapshots(params).promise(); marker = response.NextToken; fetchPending = marker !== undefined && marker !== null; snapshots = snapshots.concat(response.Snapshots); } return snapshots; } getDateStringForSearch(beforeDays) { return Moment().subtract(beforeDays, "days").format("YYYY-MM-*"); } } exports.EC2InstancesCollector = EC2InstancesCollector;