S3 を libs3 から触ってみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回に引き続き C ライブラリ特集みたいになってきましたが、今回は C 言語から S3 にアクセスできる libs3 を触ってみました。

bji/libs3 · GitHub

インストールと準備

brew による追加のビルドツールおよびライブラリは特に必要ありません。(linux では libcurl と libxml2 が必要となります。)

$ git clone https://github.com/bji/libs3.git
$ cd libs3
$ make -f GNUmakefile.osx DESTDIR=/path/to/libs3dir install

make install により /path/to/libs3dir/lib にライブラリ (mac の場合は libs3.dylib) が、/path/to/libs3dir/bin に s3 という libs3 ライブラリを使用した CLI プログラムがそれぞれインストールされます。

また、確認のためのサーバとして今回は fake-s3 を使ってみます。

$ gem install fake-s3
$ fakes3 --root=/tmp/fakes3 --port=8080

実行

libs3 の動作確認ということで s3 が libs3 に依存していることを確認します。

$ otool -L s3
s3:
libs3.2.dylib (compatibility version 2.0.0, current version 2.0.0)
/usr/lib/libcurl.4.dylib (compatibility version 7.0.0, current version 8.0.0)
/usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

適当に bucket を create して、file を put してみます。 s3 は access_key_id と secret_access_key を環境変数で渡すことが必須となっているため、今回は空文字列以外を指定しています。 また、endpoint が localhost になるため、こちらも環境変数で指定しています。

$ export S3_ACCESS_KEY_ID="test" S3_SECRET_ACCESS_KEY="test" S3_HOSTNAME="localhost:8080"
$ s3 -u list classmethod.testbucket

ERROR: ErrorNoSuchBucket
Message: The resource you requested does not exist
Resource: classmethod.testbucket
Extra Details:
RequestId: 1

$ s3 -u create classmethod.testbucket
Bucket successfully created.
$ s3 -u list classmethod.testbucket
Key Last Modified Size
-------------------------------------------------- -------------------- -----
$ seq 1 1000 > data
$ s3 -u put classmethod.testbucket/key filename=data
$ s3 -u list classmethod.testbucket
Key Last Modified Size
-------------------------------------------------- -------------------- -----
key 2015-07-07T18:30:24Z 3893

put 前の list では何も表示されないですが、put 後の list では data が置かれていることがわかります。

まとめ

既存の C 言語で書かれたツールに組み込んだりする時など、用途は限られると思いますが、興味がある方は他のライブラリなども探してみるのはいかがでしょうか?