Created
September 21, 2016 05:54
-
-
Save kei-sato/2bec18c3fd322c80a910c56fc6eb1125 to your computer and use it in GitHub Desktop.
This file contains 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
#!/usr/bin/env node | |
/* | |
# Usage | |
``` | |
: list objects | |
node aws-sdk-tips.js -b bucket-name -k path/to/dir | |
: delete objects modified before 3 days | |
node aws-sdk-tips.js -b bucket-name -k path/to/dir --delete -s $((3*24*60*60)) | |
``` | |
# Example | |
``` | |
S3_BUCKET=s3://bucket-$RANDOM | |
aws s3 mb "$S3_BUCKET" | |
aws s3 cp - "$S3_BUCKET"/logs/log1 <<< 'log1' && sleep 30 | |
aws s3 cp - "$S3_BUCKET"/logs/log2 <<< 'log2' | |
node aws-sdk-tips.js -b "$S3_BUCKET" -k logs/ | |
node aws-sdk-tips.js --delete -s 30 -b "$S3_BUCKET" -k logs/ | |
aws s3 rm --recursive "$S3_BUCKET" && aws s3 rb "$_" | |
``` | |
*/ | |
const AWS = require('aws-sdk'); | |
const Path = require('path'); | |
const Getopt = require('node-getopt'); | |
const argv = process.argv.slice(2); | |
getopt = new Getopt([ | |
['b' , '=', 'bucket name such as "this-bucket" (might include "s3://" on top of that)'], | |
['k' , '=', 'key of the directory such as "logs/to/dir" (might include / on top of that)'], | |
['s' , '=', 'expire files modified before n days'], | |
['' , 'delete', 'execute deleteObjects'], | |
]).bindHelp(); | |
const opt = getopt.parse(process.argv.slice(2)); | |
const bucketName = opt.options.b && opt.options.b.replace('s3://', ''); | |
const bucketKey = opt.options.k && opt.options.k.replace(/^\//, ''); | |
const nSec = opt.options.s || 1; | |
const execDelete = opt.options.delete; | |
if (!bucketName || !bucketKey) { | |
getopt.showHelp(); | |
process.exit(); | |
} | |
const s3bucket = new AWS.S3({ apiVersion: '2006-03-01', params: { Bucket: bucketName }}); | |
function dateBefore(n) { | |
return new Date(Date.now()-n*1000); | |
} | |
function expireLogFiles(key, callback) { | |
s3bucket.listObjects({ Prefix: key }, function(err, data) { | |
if (err) return callback(err); | |
if (!data) return callback(); | |
// delete files modified before n seconds | |
var date = dateBefore(nSec); | |
var expired = data.Contents | |
.filter(x => new Date(x.LastModified).getTime() < date) | |
.map(x => ({ Key: x.Key })); | |
if (!expired || !expired.length) return callback(); | |
s3bucket.deleteObjects({ Delete: { Objects: expired }}, (err, data) => { | |
if (err) return callback(err); | |
console.info('success delete keys:', expired.map(x => Path.basename(x.Key))); | |
return callback(null, expired); | |
}); | |
}); | |
} | |
function error(err) { | |
if (err instanceof Error) return err; | |
return new Error(err); | |
} | |
function listObject(key) { | |
s3bucket.listObjects({ Prefix: key }, function(err, data) { | |
if (err) throw error(err); | |
console.log(data.Contents); | |
}); | |
} | |
function main() { | |
if (execDelete) { | |
expireLogFiles(bucketKey, (err, expired) => console.log); | |
} else { | |
listObject(bucketKey); | |
} | |
} | |
if (require.main === module) main(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment