Conohaのオブジェクトストレージを使ってみた(REST API Ver)


オブジェクトストレージリリース記念モニター募集キャンペーン に応募してみたところ運よく当選できたので、REST APIで使ってみました。

コードは最近良く書く、Node.jsです。httpリクエストには、requestを使っています。
その他、asyncや、ユーティリティとして、lodashを入れています。

基本は、ConohaのAPIドキュメント通りだけど、いろいろハマりましたw
必要な情報は、管理画面で取得してください。

いろいろとできることのサンプルコードということで、エラー処理とかなんにもしていないので、あしからず。。。m(_ _)m (処理フローも確認だけだったので、warterfallですし。。。)

まずは、トークンの取得。(ちょっと雑ですがサンプルということで。。。)

var _ = require('lodash');
var httpRequest = require('request');

var tenantName = 'テナント番号';
var tenantId = 'テナントID';
var username = 'テナント番号';
var password = 'パスワード';

var api_url = 'https://ident-r1nd1001.cnode.jp';
var uri = '';

var object_storage_endpoint = 'https://objectstore-r1nd1001.cnode.jp/v1/エンドポイント';

var token = '';
var token_expire = '';

var params = {
    "url": api_url+'/v2.0/tokens',
    "headers": {
        "Accept": 'application/json'
    },
    "form": JSON.stringify({
        "auth": {
            "tenantName": tenantName,
            "passwordCredentials": {
                "username": username,
                "password": password
            }
        }
    })

};

// tokenを取得して、アカウント情報を取得

httpRequest.post(params, function(err, result, body){
    if(_.isString(body)){
        var res = JSON.parse(body);
    }else{
        var res = body;
    }

    console.log(res.body);

    token = res.access.token.id;
    token_expire = res.access.token.expires;
    console.log('token: ' + token);
    console.log('expire: ' + token_expire);

});

console.logの結果はこんな感じ。。。
(bodyは空なんですねっと)

undefined
token:  xxxxxxxxxxxxx(トークン情報)
expire: 2014-11-04T17:33:20Z

さて、これでトークン取得できたので、いろいろできますね!!

次は、コンテナ作成。(サンプルなので、わざと、アクセス情報毎回ということで。。。)

var _ = require('lodash');
var async = require('async');
var httpRequest = require('request');

var tenantName = 'テナント番号';
var tenantId = 'テナントID';
var username = 'テナント番号';
var password = 'パスワード';

var api_url = 'https://ident-r1nd1001.cnode.jp';
var uri = '';

var object_storage_endpoint = 'https://objectstore-r1nd1001.cnode.jp/v1/エンドポイント';

var token = '';
var token_expire = '';

var params = {
    "url": api_url+'/v2.0/tokens',
    "headers": {
        "Accept": 'application/json'
    },
    "form": JSON.stringify({
        "auth": {
            "tenantName": tenantName,
            "passwordCredentials": {
                "username": username,
                "password": password
            }
        }
    })
};

async.waterfall([
 function(next){
     // tokenを取得
     httpRequest.post(params, function(err, result, body){
         console.log('token ----------------------');
         console.log(err);
         if(_.isString(body)){
             var res = JSON.parse(body);
         }else{
             var res = body;
         }

         console.log(result.statusCode);

         console.log(res.body);

         token = res.access.token.id;
         token_expire = res.access.token.expires;
         console.log('token: ' + token);
         console.log('expire: ' + token_expire);
         next(err, token);
     });
 },

 function(token, next){
     // オブジェクトストレージエンドポイントに接続
     uri = object_storage_endpoint;

     httpRequest.head({url: uri, headers:{'X-Auth-Token': token}}, function(err, result, body){
         console.log('connect ----------------------');

         console.log(err);
         console.log(result.statusCode);

         //console.log(result);
         //console.log(body);
         next(err, token);
     });
 },

 function(token, next){
     // コンテナを作成
     var container = '/test';

     uri = object_storage_endpoint + container;

     httpRequest.put({url: uri, headers:{'X-Auth-Token': token} }, function(err, result, body){
         console.log('container ----------------------');

         console.log(err);
         console.log(result.statusCode);
         console.log(result.headers);
         console.log(body);
         next(err, token);
     });
 }

], function (err, result){

});

これで、コンテナの作成ができます。

コンテナ作成のところを以下のようにかえると、コンテナ削除が可能です。

function(next){
     // コンテナを削除
     var container = '/test';

     uri = object_storage_endpoint + container;

     httpRequest.del({url: uri, headers:{'X-Auth-Token': token} }, function(err, result, body){
         console.log('container ----------------------');

         console.log(err);
         console.log(result.statusCode);
         console.log(result.headers);
         console.log(body);
         next(err);
     });
 }

では、ファイルのアップコード。(同様にコンテナ作成のところを変更)

function(next){
     // ファイルをアップロード
     var container = '/test';

     var filename = '/sample.jpg'

     var formData = {
         file: fs.createReadStream(__dirname + '/test.jpg')
     };

     uri = object_storage_endpoint + container + filename;


     fs.createReadStream(__dirname + '/test.jpg').pipe(
         httpRequest.put({url: uri, headers:{'X-Auth-Token': token}}, function(err, result, body){
             console.log('upload ----------------------');

             console.log(err);
             console.log(result.statusCode);
             console.log(result.headers);
             console.log(body);
             next(err);
         })
     );

 }

アップロードしたファイル(オブジェクト)を指定時間後削除

function(next){
     // ファイルアップロード30秒後に削除
     var container = '/test';

     var filename = '/sample1.jpg'

     var formData = {
         file: fs.createReadStream(__dirname + '/test.jpg')
     };

     uri = object_storage_endpoint + container + filename;

     /*
      X-Delete-After: オブジェクトが削除されるまでの秒数。内部的にはX-Delete-Atへ日時を設定します。
      X-Delete-At: オブジェクトの削除予約日時。UNIX Epoch timestamp形式で設定します。
      */

     fs.createReadStream(__dirname + '/test1.jpg').pipe(
         httpRequest.put({url: uri, headers:{'X-Auth-Token': token, 'X-Delete-After': 30}}, function(err, result, body){
             console.log('upload ----------------------');

             console.log(err);
             console.log(result.statusCode);
             console.log(result.headers);
             console.log(body);
             next(err);
         })
     );

 }

アップしたファイル(オブジェクト)sample1.jpgとして取得する。

function(next){
     var container = '/test';

     var filename = '/sample1.jpg'

     var formData = {
         file: fs.createReadStream(__dirname + '/test.jpg')
     };

     uri = object_storage_endpoint + container + filename;

     httpRequest.get({url: uri, headers:{'X-Auth-Token': token}}, function(err, result, body){
         console.log('download ----------------------');

         console.log(err);
         console.log(result.statusCode);
         console.log(result.headers);
         console.log(body);
         next(err);
     });

 }

オブジェクトストレージの情報を取得するには、headでアクセス。

function(next){
     var container = '/test';

     var filename = '/sample1.jpg'

     var formData = {
         file: fs.createReadStream(__dirname + '/test.jpg')
     };

     uri = object_storage_endpoint + container + filename;

     httpRequest.head({url: uri, headers:{'X-Auth-Token': token}}, function(err, result, body){
         console.log('infomation ----------------------');

         console.log(err);
         console.log(result.statusCode);
         console.log(result.headers);
         console.log(body);
         next(err);
     });

 }

こんな感じで、ひと通りの操作はできたかなーっと。。。

まぁ、S3って感じですよね。。。w
回線費用無視できるので、もっと気軽に使えるのがかなり大きいですね!!

S3みたいに、OpenStack SwiftでPre-signed URLってswiftでできないんでしょうか。。。
(どなたかご存知であれば、ご教授下さい)

あと、REST APIとpkgcloudどっちがいいのか?(というか、メリット・デメリットも)わからないので、こちらも、知りたいなーとか思いながら、次の宿題。

pkgcloudについては、Node.jsでは、すでにお調べて頂いてる方がいらっしゃいます。
Conohaのオブジェクトストレージモニターに当選したので、Nodeで使ってみた

とりあえず、いろいろやっていこうと思います!!ありがとう!!Conohaさん!!