Riak CS を使ってみる
Riak が動いたので、Riak CS も試してみる。
Vagrant で作った CentOS 上に yum を使って Riak CS に必要なパッケージはインストール済み。
Riak CS は HTTP ポートに 8080 を使っているので、Virtual Box にポートフォワードさせる。
Vagrantfile に以下を追加。
config.vm.network :forwarded_port, guest: 8080, host: 9090, auto_correct: true # riak-cs http
Vagrant reload で仮想マシンを再起動をし、8080 を 9090 にポートフォワードした。
設定ファイルの変更を行う。
Riak CS を使うために Riak の設定ファイルを書き換えた。
{riak_core, [ のセクションに以下を追加。
{default_bucket_props, [{allow_mult, true}]},
続いて {riak_kv, [ のセクションに以下を追加。
{add_paths, ["/usr/lib64/riak-cs/lib/riak_cs-1.3.1/ebin"]}, {storage_backend, riak_cs_kv_multi_backend}, {multi_backend_prefix_list, [{<<"0b:">>, be_blocks}]}, {multi_backend_default, be_default}, {multi_backend, [ {be_default, riak_kv_eleveldb_backend, [ {max_open_files, 50}, {data_root, "/var/lib/riak/leveldb"} ]}, {be_blocks, riak_kv_bitcask_backend, [ {data_root, "/var/lib/riak/bitcask"} ]} ]},
続いて /etc/riak-cs/app.config で以下のように変更。
{anonymous_user_creation, false},
Riak, Riak CS を再起動。
$ sudo /etc/init.d/riak stop $ sudo /etc/init.d/riak start $ sudo /etc/init.d/riak-cs stop $ sudo /etc/init.d/riak-cs start
Riak, Riak CS が正しく動作しているか確認。
$ riak ping Attempting to restart script through sudo -H -u riak pong $ riak-cs ping pong
Riak CS を使うには Access key と secret key が必要になるのでユーザを登録する。
折角なのでホストマシンからポートフォワードして作成してみた。
$ curl -H 'Content-Type: application/json' -X POST http://localhost:9090/riak-cs/user --data '{"email":"foo@example.com", "name":"foo"}' {"email":"foo@example.com","display_name":"foo","name":"foo","key_id":"C_AHU4UXUQE9CBDSY8WX","key_secret":"GR63vRcdenI1P99LPD8_ucE_RZhf9lpXwlyVxA==","id":"84631c232d0e7cb046292d31bcc89b53d0b18f7ee387bda02cf77c7bee6524d8","status":"enabled"}
続いて確認用に s3cmd を入れてみる(こっちは仮想マシンの方に入れてみた)。
$ pip install s3cmd $ s3cmd --configure Access key and Secret key are your identifiers for Amazon S3 Access Key: C_AHU4UXUQE9CBDSY8WX Secret Key: GR63vRcdenI1P99LPD8_ucE_RZhf9lpXwlyVxA== Encryption password: test Path to GPG program [/usr/bin/gpg]: Use HTTPS protocol [No]: HTTP Proxy server name: 127.0.0.1 HTTP Proxy server port [3128]: 8080 New settings: Access Key: C_AHU4UXUQE9CBDSY8WX Secret Key: GR63vRcdenI1P99LPD8_ucE_RZhf9lpXwlyVxA== Encryption password: test Path to GPG program: /usr/bin/gpg Use HTTPS protocol: False HTTP Proxy server name: 127.0.0.1 HTTP Proxy server port: 8080
上手く動くか確認。
$ s3cmd ls
バケットとか何も作ってないので何も表示されない。
仮想マシンに Riak の 動作を確認するために Python スクリプトがあったので試しにそれを突っ込んでみる。
$ s3cmd mb s3://test Bucket 's3://test/' created $ s3cmd ls 2013-05-29 18:40 s3://test $ s3cmd put sample.py s3://test WARNING: Module python-magic is not available. Guessing MIME types based on file extensions. sample.py -> s3://test/sample.py [1 of 1] 495 of 495 100% in 0s 6.78 kB/s done
警告が出たのは .py なんてファイルを突っ込んだからだろう。
続いてホストマシンから先ほど突っ込んだファイルを取得できるかテストしてみる。
今回は Python の boto を使う。
$ pip install boto
#!/usr/bin/env python # -*- coding: utf-8 -*- from boto import connect_s3 from boto.s3.key import Key from boto.s3.connection import OrdinaryCallingFormat connect = connect_s3( aws_access_key_id='C_AHU4UXUQE9CBDSY8WX', aws_secret_access_key='GR63vRcdenI1P99LPD8_ucE_RZhf9lpXwlyVxA==', host='localhost', proxy='localhost', proxy_port=9090, calling_format=OrdinaryCallingFormat(), debug=2, # show debug info is_secure=False, ) bucket = connect.get_bucket('test') k = Key(bucket) k.key = 'sample.py' k.get_contents_to_filename('./foo.py')
これでホストマシン上に仮想マシンから突っ込んだ sample.py を foo.py として保存できた。
お手軽!
# debug=2 とやってるからデバッグ情報も見る事ができる
今度はホストマシンからファイルを突っ込んでみる。
$ echo こんにちはこんにちは > text.txt
#!/usr/bin/env python # -*- coding: utf-8 -*- from boto import connect_s3 from boto.s3.key import Key from boto.s3.connection import OrdinaryCallingFormat connect = connect_s3( aws_access_key_id='C_AHU4UXUQE9CBDSY8WX', aws_secret_access_key='GR63vRcdenI1P99LPD8_ucE_RZhf9lpXwlyVxA==', host='localhost', proxy='localhost', proxy_port=9090, calling_format=OrdinaryCallingFormat(), debug=2, # show debug info is_secure=False, ) bucket = connect.get_bucket('test') k = Key(bucket) k.key = 'test.txt' ret = k.set_contents_from_filename('./test.txt') print ret
仮想マシン上のコンソールで以下のコマンドを実行。
$ s3cmd get s3://test/test.txt s3://test/test.txt -> ./test.txt [1 of 1] 31 of 31 100% in 0s 4.16 kB/s done $ cat test.txt こんにちはこんにちは
ちゃんと取得できた。
AmazonS3 互換で既存のライブラリを使えるのがお手軽で素晴らしい。