読者です 読者をやめる 読者になる 読者になる

heroku に pure golang な形態素解析サーバをあげてみた

はじめに

とりあえずやってみたという内容です.heroku 使うのも初めてなので,用語とか理解とかが違うところもあるかもしれませんが,作業ログがなにかの役に立てば幸いです.ツッコミあればお願いします!

前準備

heroku のアカウントをつくっておく必要があります.なんかずいぶん昔にアカウントだけ作ってあったので,ここの手順は思い出せませんでした. (herokuのトップページ)https://signup.heroku.com/identityから特に詰まるところなく登録できたと思います.

heroku の初期設定

heroku が Toolbelt というユーティリティを用意してくれています.アカウントを作ったら,これを手元にインストールしましょう. インストールできたらコンソールで下記を実行してログインできるか確かめましょう.

$ heroku login
Enter your Heroku credentials.
Email: (← アカウントの email)
Password (typing will be hidden):
Logged in as XXXXX

デプロイするアプリのリポジトリを手元に準備する

heroku にはリポジトリをデプロイします.すでにアプリが github に上がってれば,それを持ってきて,そのリポジトリを heroku に push します. kagome を heroku で動かしたいので, go get github.com/ikawaha/kagome/... してそのリポジトリで作業します.

golang を利用する環境を作る

自分のコードをアップする前に,アプリケーションをどんな環境で heroku で使いたいかを選択します. buildpack というのを heroku が用意してくれているので,この中から選べばいいだけです.

Buildpacks | Heroku Dev Center

今回はもちろん golang なので, https://github.com/heroku/heroku-buildpack-go を使います.コンソールから,

$ heroku create -b https://github.com/heroku/heroku-buildpack-go myapp

とすると,myapp アプリケーションの環境が用意されます.myapp のところは好きに設定できます.指定しないと heroku が適当に決めてくれます. 今回は kagome を動かすので, kagome と設定しました.名前がかぶることは出来ません.あと,無料版で登録できるのは5個までみたいです. 不要なのを登録してしまったら,ダッシュボードのアプリケーションごとの Settings から削除することが出来るので消しちゃいましょう.

$ heroku create -b https://github.com/heroku/heroku-buildpack-go kagome
Creating kagome... done, stack is cedar-14
Buildpack set. Next release on kagome will use https://github.com/heroku/heroku-buildpack-go.
https://kagome.herokuapp.com/ | https://git.heroku.com/kagome.git

これで,heroku のダッシュボードを見てみると,環境が用意されたことが分かります.

f:id:ikawaha:20151218184934p:plain

アプリのアクセス先は,https://kagome.herokuapp.com/ と設定されたみたいです. まだ環境が用意されただけで,中身は空っぽなのでアクセスしてもサービスは起動していませんが, デフォルトのページが表示されると思います.

heroku create がうまくいくと,git のリモートに heroku というのが設定されます.

$ git remote -v
heroku  https://git.heroku.com/kagome.git (fetch)
heroku  https://git.heroku.com/kagome.git (push)
origin  git@github.com:ikawaha/kagome.git (fetch)
origin  git@github.com:ikawaha/kagome.git (push)

heroku 用の設定

リポジトリを heroku に push すると勝手にビルドしてサービスを立ち上げてくれるんですが,そのための設定ファイルがいくつか必要です.

依存関係を解決するためのファイルを用意する

依存関係や golang のバージョンを確認するため(?)に Godep.json が必要です.他のライブラリへの依存関係がなくても必要です.

$ go get github.com/tools/godep

で Godep をインストールして(簡単!)リポジトリ直下で

$ godep save ./...

して下さい.すると,Gedeps というディレクトリが出来るので,これを commit しておきます.

サービスをキックするためのファイルを用意する

Procfile という名前のファイルをリポジトリ直下に置きます.そして,起動するコマンドを記述しておきます. 形態素解析サーバは kagome server -http=:8080 の様に起動するので,これを書けばいいんですが,どのポートを使うかは決め打ちに出来ません.heroku 側が適当に振り出してくれます.振り出されたポートは環境変数 $PORT で参照できるので,

web: kagome server -http=:$PORT

と記述します.web アプリなので,頭に web: というのをつけて登録しています.プロセスタイプは他にも worker とかあるので,気になる方は調べてみて下さい. これも commit しておきます.

デプロイ

heroku にアプリをデプロイします.github に push するのと同じ要領です.まちがえて origin に push しないようにして下さいね(^^ゞ.

git push heroku master

なにか問題があれば途中でこけて push が失敗します.push がうまくいけば,もうアプリが立ち上がっています. heroku ps すると立ち上がってるプロセスを確認できます.

$ heroku ps
=== web (Free): kagome server -http=:$PORT
web.1: up 2015/12/18 18:06:35 (~ 58m ago)

これで,先ほどのアドレスにアクセスすると, f:id:ikawaha:20151218190831p:plain ちゃんと立ち上がってました!

だがしかし・・・

kagomegraphviz を使って解析の課程で出てくる形態素同士の重み付きグラフを表示する機能があるのですが,heroku には graphviz が入ってないので,これが利用できません orz.調べてみると,graphviz が使えるパッケージがありました.

github.com

ありがとうございます!これを使えば解決・・・と思ったけど,これを使うと golang の buildpackage 使えなくない?

heroku-buildpack-multi を使う

heroku 公式で buildpack を複数使うための buildpack が出てます.これを利用すれば ok です.

github.com

アプリの環境を作るところで,$ heroku create -b https://github.com/heroku/heroku-buildpack-go kagome としてたのを $ heroku create -b https://github.com/heroku/heroku-buildpack-multi kagome とします.

これだけだと,golang の環境も,graphviz の環境もインストールされてないので,リポジトリ直下に .buildpackages というファイルを用意して, golang のパッケージと graphviz のパッケージを設定しておきます.

$ cat .buildpacks
https://github.com/heroku/heroku-buildpack-go.git
https://github.com/weibeld/heroku-buildpack-graphviz.git

これを commit して,heroku に push すれば ok です.

f:id:ikawaha:20151218191843p:plain

ちゃんとグラフも表示できました!