Monthly Archives: 2月 2014

amazon s3のバケットを空にする方法【NodeJS編】

お久しぶりです。
リプレーションのインフラ担当SE、utunです。
数か月ぶりの更新なので、もうこのブログ見てる人はいないかも?
と思いつつ、ちょっとした気分転換に一つ書いてみようと思います。

最近個人的にホットな話題、「Amazon S3」について、書いていきます。

Amazon S3とは

まぁ皆知ってると思うんだけど、Amazonさんが提供してる「超巨大オブジェクトストア」みたいなもの。
このスケールであの値段は、はっきり言って異常なレベル。
もはやこの分野で太刀打ちできる企業は居ないんじゃなかろうか・・・。
まぁAzureとかもあるにはあるけども。

しかし巨大ゆえに・・・

無限にファイル置ける!
無限にスケールできる!
って聞くと、インフラSE的には疑わずにはおれない訳です。
何かを犠牲にしてるんじゃないかってね。
そんな中で使っていて、よく考えれば当然なんだけど、一つやり辛い点があったんだ。
それが

オブジェクトの削除が面倒

ってことなんだ。

なんで当然かって言うと、

「無限」のスケールのストレージから、選択的に数個~数千万個のデータを削除する

なんて、事前に想定して設計できないからね。

そんなこんなで、S3のAPI的には、オブジェクトは1000個ずつしか削除できない様になっている訳だ。

そこで本題。

バケットの中身を空にする方法

これで検索すると良く出てくる方法で「s3cmd」ってのがある。
まぁ確かに便利なんだけど、私がやろうとしていた

50万個のオブジェクトを削除

ってのには有り得ないほど時間がかかる。
更に、「s3cmd del -r -f s3://<backet_name>/」
みたいなのでやるとタイムアウトしやがるんだ。

そこで私は考えた。

逆に考えるんだ
「自作しちゃえばいいさ」
と考えるんだ

てか皆そうしてんのかもしらんけども。
書いてみたら正味10分もかからず完成。
最初から書けば良かった・・・。

めんどくさかったらプログラムを書く。
これがもしかしたらAWSを使う上では楽なのかもしれない。と思う今日この頃。
同じようなことで悩んでる人がいれば、これ使っちゃって下さいな!
NodeJSなんてマイノリティな言語を使ってる人がどれだけ居るのかわからんけども!

var AWS = require(‘aws-sdk’);
// Keyとか設定してね!
AWS.config.loadFromPath(‘../config.json’);
var s3 = new AWS.S3({apiVersion: ’2006-03-01′});
var bucket = process.argv[2];
if(!bucket){
console.log(“Usege: ” + process.argv[0] + ” ” + process.argv[1] + ” <bucket name>”);
return;
}
var cnt = 0;

(function allDelete(){
s3.listObjects({ “Bucket”: bucket },
function(err, data) {
if (err) {
console.log(err);
} else {
console.log(“get object list success:”);
var request = {
“Bucket”: bucket,
“Delete”: {“Objects”: new Array()}
};
var flg = true;
data.Contents.forEach(function(val){
request.Delete.Objects.push({“Key”: val.Key});
flg = false;
});
if(flg){
return
}
s3.deleteObjects(request, function(err, data) {
if (err) {
console.log(err);
} else {
console.log(“delete object request success:” + (cnt += 1000));
allDelete();
}
});
}
});
})();

蛇足

去年辺りに出来たと思うけど、前を通るたびに気になる店。
そういう宗派もあるらしいね。

kare