masato's blog

IDCFオブジェクトストレージをs3cmdやbotoで使う

IDCフロンティアのオブジェクトストレージサービスBashoRiakCSを採用しています。
Riak CS Storage APIは、Amazon S3 APIとの互換性が高くできているので、s3cmdbotoが使えます。
Pythonで書かれたブログラムだとdocker-registryなど、内部でbotoを使うことが多いのでさっそく確認してみます。

s3cmdのインストール

s3cmdをインストールします。

$ sudo apt-get install s3cmd

s3cmd --configureで設定ファイルを作成しますが、エンドポイントがAWSと異なるのでAccess KeySecret Keyを入力した後は、とりあえず.s3cfgを保存します。

$ s3cmd --configure

.s3cfgのエンドポイントを修正します。エンドポイントの確認はコントロールパネルから確認できます。
curly braceは説明マーカーなので、実際に入力するときは含まれないです。

~/.s3cfg
access_key = {確認したAccess Key}
host_base = {確認したエンドポイント}
host_bucket = %(bucket)s.{確認したエンドポイント}
secret_key = {確認したSecret Key}

設定が終われば、普通のs3cmdとして使えます。

$ s3cmd --help

botoのインストール

これまではvirtualenvを作ってましたが、Dockerを使うことで開発環境にはもう不要になりました。
virtualenvだとSSHや設定ファイルの読み込みにはまったりするので。

Dockerコンテナのシェルを起動して、botoをインストールします。

$ docker run -i -t ubuntu /bin/bash
# apg-get install python python-pip
# easy_install pip
# pip install boto

~/.botoファイルに接続情報を記入します。curly braceは実際には含みません。

~/.boto
[Credentials]
aws_access_key_id = {確認したAccess Key}
aws_secret_access_key = {確認したSecret Key}
[s3]
host = {確認したエンドポイント}

pythonのインタラクティブシェルでテストします。
my-bucketのところは、グローバルに一意である必要があるので、使われていないバケット名を指定します。

# python
>>> import boto
>>> boto.set_stream_logger('idcf')
>>> conn = boto.connect_s3(debug=2)
>>> conn.create_bucket('my-bucket')
>>> conn.get_all_buckets()

デバッグ情報を含めて、確認できたと思います。
ライブラリによっては、boto.connect_s3でなく、boto.s3.connection.S3Connectionを使っています。

>>> import boto.s3.connection
>>> boto.set_stream_logger('idcf')
>>> conn = boto.s3.connection.S3Connection(debug=2)
>>> conn.get_all_buckets()

boto.s3.connect_to_regionというのもありますが、まだ動かせていません。
次は、.botoを使わなず、引数に渡してみます。

~/idcf_storage.py
#!/usr/bin/env python
import sys
import boto
def main(argv):
if len(argv) < 2:
print("Usage: %s <bucket>" % (argv[0],))
return 1
accesskey= '確認したAccess Key'
secretkey = '確認したSecret Key'
endpoint = '確認したエンドポイント'
conn = boto.connect_s3(aws_access_key_id=accesskey,
aws_secret_access_key=secretkey,
host=endpoint)
bucket = argv[1]
conn.create_bucket(bucket)
conn.get_bucket(bucket)
cs = conn.get_all_buckets()
for b in cs:
print b.name
if __name__ == '__main__':
sys.exit(main(sys.argv))

バケット名を指定して実行します。curly braceは実際には含みません。

# python ~/idcf_storage.py {グローバルで一意になるバケット名}

まとめ

IDCフロンティアのオブジェクトストレージサービスでも、s3cmdやbotoの互換性が高いことが確認できました。
docker-registryでも使えるかどうか、次に試してみようと思います。