Skip to content

Instantly share code, notes, and snippets.

@kei-sato
Created September 21, 2016 05:54
Show Gist options
  • Save kei-sato/2bec18c3fd322c80a910c56fc6eb1125 to your computer and use it in GitHub Desktop.
Save kei-sato/2bec18c3fd322c80a910c56fc6eb1125 to your computer and use it in GitHub Desktop.
#!/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