argius note

プログラミング関連

HerokuでPlay2.0+PostgreSQL

Play2.0でHerokuを試してみました。


Herokuは、多くのレンタルサーバーではScalaどころかJavaでさえ使えない*1のが普通なのに、ScalaでPlay2.0が使えてしまうという、ただ流行っているという訳ではない、そんな次世代のレンタルサーバーっぽい何か(≒PaaS?)、といった印象です。


Play2.0も合わせて、先駆者の皆様や開発者の皆様のご尽力により、ドキュメントも充実しています。Herokuのサイトは英語ですが、敷居は低いと思います。
それもあって、PostgreSQLを使ったテストプログラムをデプロイして動かせるようになるまで、驚くほどスムーズにできてしまいました。
なので、ほとんど説明することはありませんが、いくつか補足しながら報告(レポート)してみたいと思います。


今回は、下記の順番で実施しました。一部、順番が変わっても構わないところもあります。

  • Herokuのユーザー登録
  • Herokuツールのインストール
  • Herokuアプリケーション作成
  • Play2.0テストアプリケーション作成
  • Gitリポジトリの準備
  • アプリケーションのデプロイ
  • PostgreSQL(Heroku Postgres add-on)の設定


環境と各ツールのバージョンは以下の通り。

  • Windows 7 Professional
  • Play 2.0.4
  • Heroku Toolbelt 2.33.0
    • Ruby 1.9.2 (Toolbeltと同時インストール)
    • Git 1.7.9 (Toolbeltと同時インストール)

Play2.0のアプリケーションの作り方については、ここではほとんど説明しません。
PostgreSQLが実行できていることが確認できれば良いので、簡単なSQLを実行(例: SELECT CURRENT_TIMESTAMP)するプログラムを作る想定です。


Herokuのユーザー登録

https://api.heroku.com/signup

トップページから"Sign Up"のページ(上記URL)にアクセスし、メールアドレスを入力してサインアップします。GMailでできました。

Heroku.comからメールが送られてきますので、メールに記載された登録用URLにアクセスすると、パスワードの設定画面に飛びます。パスワードと確認用パスワードを入力して送信すれば、登録完了です。


Herokuツールのインストール

ログインしたページで、Toolbeltをインストールするように促されます。
Toolbeltはherokuコマンドを含むツールです。このツールはRubyで書かれているため、Rubyも同時にインストールされます。また、リポジトリはGitを使用するため、Gitもインストールされます。
RubyやGitがインストール済の場合は、確認していませんが、カスタムインストールで選択解除できると思います。自動選択されるかどうかは不明。


なお、このインストールで環境変数HOMEが設定されました。RubyかGitのインストール時に設定されたものと思われます。


Herokuアプリケーション作成

ここからデプロイまでは、Playのドキュメントページの通りにするだけでOKです。
詳細は、以下のページを参照してください。

私は別のサイトを見てやってしまったので、実際の手順を書きます。


コマンドプロンプトから、

 > heroku create --stack cedar

を実行します。以降、コマンドはこのように表記します。
この時点で既にGitリポジトリが作られていると、自動でリモート登録されるとのこと。
cedarの後ろにアプリケーション名を指定できますが、すでに利用されている名称は利用できません。指定しない場合は、自動生成されます。テストの場合は、自動で生成したほうが良いでしょう。
正常に作成されると、アプリケーションのアドレスと、Gitリポジトリのアドレスが出力されます。



なお、コマンドは、Cygwinでも問題なく実行できます。Rubyだから当たり前といえば当たり前ですね。


Play2.0テストアプリケーション作成

"play new"コマンドで、テストアプリケーションを作成します。ここではScalaかJavaかは問いません。後でPostgreSQLへのアクセスを行いますので、SQLを実行するテストプログラムが書けるものであればOKです。


Gitリポジトリの準備

Procfileをプロジェクトルートディレクトリに作成(内容は前述のPlayドキュメント参照)し、Gitリポジトリを作成します。
この後でHerokuアプリケーションを作成すれば、自動でリモートリポジトリに登録されます。
今回は、後で作ってしまったので、自分でリモート登録します。

 > git remote add heroku git@heroku.com:(your-app-name).git


リポジトリは、GitHubにリンクすることができるみたいですね。(Settingsページ参照)


アプリケーションのデプロイ

masterブランチにpushすると、デプロイが実行されます。

 > git push heroku master

"play dist"したときと同じようなメッセージが出力され、ビルドが実行されているのが見て取れます。
正常にデプロイされたら、createのときに出力されたアドレスにアクセスしてみましょう。


初期化に少し時間がかかるみたいですが、実行が確認できます。


PostgreSQL(Heroku Postgres add-on)の設定

無料で利用できるサービスには、Heroku Postgresアドオンが含まれています。
add-onリンクからHeroku Postgresをたどって、データベースを新規作成すると、"Your Databases"のページに、作成したデータベースが表示されます。



ここで先に、PlayにPostgreSQLSQL実行プログラムの追加をしておきます。
ビルドの依存関係(Build.scala)には、

"postgresql" % "postgresql" % "9.1-901.jdbc4"

を追加します。(Heroku Postgresのバージョンは9.1.6)
SQLを実行するテストプログラムを追加します。H2オンメモリモードでも確認できるように、"SELECT 1"のような簡単なSQLを実行するもので良いでしょう。



作成に成功すると、Heroku Postgresというページで、データベースの情報が表示されます。Connection Settingsバーの右の方に歯車アイコンがあります。ここから、アプリケーション形式に対応した接続方式を選択すると、接続情報が表示できます。
Play2.0ではJDBCを使用しますので、"JDBC URL"を選択すると、JDBC接続に必要な情報が表示されます(下記)。

String url = "jdbc:postgresql://(host):5432/(database)?user=(user)&password=(password)&ssl=true";
Connection conn = DriverManager.getConnection(url); 

ところが、私の環境ではこれだけでは接続できませんでした。
調べた結果、"&ssl=true"の後ろに

&sslfactory=org.postgresql.ssl.NonValidatingFactory

を付ける必要があるみたいです。
これで、ローカルからも直接JDBC接続できることを確認しました。


このURLをapplication.confに反映して、ローカルでPlayを動作させて上手くいったら、再デプロイします(Gitでコミット→push)。



後はPlayでひたすら開発に専念できます。
うまく軌道に乗れば有料オプションでリソースを拡張して...というのが、Herokuさんにとっても本望でしょうね。「拙者、実に喜びの至りに候」とか言いそう。
PHPで頑張らなくても良いってのが、個人的には非常に喜ばしいことです。



それにしても、Pricingのページはツッコミどころ満載ですね。
いいのかなあ、アレ...

*1:大抵は、少なくともPerl,PHP、良くてRuby,Pythonなどのスクリプト言語だけ。