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さん!!