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 互換で既存のライブラリを使えるのがお手軽で素晴らしい。