2013年4月4日木曜日

Play! on Heroku でDBにMySQL使ってみる

 Play!(Java)で作ったアプリケーションを開発用途としてHerokuにDeplyしてみたかったので、ちょっと試してみた際のメモ。

※Heroku addon xeroundは5月頭にFree Planはなくなるという通知を受けました。

  • 開発環境
Mac OSX
jdk1.6
Scala2.10.0
Play!(Java)2.1.0
sbt 0.12.2

  • 前提
Herokuのアカウント
sshでHerokuにログインできる

HelloWorldアプリをHerokuにとりあえずDeploy


 まずはPlay!でHelloWorldサンプルをつくる。
$ mkdir ~/workspace/
$ cd ~/workspace/
$ play new helloworld

アプリの雛形ができる

$ cd helloworld
$ sbt
[helloworld] $ play
       _            _
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/

play! 2.1.0 (using Java 1.7.0_07 and Scala 2.10.0), http://www.playframework.org

> Type "help play" or "license" for more information.
> Type "exit" or use Ctrl+D to leave this console.

[helloworld] $ reload
[helloworld] $ update
[helloworld] $ compile
[helloworld] $ run
とりあえずブラウザで http://localhost:9000/ にアクセスしてみる。ページがちゃんと表示されればおk。
 この状態でとりあえずHerokuにDeployしてみる。
$ pwd
~/workspace/helloworld/

$ git init
$ git add .
$ git commit -m "init"
[master (root-commit) 20c2af7] init
 14 files changed, 240 insertions(+)
 create mode 100644 .gitignore
...

$ heroku create
Creating 【Heroku上に作成されたアプリ名】... done, stack is cedar
http://【Heroku上に作成されたアプリ名】.herokuapp.com/ | git@heroku.com:【Heroku上に作成されたアプリ名】.git
Git remote heroku added

$ git push heroku master
...
-----> Play 2.x - Java app detected
-----> Installing OpenJDK 1.6...done
-----> Building app with sbt
-----> Running: sbt clean compile stage
       Getting net.java.dev.jna jna 3.2.3 ...
...
       [success] Total time: 6 s, completed Mar 31, 2013 3:28:58 PM
-----> Dropping ivy cache from the slug
-----> Discovering process types
       Procfile declares types           -> (none)
       Default types for Play 2.x - Java -> web

-----> Compiled slug size: 119.3MB
-----> Launching... done, v6
       http://【Heroku上に作成されたアプリ名】.herokuapp.com deployed to Heroku

To git@heroku.com:【Heroku上に作成されたアプリ名】.git
 * [new branch]      master -> master

メッセージに表示されている通り、ブラウザで http://【Heroku上に作成されたアプリ名】.herokuapp.com にアクセスして、ローカルでやったときと同じようにページが表示されればおk。ミスってたら heroku logs コマンドでLogを見るべし。

 Herokuの設定を確認。
$ heroku config
=== 【Heroku上に作成されたアプリ名】 Config Vars
DATABASE_URL:                postgres://FooHoge
HEROKU_POSTGRESQL_GREEN_URL: postgres://FooHoge
JAVA_OPTS:                   -Xmx384m -Xss512k -XX:+UseCompressedOops
PATH:                        .jdk/bin:.sbt_home/bin:/usr/local/bin:/usr/bin:/bin
REPO:                        /app/.sbt_home/.ivy2/cache
SBT_OPTS:                    -Xmx384m -Xss512k -XX:+UseCompressedOops
デフォルトのデータベースURLはポスグレですね。

HelloWorldアプリをDB(MySQL)を使った簡易アプリに変えていく


まずはローカルで。conf/application.confを編集する。
$ pwd
~/workspace/helloworld/
$ vim conf/application.conf
・conf/application.conf 抜粋(JNDI,mysql, Ebeanの設定)
# You can expose this datasource via JNDI if needed (Useful for JPA)
db.default.jndiName=DefaultDS

# mysql config
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://127.0.0.1:3306/helloworld?characterEncoding=UTF8"
db.default.user="root"
db.default.password=""

# Ebean configuration
ebean.default="models.*"
MySQLでdatabase helloworldを作成(コンソールから)
on Terminal
$ mysql -uroot

on MySQL Console
mysql> CREATE DATABASE helloworld;
Query OK, 1 row affected (0.05 sec)
project/Build.scalaのdependencyにmysql-driverを追加する
$ pwd
~/workspace/helloworld/
$ vim project/Build.scala
・project/Build.scala抜粋
val appDependencies = Seq(
    // Add your project dependencies here,
    javaCore,
    javaJdbc,
    javaEbean,
    "mysql" % "mysql-connector-java" % "5.1.24"
  )
最小限のコードを追加・編集する(本エントリではEclipseを使っている)。追加するのは以下の3つ。
・controllers/Application.java
・models/Foo.java
・views/foo.scala.html

 Eclipseにプロジェクトをインポートする。
$ pwd
~/workspace/helloworld
$ sbt
[helloworld] $ reload
[helloworld] $ update
[helloworld] $ eclipse
・controllers/Application.java
package controllers;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.PersistenceException;

import com.avaje.ebean.Ebean;

import models.Foo;
import play.Logger;
import play.mvc.Controller;
import play.mvc.Result;
import views.html.foo;
import views.html.index;

public class Application extends Controller {
  
    public static Result index() {
     List listFoo = new ArrayList();
     
     Foo foo1 = new Foo();
     foo1.name = "rkaneko";
     foo1.age = 25;
     listFoo.add(foo1);
     
     Foo foo2 = new Foo();
     foo2.name = "okenakr";
     foo2.age = 52;
     listFoo.add(foo2);
     
     try {
      Ebean.save(listFoo);
     } catch (PersistenceException e) {
      Logger.info(e.getMessage());
     }
     
        return ok(index.render("Your new application is ready."));
    }
  
    public static Result foo() {
     List listFoo = Foo.findAllList();
     return ok(foo.render(listFoo));
    }
}

・models/Foo.java
package models;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import play.db.ebean.Model;

@Entity
@Table(name = "foo")
public class Foo extends Model {

 /** serial id */
 private static final long serialVersionUID = 1L;
 
 /**
  * Id .
  * Primary key
  */
 @Id
 public Long id;
 
 /** name */
 public String name;
 
 /** age */
 public Integer age;
 
 /** finder */
 public static Finder<Long, Foo> find = new Finder<Long, Foo>(Long.class, Foo.class);
 
 /**
  * Get all entities list .
  * @return
  */
 public static List findAllList() {
  return find.all();
 }

}
・views/foo.scala.html
@(listFoo: List[Foo])

@main("Welcome to Play 2.1") {

Hello Play! framework on Heroku

Use MySQL on Heroku

@for(foo <- listFoo){
IDNameAge
@foo.id @foo.name @foo.age
} }
ブラウザでまず http://localhost:9000 にアクセスして、その後 http://localhost:9000/foo にアクセスして下の画像のようなのが表示されればおk。


HerokuでMySQLを使うための設定

HerokuでMySQLを使うためにxeroundというaddonを入れる。xeroundはAWSを利用したDatabase as a Service(DaaS)。今回はFreeプラン(starter)を利用する。10MBまで無料らしい。このaddonを使用するにはクレカ情報を登録する必要がある。

 クレカ情報を登録してないと、
$ heroku addons:add xeround:starter
Adding xeround:starter on 【Heroku上に作成されたアプリ名】... failed
 !    Please verify your account to install this add-on
 !    For more information, see http://devcenter.heroku.com/categories/billing
 !    Verify now at https://heroku.com/verify
のように登録してねって怒られる。
$ heroku addons:add xeround:starter
Adding xeround:starter on 【Heroku上に作成されたアプリ名】... done, v6 (free)
Use `heroku addons:docs xeround:starter` to view documentation.
herokuの設定確認
$ heroku config
=== 【Heroku上に作成されたアプリ名】 Config Vars
DATABASE_URL:                       postgres://FooHoge
...
XEROUND_DATABASE_NAME:              app何かしらの番号
XEROUND_DATABASE_PASSWORD:          何かしらのパスワード
XEROUND_DATABASE_PORT:              何かしらのポート番号
XEROUND_DATABASE_URL:               mysql://【USERNAME】:【PASSWORD】@instance番号.db.xeround.com.:【PORT】/【USERNAME】
XEROUND_DATABASE_USERNAME:          app何かしらの番号

$ heroku config:add DATABASE_URL=ここにXEROUND_DATABASE_URLを入力する
Setting config vars and restarting arcane-coast-2375... done, v8
DATABASE_URL: ここは設定したXEROUND_DATABASE_URLが表示される

HerokuにDeployしたときにデータベース接続先をxeroundデータベースにする設定

conf/application.conf の設定を少し変更・追加する。
$ pwd
~/workspace/helloworld/
$ vim conf/application.conf
・conf/application.conf
# mysql config
db.default.url="ここにはXEROUND_DATABASE_URLを記入?characterEncoding=UTF8"
db.default.user="ここにはXEROUND_DATABASE_USERNAMEを記入"
db.default.password="ここにはXEROUND_DATABASE_PASSWORDを記入"

# for heroku Evolutions config Deploy時にEvolutionsでデータベースマイグレーションを行う設定
applyEvolutions.default=true

Herokuに再度Deployする

アプリの方は完成したので再度HerokuにDeployする。
$ pwd
~/workspace/helloworld
$ git add .
$ git commit -m "added xeround config on application.conf"
$ git push heroku master
これで、特にエラーメッセージも出ずに、再度ブラウザでHeroku上のアプリにアクセスして無事ページが表示されればおk。  とりあえず、Play! on HerokuでMySQL使ってみるっていう目標で最小限のことはできたけど、application.confはもう少しDevとProduction時の設定を柔軟に書きたい。


参考

0 件のコメント:

コメントを投稿