もっと簡単にGoogleCloudPlatformを使う

# はじめに
[![Logo](https://jkawamoto.github.io/roadie/img/banner.png)](https://jkawamoto.github.io/roadie/)
[Google Cloud Platform で単発処理を行う Docker コンテナ](http://qiita.com/jkawamoto/items/fbe28dbed533a7001f68) は，Cloud Platform を使うための事前・事後処理を助けてくれるものの，Docker の知識や Cloud Platform でのインスタンス管理の知識は必要だった．そこで，もっと簡単に Google Cloud Platform を使うためのコマンドラインツール [roadie](https://jkawamoto.github.io/roadie/)を作成した．

このツールはローカル端末で動作し，インスタンスの作成，ソースコードの配置，実行，そして計算結果の管理まで行う．クラウドに関する知識はほとんど不要でクラウドが利用可能になると思う．

# インストールと事前準備
まず Google Cloud Platform が利用可能な状態になっている必要がある．また，ローカル端末から Google Cloud Platform にアクセスするために，[Cloud SDK](https://cloud.google.com/sdk/) が必要になる．別途インストールした後，初期化を行ってください．`gcloud auth list` を実行してみて，Credentialed accounts にアカウントが表示されれば初期化済みである．

`roadie` のインストールは，[コンパイル済みバイナリ](https://github.com/jkawamoto/roadie/releases) をパスの通った所へ置くか，Go言語が設定済みの場合は

```sh
$ go get github.com/jkawamoto/roadie
```

にて，Mac ユーザで [Homebrew](http://brew.sh/) を使っている場合は，

```sh
$ brew tap jkawamoto/roadie
$ brew install roadie
```

によって行える．

インストール後，クラウドで実行したいソースコードのあるディレクトリで，

```sh
$ roadie init
```

を実行する．Google Cloud Platform に登録してある Project ID とデータ保存先のバケット名を聞かれるので適宜適宜入力する．バケット名は，特にこだわりが無ければ Project ID と同じで良い．なお，設定可能な Project ID 一覧は，[ここ](https://console.cloud.google.com/project)から取得できる．


# クラウドで実行するスクリプト
roadie では，[Docker コンテナ](https://github.com/jkawamoto/roadie-gcp)の時と同様に，クラウド上で実行する手順をまとめた YAML スクリプトファイルを使用する．

例えば，

- ある[サイト](http://mmnet.iis.sinica.edu.tw/dl/wowah/)から rar 圧縮されたファイルを取ってきて，
- ローカル端末のカレントディレクトリにある `analyze.py` を使って解析し，
- 生成された png ファイルを保存する

場合，スクリプトファイルは，

```yaml:script.yml
apt:
- unrar
data:
- http://mmnet.iis.sinica.edu.tw/dl/wowah/wowah.rar
run:
- unrar x -r wowah.rar
- python analyze.py WoWAH
upload:
- "*.png"
```

となる．（ちなみにこれは，[オンラインゲームプレイデータから不正ユーザを見つける研究](http://catalog.lib.kyushu-u.ac.jp/recordID/1498305)の例．）

スクリプトファイルの

- apt セクションでは，実行に必要な Ubuntu パッケージのリストを指定し，
- data セクションではダウンロードしたデータファイルの URL リストを指定する．
- run セクションでは，クラウド上で実行するコマンドリストを指定する．上記の例では，`unrar` コマンドを使って取得したアーカイブを解凍，その後，自前のプログラムで解析を行っている．
- upload セクションでは，プログラムの出力として保存したいファイル名のリストを指定する．

なお，uploadセクションでは，上記の例からも分かる通りワイルドカードが使用できる．なお，実行したプログラムが標準出力に書き出したメッセージは，`stdout{i}.txt`（`{i}` は run セクションの何番目に記載されたコメントかを表す番号．最初のコマンドは `0`）として自動で保存される．

apt, data, upload セクションは必要無ければ省略して良い．また，apt でインストール可能なパッケージ以外のパッケージをインストールする必要がある場合，runセクションに記述すれば良い．スクリプトファイルに関する詳細は[ドキュメント](https://github.com/jkawamoto/roadie/wiki/Execution_ja#%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)を参照のこと．


# 実行
作成した `script.yml` をクラウドで実行するには，

```sh
$ roadie run —local . —name instance-1 script.yml
```

を実行する．`--local` フラッグでソースコードのあるローカル端末のディレクトリ（この例ではカレントディレクトリ）を指定する．
`—name` フラッグは後で実行結果を取得するために必要な名前を設定する．なお，省略した場合は現在の時刻をもとにして適当に設定される．

`—local` フラッグを使うと，指定されたディレクトリにあるファイルをアップロードする．過去に実行したソースコードを再利用したい場合は，`--local` の代わりに`—source` フラッグを使い再利用したいインスタンスの名前を渡す．例えば，

```sh
$ roadie run —source instance-1 —name instance-2 script.yml
```

とすれば，ソースコードのアップロード時間を短縮できる．

実行状況は，`roadie status` コマンドで確認できる．ただし，`roadie run` を実行してからステータス画面に反映されるまで少し時間がかかる場合がある．

# 実行結果の取得
ステータスが `end` になっていれば，実行結果にアクセスできる．

```sh
$ roadie result list instance-1
```

で，`instance-1` という名前で実行したプログラムの出力を確認できる．upload セクションを省略した場合でも，`stdout{i}.txt` は見つかるはず．

実行結果をローカル端末にコピーするためには，`roadie result get` コマンドを使用する．例えば，

```sh
$ roadie result get instance-1 "*.png" -o ./result
```

を実行すると，`*.png` にマッチするファイルを `./result` ディレクトリにコピーする．なお，`-o` フラッグを省略した場合はカレントディレクトリにコピーされる．

# データファイルのアップロード
先ほどの例では，Web で配布されているデータファイルを利用したが，自前で用意したファイルを利用する場合も多い．`roadie data put` コマンドでは，ローカル端末にあるファイルをアップロードすることができる．

例えば，`somedata.json` をアップロードする場合，

```sh
$ roadie data put somedata.json
```

を実行する．アップロードが完了すると data セクションで利用可能な `gs://` で始まる URL が表示される．また，`roadie data list —url` で過去にアップロードしたファイルの URL を確認することができる．

# 実行時のログ
ログの取得には，`roadie log` コマンドを使う．名前が `instance-1` の場合，

```sh
$ roadie log instance-1 —f
```

と `-f` フラッグを付けると，`ctrl-c` で終了するまでログを出力する．このログには，apt や data セクションで指定したパッケージのインストールやファイルのダウンロードログに加え，run セクションに記載した各コマンドが標準エラー出力に書き出したメッセージも含まれる．

そのため，実行時に取得したい情報は標準エラー出力，実行後にファイルとして得たい情報は標準出力と分けて出力する必要がある．

# まとめ
もっと簡単にGoogleCloudPlatformを使うためのコマンドラインツール [roadie](https://jkawamoto.github.io/roadie/) を紹介した．ここに記した使い方は最も簡単な例の一つで，それ以外にもサブコマンドやオプションはたくさんある．より詳しいドキュメントは [ここ](https://github.com/jkawamoto/roadie/wiki/Home_ja) を参照のこと．また，`--help` フラッグで各コマンドのオプションの説明を見ることができる．