Skip to content

Instantly share code, notes, and snippets.

@martinamps
Last active January 26, 2023 17:00
Show Gist options
  • Save martinamps/0518d655390b383126b330ad60be74cd to your computer and use it in GitHub Desktop.
Save martinamps/0518d655390b383126b330ad60be74cd to your computer and use it in GitHub Desktop.
import { RDSClient, paginateDescribeDBInstances, DescribeDBInstancesCommand } from "@aws-sdk/client-rds"
import { writeFileSync } from 'fs'
import axios from 'axios'
(async () => {
const rdsClient = new RDSClient();
const dbs = [];
for await (const page of paginateDescribeDBInstances( { client: rdsClient }, {})) {
dbs.push(...page.DBInstances);
}
const outputCSV = [];
for (const db of dbs) {
const teamTag = db.TagList.find(o => o.Key == 'used_by_team' || o.Key == 'team');
const envTag = db.TagList.find(o => o.Key == 'algo-environment' || o.Key == 'env');
let env = '';
if (envTag) {
env = envTag.Value;
} else if (/staging|prod/.test(db.DBName)) {
env = db.DBName.indexOf('prod') !== -1 ? 'prod' : 'staging'
}
const opts = {
params: {
query: `sum:aws.cost.amortized{aws_resource_id:${db.DBInstanceArn}}`,
from: Math.floor(+new Date()/1000) - 3600*24*30,
to: Math.floor(+new Date()/1000)
},
headers: {
'DD-API-KEY': process.env.DD_API_KEY,
'DD-APPLICATION-KEY': process.env.DD_APP_KEY,
}
};
const costResp = await axios.get(`https://api.datadoghq.com/api/v1/query`, opts);
const points = costResp?.data?.series[0]?.pointlist;
const cost = points ? points.reduce((a, b) => a + b[1], 0) : 'unknown';
console.log(db.DBInstanceArn, cost);
outputCSV.push({
arn: db.DBInstanceArn,
name: db.DBInstanceIdentifier,
class: db.DBInstanceClass,
engine: db.Engine,
team: teamTag ? teamTag.Value.replace(':team:', '') : '',
env,
'1mo_cost': cost,
});
}
writeFileSync('dbs.json', JSON.stringify(dbs));
writeFileSync('db_info.csv', convertToCSV(outputCSV));
})();
function convertToCSV(arr) {
const array = [Object.keys(arr[0])].concat(arr)
return array.map(it => {
return Object.values(it).toString()
}).join('\n')
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment