Skip to content

Instantly share code, notes, and snippets.

@dhavaln
Created July 7, 2022 04:41
Show Gist options
  • Save dhavaln/93cc872d2093b7f7f8a94b58a98cb97e to your computer and use it in GitHub Desktop.
Save dhavaln/93cc872d2093b7f7f8a94b58a98cb97e to your computer and use it in GitHub Desktop.
Lambda function to get storage cost for the S3 Bucket Folder
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
let totalObjects = 0;
let dataMap = {};
const formatBytes = (bytes) => {
const marker = 1024;
const gigaBytes = marker * marker * marker;
const decimal = 2;
return (bytes / gigaBytes).toFixed(decimal);
}
// Prices are based on the AWS Documentation
const s3Pricing = {
"STANDARD": 0.025,
"INTELLIGENT_TIERING": 0.025,
"GLACIER_Flexible_Retrieval": 0.0045,
"GLACIER": 0.0045
}
function getObjects({ bucket, folder, marker, prev }, callback) {
var params = {
Bucket: bucket,
Marker: marker,
Prefix: folder,
}
return s3.listObjects(params).promise().then(data => {
let objects = data.Contents;
totalObjects += objects.length;
objects.map(e => {
if (!dataMap[e.StorageClass]) {
dataMap[e.StorageClass] = { count: 0, size: 0 }
}
if (e.Size > 0) {
dataMap[e.StorageClass].count += 1
dataMap[e.StorageClass].size += e.Size
}
})
Object.keys(dataMap).map(k => {
dataMap[k].gbSize = formatBytes(dataMap[k].size)
dataMap[k].price = `${(parseFloat(dataMap[k].gbSize) * s3Pricing[k]).toFixed(2)} USD`;
})
if(data.IsTruncated){
const length = data.Contents.length;
const marker = data.Contents[length - 1].Key;
return getObjects({ bucket, folder, marker, prev: objects});
}
return objects;
});
}
exports.handler = async (event) => {
totalObjects = 0;
dataMap = {};
await getObjects({
bucket: event.bucket,
folder: event.folder
})
let res = {
bucket: event.bucket,
folder: event.folder,
totalObjects,
cost: {
...dataMap
}
};
console.log(res);
return res;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment