はじめに
Google Cloud Platform で単発処理を行う Docker コンテナ は,Cloud Platform を使うための事前・事後処理を助けてくれるものの,Docker の知識や Cloud Platform でのインスタンス管理の知識は必要だった.そこで,もっと簡単に Google Cloud Platform を使うためのコマンドラインツール roadieを作成した.
このツールはローカル端末で動作し,インスタンスの作成,ソースコードの配置,実行,そして計算結果の管理まで行う.クラウドに関する知識はほとんど不要でクラウドが利用可能になると思う.
インストールと事前準備
まず Google Cloud Platform が利用可能な状態になっている必要がある.また,ローカル端末から Google Cloud Platform にアクセスするために,Cloud SDK が必要になる.別途インストールした後,初期化を行ってください.gcloud auth list
を実行してみて,Credentialed accounts にアカウントが表示されれば初期化済みである.
roadie
のインストールは,コンパイル済みバイナリ をパスの通った所へ置くか,Go言語が設定済みの場合は
$ go get github.com/jkawamoto/roadie
にて,Mac ユーザで Homebrew を使っている場合は,
$ brew tap jkawamoto/roadie
$ brew install roadie
によって行える.
インストール後,クラウドで実行したいソースコードのあるディレクトリで,
$ roadie init
を実行する.Google Cloud Platform に登録してある Project ID とデータ保存先のバケット名を聞かれるので適宜適宜入力する.バケット名は,特にこだわりが無ければ Project ID と同じで良い.なお,設定可能な Project ID 一覧は,ここから取得できる.
クラウドで実行するスクリプト
roadie では,Docker コンテナの時と同様に,クラウド上で実行する手順をまとめた YAML スクリプトファイルを使用する.
例えば,
- あるサイトから rar 圧縮されたファイルを取ってきて,
- ローカル端末のカレントディレクトリにある
analyze.py
を使って解析し, - 生成された png ファイルを保存する
場合,スクリプトファイルは,
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"
となる.(ちなみにこれは,オンラインゲームプレイデータから不正ユーザを見つける研究の例.)
スクリプトファイルの
- apt セクションでは,実行に必要な Ubuntu パッケージのリストを指定し,
- data セクションではダウンロードしたデータファイルの URL リストを指定する.
- run セクションでは,クラウド上で実行するコマンドリストを指定する.上記の例では,
unrar
コマンドを使って取得したアーカイブを解凍,その後,自前のプログラムで解析を行っている. - upload セクションでは,プログラムの出力として保存したいファイル名のリストを指定する.
なお,uploadセクションでは,上記の例からも分かる通りワイルドカードが使用できる.なお,実行したプログラムが標準出力に書き出したメッセージは,stdout{i}.txt
({i}
は run セクションの何番目に記載されたコメントかを表す番号.最初のコマンドは 0
)として自動で保存される.
apt, data, upload セクションは必要無ければ省略して良い.また,apt でインストール可能なパッケージ以外のパッケージをインストールする必要がある場合,runセクションに記述すれば良い.スクリプトファイルに関する詳細はドキュメントを参照のこと.
実行
作成した script.yml
をクラウドで実行するには,
$ roadie run —local . —name instance-1 script.yml
を実行する.--local
フラッグでソースコードのあるローカル端末のディレクトリ(この例ではカレントディレクトリ)を指定する.
—name
フラッグは後で実行結果を取得するために必要な名前を設定する.なお,省略した場合は現在の時刻をもとにして適当に設定される.
—local
フラッグを使うと,指定されたディレクトリにあるファイルをアップロードする.過去に実行したソースコードを再利用したい場合は,--local
の代わりに—source
フラッグを使い再利用したいインスタンスの名前を渡す.例えば,
$ roadie run —source instance-1 —name instance-2 script.yml
とすれば,ソースコードのアップロード時間を短縮できる.
実行状況は,roadie status
コマンドで確認できる.ただし,roadie run
を実行してからステータス画面に反映されるまで少し時間がかかる場合がある.
実行結果の取得
ステータスが end
になっていれば,実行結果にアクセスできる.
$ roadie result list instance-1
で,instance-1
という名前で実行したプログラムの出力を確認できる.upload セクションを省略した場合でも,stdout{i}.txt
は見つかるはず.
実行結果をローカル端末にコピーするためには,roadie result get
コマンドを使用する.例えば,
$ roadie result get instance-1 "*.png" -o ./result
を実行すると,*.png
にマッチするファイルを ./result
ディレクトリにコピーする.なお,-o
フラッグを省略した場合はカレントディレクトリにコピーされる.
データファイルのアップロード
先ほどの例では,Web で配布されているデータファイルを利用したが,自前で用意したファイルを利用する場合も多い.roadie data put
コマンドでは,ローカル端末にあるファイルをアップロードすることができる.
例えば,somedata.json
をアップロードする場合,
$ roadie data put somedata.json
を実行する.アップロードが完了すると data セクションで利用可能な gs://
で始まる URL が表示される.また,roadie data list —url
で過去にアップロードしたファイルの URL を確認することができる.
実行時のログ
ログの取得には,roadie log
コマンドを使う.名前が instance-1
の場合,
$ roadie log instance-1 —f
と -f
フラッグを付けると,ctrl-c
で終了するまでログを出力する.このログには,apt や data セクションで指定したパッケージのインストールやファイルのダウンロードログに加え,run セクションに記載した各コマンドが標準エラー出力に書き出したメッセージも含まれる.
そのため,実行時に取得したい情報は標準エラー出力,実行後にファイルとして得たい情報は標準出力と分けて出力する必要がある.
まとめ
もっと簡単にGoogleCloudPlatformを使うためのコマンドラインツール roadie を紹介した.ここに記した使い方は最も簡単な例の一つで,それ以外にもサブコマンドやオプションはたくさんある.より詳しいドキュメントは ここ を参照のこと.また,--help
フラッグで各コマンドのオプションの説明を見ることができる.