Created
July 7, 2022 04:41
-
-
Save dhavaln/93cc872d2093b7f7f8a94b58a98cb97e to your computer and use it in GitHub Desktop.
Lambda function to get storage cost for the S3 Bucket Folder
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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