Skip to content
shunter1112 edited this page Aug 11, 2013 · 3 revisions

このチュートリアルはHerokuにデプロイされる、Play! 1.x Frameworkについて扱っていきます。

前提条件/事前準備

  • 基本的なJavaの知識、インストール済みのJVM
  • Play Framework version 1.2.3 かそれ以降のインストール(playコマンドを叩いて確認をしてみてください。)
  • アプリケーションはOpenJDKのversion6で動かす必要があります。

ローカルでの開発環境の準備

ローカルの開発環境でHeroku Toolbeltをインストールします。これは、Herokuのコマンドラインクライアント、Foreman、そしてGitのバージョン管理システムへのアクセスを確かなものにしてくれます。

一度インストールが完了したら、コマンドシェルからherokuコマンドを使えるようになります。 アカウント作成時に使用したEメールとパスワードを使ってログインをします :

:::term
$ heroku login
Enter your Heroku credentials.
Email: [email protected]
Password: 
Could not find an existing public key.
Would you like to generate one? [Yn] 
Generating new SSH public key.
Uploading ssh public key /Users/adam/.ssh/id_rsa.pub

後でコードをプッシュするのにsshキーが必要になるので、既存のsshキーをアップロードするか、新しい物を作成するために、プロンプトでエンターを押してください。

アプリケーションの作成

どんなPlay!アプリケーションでもHerokuでは実行させることができます。もし、まだ持っていないのであれば、以下のようにして基本的なPlay!アプリケーションを作成することができます :

$ play new helloworld
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.4, http://www.playframework.org
~
~ The new application will be created in /Users/jjoergensen/dev/tmp/helloworld
~ What is the application name? [helloworld] 
~
~ OK, the application is created.
~ Start it with : play run helloworld
~ Have fun!
~

これで、シンプルなコントローラクラスであるApplication.javaと一緒に、helloworldと呼ばれるプロジェクトが作成されました。

app/controllers/Application.java

package controllers;

import play.*;
import play.mvc.*;

import java.util.*;

import models.*;

public class Application extends Controller {

    public static void index() {
        render();
    }

}

依存ファイルの宣言

前のバージョンのPlay!フレームワークでは、application.conf の中でモジュールの依存関係に関する宣言を許可していましたが、この機能は無くなりました。今はdependencies.ymlを使うようになっています。

Playの依存ファイル群はconf/dependencies.ymlの中で宣言します。最初の依存ファイルはフレームワークそのものです。アプリケーションの生成時は、どのフレームワークのバージョンに依存してもいいように、- playと書かれます。以下の様に、オプションでフレームワークのバージョンを含めたほう(- play 1.2.4)がベストプラクティスと言えるでしょう。これはまたHerokuに、あなたがデフォルトの物の代わりに、どのバージョンのフレームワークを使いたいのかを知らせてくれる方法にもなります。

dependencies.ymlを以下のように編集してください。1.2.4は、あなたが使っているフレームワークのバージョンに置き換えてください :

dependencies.yml

# Application dependencies

require:
    - play 1.2.4

ビルド用の生成物がバージョン管理に含まれてしまうのを防ぐために、以下のファイルを作成します :

.gitignore

:::term
bin/
data/
db/
dist/
logs/
test-result/
lib/
tmp/
modules/

ローカルでのテスト

ただplay runとターミナルに打ち込み、アプリケーションを開始させます。

Procfileへのプロセスタイプの宣言

注意: Foremanを使ってローカルでProcfileを使う事が出来ますが、これは必要な事でありません。[ForemanとProcfileについては更に知りたい場合はこちら](procfile).

あなたのアプリケーションのルートディレクトリにあるテキストファイルでProcfileを、Web Dynoを開始させるために何のコマンドを実行するべきかを明示的に宣言するために使います。この場合、特定のポートを聞くように、play runを実行します。

これは今まで扱ってきたサンプルアプリケーションのProcfileです :

:::term
web:    play run --http.port=$PORT $PLAY_OPTS

これは、1個のwebプロセスタイプと実行する必要のあるコマンドを宣言しています。ここでは"web"と付けることが重要です。これは、デプロイ時にこのプロセスタイプがHerokuのHTTPルーティングのスタックに積まれ、Webトラフィックを受信する事を宣言しています。

PLAY_OPTS変数は別の環境へ変更するオプションとして使われます。

(オプション) JDKの選択

デフォルトでは、アプリケーションにOpenJDK 1.6がインストールされます。しかし、system.propertiesファイル内にjava.runtime.version=1.7と指定することで新しいバージョンのJDKを使う事ができます。

ここにsystem.propertiesがどのような見た目なのかを示します :

:::term
java.runtime.version=1.7

同様に、それぞれJava6, 7, または8(ラムダ構文)に対して1.6, 1.7, 1.8(1.8はベータ)を指定する事ができます。

アプリケーションのGitへの格納

私たちは今、アプリケーションの3つの構成物を持っています。dependencies.ymlの中の依存ファイル、Procfileの中のプロセスタイプ、そしてapp/controllers/Application.javaの中にある私たちのアプリケーションのソースです。Gitに追加してみましょう :

:::term
$ git init
$ git add .
$ git commit -m "init"

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

(Heorkuの)アプリケーションを作ります :

:::term
$ heroku create
Creating afternoon-frost-273... done, stack is cedar
http://afternoon-frost-273.herokuapp.com/ | [email protected]:afternoon-frost-273.git
Git remote heroku added

コードをデプロイします :

:::term
$ git push heroku master
Counting objects: 33, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (24/24), done.
Writing objects: 100% (33/33), 36.17 KiB, done.
Total 33 (delta 3), reused 0 (delta 0)

-----> Heroku receiving push
-----> play app detected
-----> Installing Play!..... done
-----> Building Play! application...
       ~        _            _ 
       ~  _ __ | | __ _ _  _| |
       ~ | '_ \| |/ _' | || |_|
       ~ |  __/|_|\____|\__ (_)
       ~ |_|            |__/   
       ~
       ~ play! 1.2.x-bfb715e, http://www.playframework.org
       ~
       1.2.x-bfb715e
       Resolving dependencies: .play/play dependencies ./ --forceCopy --sync --silent -Duser.home=/tmp/build_19mcxvj20b6cu 2>&1
       ~ Resolving dependencies using /tmp/build_19mcxvj20b6cu/conf/dependencies.yml,
       ~
       ~
       ~ No dependencies to install
       ~
       ~ Done!
       ~
       Precompiling: .play/play precompile ./ --silent 2>&1
       Listening for transport dt_socket at address: 8000
       22:50:04,601 INFO  ~ Starting /tmp/build_19mcxvj20b6cu
       22:50:05,265 INFO  ~ Precompiling ...
       22:50:08,635 INFO  ~ Done.

-----> Built 1 Play! configuration(s).
-----> Discovering process types
       Procfile declares types -> web
-----> Compiled slug size is 26.2MB
-----> Launching... done, v5
       http://afternoon-frost-273.herokuapp.com deployed to Heroku

アプリケーションへの訪問

あなたはHerokuへのコードのデプロイが完了し、Procfileを使ってプロセスタイプの指定が済んでいる状態です。これで、Herokuに対してプロセスタイプを実行するように指示をだすことができます。Herokuはこれをするために、Dynoの中の関連するコマンドを走らせます。DynoとはHerokuの構成物の基本単位である軽量コンテナのことです。

webプロセスタイプの実行中のDynoがあることを確かめてみましょう :

:::term
$ heroku ps:scale web=1

アプリケーションのDynoの状態を確認することができます。heroku psコマンドは実行中のあなたのアプリケーションのDynoの一覧を表示します :

:::term
$ heroku ps
=== web: `play run --http.port=$PORT $PLAY_O..`
web.1: up for 5s

ここでは、1個のDynoが実行中です。

heroku openを使うとブラウザからアプリケーションへ訪問することができます。

:::term
$ heroku open
Opening afternoon-frost-273... done

Herokuで表示されるwebページはローカルでビルドしたものと若干異なることに注意してください。これは、HerokuがPlayをデフォルトでプロダクションモードで実行するために起こります。$PLAY_OPTS環境変数を使ってローカルビルドでのモードを設定する事ができます。同様に、PLAY_OPTSの設定変数を変更することで、Herokuで使用されるモードを変更することができます。

Dynoのスリープと拡張

実行中のWeb Dynoが1個のしかない場合、Dynoは非アクティブ状態から1時間経つとスリープに入ろうとします。これは復帰時の最初のリクエストの数秒間の遅延を引き起こします。後続のリクエストは通常通り動きます。

これを避けるために、Web Dynoを1個以上に拡張することができます。例えば以下のようにします :

:::term
$ heroku ps:scale web=2

それぞれのアプリケーションごとに、Herokuは750時間のDyno無料利用時間を提供しています。2個のDynoでアプリを実行しつづけると、この月次の無料範囲を超えてしまうので、拡張したものを戻してみましょう :

:::term
$ heroku ps:scale web=1

ログの閲覧

Herokuは、ログをあなたのアプリケーションの構成物を実行しているすべてのDynoの出力から集められた時系列にならんだイベントの出力として扱います。HerokuのLogplexはこれらの全てのイベントのための単体のチャンネルを提供します。

あなたの実行中のアプリケーションに関する情報を、logging commandsの一つである heroku logs を使ってみてみましょう :

:::term
$ heroku logs
2011-08-20T22:50:14+00:00 heroku[web.1]: State changed from created to starting
2011-08-20T22:50:14+00:00 heroku[slugc]: Slug compilation finished
2011-08-20T22:50:16+00:00 heroku[web.1]: Starting process with command `play run --http.port=10800 --%prod -DusePrecompiled=true`
2011-08-20T22:50:16+00:00 app[web.1]: 22:50:16,953 INFO  ~ Starting /app
2011-08-20T22:50:17+00:00 app[web.1]: 22:50:17,011 INFO  ~ Precompiling ...
2011-08-20T22:50:21+00:00 app[web.1]: 22:50:21,448 WARN  ~ Defaults messsages file missing
2011-08-20T22:50:21+00:00 app[web.1]: 22:50:21,481 INFO  ~ Application 'helloworld' is now started !
2011-08-20T22:50:21+00:00 app[web.1]: 22:50:21,538 INFO  ~ Listening for HTTP on port 10800 ...
2011-08-20T22:50:22+00:00 heroku[web.1]: State changed from starting to up

次のステップ

Clone this wiki locally