0%

IDCFオブジェクトストレージをNode.jsのknoxから使う

IDCFオブジェクトストレージへPythonのライブラリから試してみましたが、今日はNode.jsのknoxを使ってみます。
Node.jsは久しぶりなので、モダンなコードの書き方をよくわかりません。
npmでインストールしたモジュールがNODE_PATHが設定されていなくて、昨日はしばらくはまりました。
PYTHONPATHとか、GOPATHの使い方もよく忘れるので、モジュール管理のベストプラクティスを身につけたいです。

knoxのインストール

前回用意したDocker開発環境を使います。
--rmオプションをつけてコンテナは使い捨てます。

$ docker run -t -i --rm masato/baseimage /sbin/my_init /bin/bash
root@9fa3a780dcf0:/#

NODE_PATHの確認をします。

# echo $NODE_PATH
/usr/local/lib/node_modules
# npm root -g
/usr/local/lib/node_modules

knoxをインストールします。

# npm install -g knox

IDCFオブジェクトストレージの操作

テストに使うoctocatのpngをダウンロードします。

# wget http://www.piwai.info/static/blog_img/murakamicat.png

s3cmdから、ファイルを保存するバケットを作成します。
-cオプションを指定して、IDCFオブジェクトストレージの設定ファイルを読み込みます。

# s3cmd -c ~/.s3cfg.idcf mb s3://knox-bucket

テストプログラムを用意します。
コールバックでres.resume();をしないと、PUTでハングしてしまうので忘れずに書きます。
GitHubのREADMEには書いてありますが、ちょっとわかりにくいです。

~/spike.js
var knox = require("knox");
var fs = require('fs');

var client = knox.createClient({
key: "{確認したAccess Key}",
secret: "{確認したSecret Key}",
bucket: "{s3cmdで作成したバケット}",
endpoint: "{確認したSecret エンドポイント}"
});

// PUT
client.putFile('murakamicat.png', '/test/murakamicat.png',
{'Content-Type': 'image/png'},
function(err, res) {
res.resume();
if (200 == res.statusCode) {
console.log('アップロード成功');
}
else {
console.log('ファイルアップロード失敗');
}
});
// GET
var file = fs.createWriteStream('murakamicat_get.png');
client.getFile('/test/murakamicat.png',
function(err, res) {
res.on('data', function(data) {
file.write(data);
});
res.on('end', function(chunk) {
file.end();
console.log('ファイルダウンロード成功');
});

テストスクリプトを実行します。

# nodejs spike.js
ファイルダウンロード成功
アップロード成功

s3cmdからファイルのアップロードを確認します。

# s3cmd -c ~/.s3cfg.idcf ls s3://knox-bucket/test/
2014-05-25 14:33 84887 s3://knox-bucket/test/murakamicat.png

まとめ

knoxからIDCFオブジェクトストレージの操作を確認できました。
本来の目的はknoxを直接操作するのではなく、knoxを内部で利用しているs3-synchexo-deployer-s3
を使うことでした。次回はようやく静的サイトのホスティングを試してみることにします。