昨日使ったknoxをrequireしているs3-syncから、IDCFオブジェクトストレージを試してみます。
Node.jsのStream APIを使い、LevelDBへオプションでキャッシュできるライブラリです。
TL;DR
Node.jsのs3-syncはこのままではS3互換サービスで使えないので、Part2でForkして修正することになりました。
開発環境の準備
disposableなコンテナを起動します。
$ docker run -t -i --rm masato/baseimage /sbin/my_init /bin/bash |
今回からssh-agentを使ってコンテナにSSH接続します。
gcutil を使うと内部でssh-agentを使っているので倣おうと思います。
最初にDockerコンテナのIPアドレスを確認します。
$ cd ~/docker_apps/phusion |
-Aオプションで秘密鍵を追加してコンテナにSSH接続します。
$ eval `ssh-agent` |
サンプルプログラム
コンテナにプロジェクトを作成します。
$ mkdir -p ~/node_apps/sync |
/usr/bin/node
にシムリンクがないと s3-syncがインストールできないので、
$ npm install s3-sync |
/usr/bin/node
を確認してから、s3-syncをインストールします。
$ which node |
s3cmdで同期するバケツを作成します。
$ s3cmd -c ~/.s3cfg.idcf mb s3://s3-sync |
サンプルに使う今回のoctcatをダウンロードします。
$ mkdir tmp |
サンプルプログラムを作成します。
var level = require('level') |
プログラムを実行しますが、残念ながらs3syncのコンストラクタにあるendpointがknoxまで渡されていないようです。
$ node spike.js |
Forkして修正することにする
knoxはS3互換サービスを考慮してできていますが、knoxを使っているライブラリのすべてが同じではありません。
これはbotoでも同様で、S3互換サービスを使う場合に注意が必要です。とりあえずGitHubでForkして修正することにします。
また、2014-05-10のissueに上がっているように、ローカルのファイルを削除しても、S3側で同期されて削除されません。
同期ツールとして重要な機能とコメントがありますが、作者は忙しくて直して欲しいそうです。
まとめ
IDCFオブジェクトストレージのような、S3互換サービスを使う場合のよくある問題に当たりました。
自分が使いたいなら、オープンソースなのでPRしろと言うことだと思いますが、
botoやknoxの周辺のライブラリも、もうちょっとS3互換サービスを考慮してくれるとうれしいです。
次回はGitHubでForkしたライブラリをnpm install
してから再度チャレンジします。