ConoHaオブジェクトストレージのCLIツールを作ってみた

# conoha-ojs

Goの習作ということで、[ConoHaオブジェクトストレージ](https://www.conoha.jp)用のコマンドラインツール **conoha-ojs** を作ってみました。もともと社内の検証用に作っていたツールに、いくつかの機能を追加してドキュメントとヘルプを用意したものです。

使い方やインストール方法はGitHubにあります。

[hironobu-s/conoha-ojs](https://github.com/hironobu-s/conoha-ojs)

ConoHaオブジェクトストレージは、OpenStack Swiftベースのオブジェクトストレージです。一応SwiftにはオフィシャルにPython実装のCLIツールが用意されています。これは非常に良くできているのですが、コマンドを実行する度に認証を行うので遅かったり、Pythonの環境を用意しないと行けなかったりと、いろいろ不便を感じていました。

[Chapter 10. Object Storage command-line client](http://docs.openstack.org/cli-reference/content/swiftclient_commands.html)

conoha-ojsは特徴として、

1. ConoHaオブジェクトストレージで使える機能を一通りカバーしています
2. Goで実装されているため、実行ファイルは一つでインストールが容易です
3. 2.と同じ理由で、Windows, MacOSX, Linuxなど、だいたいどの環境でも動作すると思います
4. 認証情報をファイルに保持します。コマンド実行の度に認証情報を設定する必要がありません
5. 他のOpenStack Swiftで構築されたシステムに対しても動作するかもしれません(予定)

となっています。

swiftコマンドのように多機能ではありませんが、一般的に使う機能はサポートしています。またGoの特徴でバイナリ一つで動作するので、ポータビリティが高いです。お手軽に使うには良いと思います。

## クイックスタート

まずGitHubのREADME.mdにインストール方法が書いてあるので、その通りにインストールします。MacOSXとLinuxはワンライナーでインストールできるのでとても簡単です。

[hironobu-s/conoha-ojs](https://github.com/hironobu-s/conoha-ojs)

conoha-ojsコマンドを実行すると、使い方が表示されます。

```bash
$ conoha-ojs
Usage: conoha-ojs COMMAND [OPTIONS]

A CLI-tool for ConoHa Object Storage.

Commands:
  auth      Authenticate a user.
  list      List a container or objects within a container.
  stat      Show informations for container or object.
  upload    Upload files or directories to a container.
  download  Download objects from a container.
  delete    Delete a container or objects within a container.
  post      Update meta datas for the container or objects;
            create containers if not present.
  deauth    Remove an authentication file (~/.conoha-ojs) from a local machine.
  version   Print version.
```

最初に実行するのはauthサブコマンドです。このコマンドでオブジェクトストレージに認証を行います。username, passwordは、ConoHaコントロールパネルで作成したAPIユーザ名とパスワードです。tenant-id(テナントID)はコントロールパネル上で確認できます。

```bash
$ conoha-ojs auth -u [username] -p [password] -t [tenant-id]
```

実行してエラーが出なければ成功です。これですべてのコマンドが使えるようになりました。

さっそくpostサブコマンドでコンテナを作成してみます。

```bash
$ conoha-ojs post test-container
```
エラーが出なければ成功です。listサブコマンドで確認してみましょう。

```bash
$ conoha-ojs list
test-container
```

正しくコンテナが作成されていますね。

コンテナの情報を見る場合はstatサブコマンドを使います。

```bash
 conoha-ojs stat test-container
       Container: test-container
         Objects: 0
           Bytes: 0
        Read ACL:
       Write ACL:
   Accept-Ranges: bytes
X-Storage-Policy: Policy-0
    Content-Type: text/plain; charset=utf-8
     X-Timestamp: 1420380154.33451
      X-Trans-Id: txfe3701dd91d145ba8c67b-0054a94852
            Date: Sun, 04 Jan 2015 14:04:02 GMT
  Content-Length: 0
```

コンテナにファイルをアップロードするにはuploadサブコマンドを使います

```bash
$ conoha-ojs upload test-container hello.txt
INFO[0000] hello.txt (content-type: text/plain; charset=utf-8) was uploaded.
```

一方、ダウンロードする場合はdownloadサブコマンドを使います。

```bash
$ conoha-ojs download test-container/hello.txt
INFO[0000] test-container/hello.txt download complete.
```

## 感想

* コマンドラインツール作るにはGoは便利すぎる。
* Windows, MacOSX, Linuxのクロスコンパイルがあっさりできたのには驚いた。(僕はちょっと[スクリプト](https://gist.github.com/hironobu-s/901bb06c2a2d706d2dd7)書いただけ)
* オブジェクトストレージは便利だからもっと使われてもいいと思う。
* 正直swiftコマンドはあまり使い勝手良くない気がする。