Lambdaカクテル

ウェブアプリケーションエンジニアです.玉石混淆です.

Herokuにplayアプリケーションをデプロイしたら色々つまづいた

#このエントリは書きかけです。

自作のWebアプリケーションを公開・稼動させてはみたいが、自前でサーバを調達するのも嫌だし、LinuxだのJVMだのをインストールするのも嫌だという不精者の私であるが、そんな私のためのサービス..PaaS(Platform as a Service)であるHerokuを使ってみた。

PaaSというのは、アプリケーションを動作させるための環境をサービスとして提供するビジネスモデルで、詳しい説明はWikipediaに譲るとして、とにかくアプリケーションを送り付けるだけで、ホスティングして動かしてくれるというすごいシステムモデルなのである。

というわけで、PaaSに分類されるHerokuはもともとRuby on Railsとかをホスティングしていたらしいが、色々あってJavaとかScalaとかなんとかも使えるようになったらしい。今回はScala/JavaのWebアプリケーションフレームワークであるPlay!2.2.1を利用してアプリケーションをデプロイしてみた。

さて、Herokuはアプリケーションの転送にGitを利用する。それだけで使える状態にまで持っていける。
面倒なGUIの操作は極力しなくてもよいように設計されているようだ。

まずHerokuを利用できるようにするために、Herokuの公式サイトからHeroku Toolbeltをダウンロードする。これはHerokuをローカルから操作するためのコマンドラインツールだ(という認識)。
インストールそのものは非常に素直に進んだのでよしとする。

さて、Herokuにデプロイするアプリケーションのプロジェクトを作成しよう。

% play new
.
.
.
% git init

ここでアプリケーションを作っておく。
Gitにコミットもしておこう。

PlayアプリケーションをHerokuにデプロイするために、Procfileというのが必要になるらしい。
プロジェクトのルートディレクトリにProcfileを作成しよう。

% echo 'web: target/start -Dhttp.port=${PORT}' > Procfile

*1
HerokuにデプロイするのにGitを使うことは分かったが、普段のSSHとHerokuのデプロイに使う鍵は、セキュリティ上の観点から分けたい。
転送に使うRSAの鍵を生成しておこう。

% cd ~/.ssh/

% ssh-keygen -C 'rsa key for heroku' -f heroku_id_rsa
.
.
.
% cd /path/to/web/application

ここでHerokuにユーザー登録しておこう。

つづいて、Herokuにログインする。

% heroku login
Enter your Heroku credentials.
Email: piyopiyo@example.com
Password:

さてさて、ようやくHerokuのお出ましだ。
Herokuにアプリケーションを作成する。

% heroku create 
Creating hoge-fuga-8492... done, stack is cedar
http://fuga-8492.herokuapp.com/ | git@heroku.com:fuga-8492.git
Git remote heroku added

自動的にGitのリモートレポジトリ"heroku"が追加される。以後のデプロイ操作はここにローカルレポジトリをpushするかたちで行なわれる。
ちなみにアプリケーション名が適当に設定されるが、あとからHerokuのダッシュボードから変更できるので放置。

あとは git push heroku masterとすることでデプロイできる。
デフォルトではmasterブランチがデプロイされるが、他のデプロイ専用ブランチを設定しておきたいときは

% git push heorku BRANCHNAME:master

と書く。

自作のライブラリを利用する

さて、自作のライブラリをアプリケーションから呼び出したいときがある。
sbtからpublish-localでローカルレポジトリに生成することが多々あるが、herokuからは認識しないので、何らかの方法で認識させねばららない。
lib/にJARをぶちこむのが手軽だが、わざわざコピーするのも癪なので、ここではGitHubをMavenレポジトリとして利用し、sbtから認識させ自動ダウンロードさせるまでを実行する。

http://qiita.com/bounscale/items/44b1729db39edbb507fd
ここの受け売り。

おおざっぱな手順
  1. GitHubで空のレポジトリを作る
  2. git cloneする
  3. git checkout --orphan gh-pages
  4. 適当なダミーのindex.htmlを作る
  5. git add index.html
  6. git commit -a -m 'first commit'
  7. git push origin gh-pages
  8. github.ioに静的なページがアップロードされる
  9. ここにレポジトリを作る
  10. pushする
  11. 利用する側のresolverにさっきのページを指定
  12. dependencyを追加する
  13. sbtのPublishToを設定

改変したPlayについて

現在作成しているアプリケーションは仕様的にUTF-8が利用できず、リクエストなどにShift-JISの処理が必要となるため、個人で改変してビルドしたPlayを使っていた。
しかしながらHerokuにデプロイする際に標準のPlayがロードされたため処理ができなくなっている。
# Playさん、リクエストの文字コード対応を増やしてください。

*1:${JAVA_OPTS}はPlay2.2以降は起動スクリプトに含まれるようになるのでいらない。