未分類

Java WebアプリケーションをHerokuへデプロイする #herokujp

Herokuは言わずと知れたPaaS。Ruby界隈では有名だけどJava屋さんにはもしかすると馴染みが無いかもしれません。

つまり無料から始められるお手軽に使えるサーバプラットフォームで、難しい知識無しに手元のWebアプリケーションをそのままデプロイできます。
無料で使えるからにはもちろん制約があって、無料のままではパフォーマンススロットリング機構が働いて一定の負荷までしかリクエストを捌けません。dynoと呼ばれる単位を購入することでスケールさせることができます。
でもJavaは元々パフォーマンスが高いので無料枠でもそこそこのリクエストを捌けてしまいます。

MavenベースのWebアプリケーションをHerokuにデプロイするざっくりとした手順は以下の通り。

1. Herokuのアカウント作成
https://id.heroku.com/signupよりHerokuのアカウントを作成。クレジットカードの登録は必要なく、メールアドレスだけで登録可能。

2. Heroku Toolbeltのインストール
Heroku ToolbeltはHerokuプラットフォームを利用する上で必要なコマンドラインツール。WindowsやMac用のインストーラ形式になっているので素直にインストールします。

3. jetty-runner、Procfileの追加
jetty-runnerは特に埋込サーブレットコンテナとして人気のJettyを手軽に動かすためのartifact(ここではartifactの意味を知らなくてもいいです)。ProcfileはHerokuで動かすアプリケーションがどんな種類なのか、どうやって起動するのかを定義するファイルです。
具体的には以下のように記述します。
pom.xmlのビルドプラグインの設定欄でpackage時にjetty-runner.jarを配置するよう定義:

<execution>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-runner</artifactId>
<version>9.2.1.v20140609</version>
<destFileName>jetty-runner.jar</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>

Procfileに起動方法を定義:

web java $JAVA_OPTS -jar target/dependency/jetty-runner.jar –port $PORT target/*.war

また、pom.xmlにtarget/sourceのJavaのバージョンが指定されていてもHerokuはデフォルトではもはやオーパーツであるJava 6を使ってくれます。Java 8を使うにはsystem.propertiesというファイルで明示的にランタイムVMのバージョンを指定します。

java.runtime.version=1.8

詳しくは文書校正ツールであるRedPenをHerokuに対応させたコミットログがあるのでご参照いただければ:
making redpen-server heroku deployable · 3972e56 · recruit-tech/redpen

4. Herokuにデプロイ
アプリケーションのルートディレクトリでherokuのcreateコマンドを使い、ディレクトリをHerokuとひもつけ、そしてgit pushでデプロイ完了

$ heroku create [アプリ名]
$ git push heroku master
.
.
.
—–> Compressing… done, 119.3MB
—–> Launching… done, v13
http://redpen.herokuapp.com/ deployed to Heroku

最後に出るURLにアクセスすればok。
httpsでもアクセスできます(※1/※2):
https://redpen.herokuapp.com

どういう条件で出るか忘れたけど、以下のようなエラーがでる場合は確か heroku ps:scale web=1 と叩けばok。

2014-10-15T06:40:56.775146+00:00 heroku[router]: at=error code=H14 desc=”No web processes running” method=GET path=”/” host=redpen.herokuapp.com request_id=e6ab3d0f-bd6a-4d09-afa0-56c7c6535213 fwd=”124.213.71.220″ dyno= connect= service= status=503 bytes=

「プロフェッショナルのための実践Heroku入門」にはもっと丁寧な説明が書いてあります。

関連記事:
Heroku Buttonで簡単にHerokuにデプロイ #herokujp – #侍ズム
WebアプリケーションをIntelliJ IDEAからHerokuへデプロイする #herokujp #jbugj – #侍ズム
RedPen: a document checker
Getting Started with Java on Heroku | Heroku Dev Center
RedPen を公開しました (ベータバージョン) | Advanced Technology Lab
社内共有会で使用した RedPen 資料と進捗 | Advanced Technology Lab

※1 こちらにはGoogle Analyticsコード入りのブランチをデプロイしてあります→ https://github.com/yusuke/redpen/tree/atl-analytics
※2 入力した文章は記録していません。厳密にはアプリケーションのログが直近100行分Herokuに記録されていますが、当方では保管していません