PlayアプリをPostgreSQL対応してHerokuにデプロイ&自動テスト:Javaの常識を変えるPlay framework入門(終)(3/4 ページ)
サーブレット/JSPを基にする重厚長大なJavaのWeb開発のイメージを変える軽量フレームワーク「Play」について解説し、Webアプリの作り方を紹介する入門連載。最終回は、作成したアプリを簡単にWeb上に公開する方法とPostgreSQL対応、テスト環境の構築と自動テストの実行の仕方を解説します。
Heroku上でのPostgreSQLの利用(「Heroku Postgres」アドオンの利用)
DBを使わないシンプルなアプリのデプロイが成功したところで、今度は連載第2回で作成したサンプルを使い、DBを利用するアプリのデプロイを行ってみます。
Herokuでは、「Heroku Postgres」というPostgreSQL用のDBが無料で利用可能なため、このDBを使います。
Heroku Postgresを使うためには、以下の作業を行います。
- Heroku PostgresアドオンをHerokuアプリに追加
- 「application.conf」を編集し、DB接続先を設定
なお、Herokuのアドオンの利用には、たとえ無料のものであってもクレジットカードの認証が必要です。しかし、このHeroku Postgresとそのバックアップツールに限っては、クレジットカードの登録なしで利用できます。
また、Heroku Postgresを無料で利用する場合、以下のような制限があります。
- 作成できるレコード数は1万行まで
- 同時接続可能なコネクションは20まで
上記の制約を解除したい場合は、有料プランを使うことが可能です。有料プランの内容については、公式サイトを確認してください。
それでは、DBを使うサンプルアプリのデプロイを行ってみましょう。
【1】PostgreSQLを使うようサンプルを修正
まず、第2回で作成したサンプルアプリを、ローカルのPostgreSQLを使うように修正します。
こちらは第2回の連載でも紹介していますが、以下の2点の修正を行うことで可能です。
db.default.driver=org.postgresql.Driver db.default.url="jdbc:postgresql://localhost:5432/DB名" db.default.user=〔ユーザー名〕 db.default.password=〔パスワード〕
また、今回はapplication.confに以下の設定も追加します。
applyEvolutions.default=true
これはPlay frameworkの本番モードでも、Play frameworkの「データベースエボリューション」機能を有効にするための設定です。今までローカルマシンのコンソールからplay runコマンドを実行した際は、アプリが開発モードで実行されており、ブラウザー上からデータベースエボリューションを実行していました。
しかし、Herokuにデプロイして実行する場合は、アプリは本番モードで実行され、ブラウザー上からデータベースエボリューションを実行できません。そのため、自動でデータベースエボリューションを実行されるように設定を変更しています。
本番モードでデータベースエボリューションを有効にした場合は、サーバー起動時にスキーマ変更のSQLが実行されます。従って、開発モードのように、ブラウザー上に適用するSQLが表示されてしまうということはありません。
Play frameworkのデータベースエボリューションの機能を使わず、SQLを使ってテーブルを作成する場合は、この修正は不要です。この後HerokuのPostgreSQLへの接続情報を確認するので、そのタイミングでテーブル作成のSQLを実行してください。
なお、データベースエボリューションで作成、実行されるSQLには、テーブル作成を行う「Ups」部と、テーブルのドロップを行う「Downs」部があります。スキーマ変更を反映させる場合は、Downs部を実行した後にUps部のSQLが実行されるようになっています。
本番モードで動作させる際、スキーマ変更を反映させる際に自動的にテーブルがドロップされ、データが消えてしまうのは望ましくないかと思いますので、上記修正ではUps部の実行のみを有効にしています。
もしDowns部のSQLも自動で実行されるようにしたい場合は、以下の設定を追加します。
applyDownEvolutions.default=true
ローカルのPostgreSQLで正常に動作することを確認したら、次に進みます。
【2】Heroku Postgresアドオンの追加
まずは、先ほどと同じように、Herokuアプリを作成します。Playアプリのルートディレクトリに移動し、以下のコマンドを実行してデプロイができる状態にします。
heroku create 〔アプリ名〕 git init git add . git commit -m "初期コミット" git remote add prod git@heroku.com:〔アプリ名〕.git
準備ができたら、Heroku Postgres用のアドオンを追加します。Playアプリのルートディレクトリで、以下のコマンドを実行してください。
heroku addons:add heroku-postgresql:dev
このコマンドにより、「Hobby Dev」という無料プランで空のDBが作成され、作成されたDBの情報を保持するHerokuアプリの環境変数名が表示されます。
なお今回の例では、「HEROKU_POSTGRESQL_AMBER_URL」と表示されていますが、この「AMBER」の部分はランダムに色を表す文字列が設定されます。Herokuアプリの環境変数の内容を確認するには、以下のコマンドを実行します。
heroku config
DBの情報は、以下の形式で保存されています。
postgres://〔ユーザー名〕:〔パスワード〕@〔ホスト名〕:〔ポート番号〕/〔DB名〕
上記の例では、各設定値は以下の通りです。
- 〔ユーザー名〕:ptmrmewnsbgzjh
- 〔ポート番号〕:5432
- 〔パスワード〕:UrVkbelZY7LZv4sxmI02UGJpp8
- 〔ホスト名〕:ec2-54-204-24-154.compute-1.amazonaws.com
- 〔DB名〕:dbuj1o35k14uc2
※今回はサンプルとしてユーザー名、パスワードを記載しますが、上記情報があれば誰でもDBにアクセスできてしまうため、実際のアプリでは、この情報は公開しないようにしてください。
この情報を使うことで、「pgAdmin」などのツールを使って外部からのアクセスが可能です。データベースエボリューションを使わずにテーブルを作成したい方は、ここでデータベースのスキーマの変更を行っておいてください。
また、Herokuでは、主として使うDBを「DATABASE_URL」という環境変数に保存することが一般的です。そのため、今作成したDBの設定と同じ値を、DATABASE_URLに設定します。
Herokuの環境変数設定用のコマンドを用いて、先ほどの値をDATABASE_URL変数に設定することも可能ですが、DATABASE_URL変数を更新するための専用コマンドが用意されているので、そちらを使います。以下のコマンドを実行してください。
heroku pg:promote HEROKU_POSTGRESQL_AMBER_URL
「AMBER」の部分は別の色名が割り当てられている場合があるため、先ほど確認した環境変数名と同じ名称を指定するようにしてください。
コマンド実行後、heroku configを実行し、DATABASE_URLに同じ値がコピーされたことを確認します。
【3】application.confのDB接続情報の設定
最後に、環境変数にDATABASE_URLがある場合は、DB接続先として利用するよう、
application.confを以下のように変更します。
db.default.url="jdbc:postgresql://localhost:5432/〔DB名〕" db.default.url=${?DATABASE_URL} db.default.user=${?DATABASE_USER} db.default.password=${?DATABASE_PASSWORD}
「${?〔変数名〕}」と記述することで、もし環境変数にその変数があればその値を、なければ何もしない、という動作をします。
またHerokuでは、「THE TWELVE-FACTOR APP」の「Store config in the environment」(設定は環境変数に保存せよ)という原則に基づき、ユーザー名やパスワードを設定ファイルから読み込むことはできません。そのため、ユーザー名やパスワードについても環境変数から読み込まれるように修正しています。
Heroku上では「DATABASE_URL」にユーザー名、パスワードの情報が含まれているため、新たに環境変数を追加する必要はありません。ローカルで動作させる際は、ローカルマシンの環境変数にDATABASE_USERとDATABASE_PASSWORDの値をセットするようにしてください。
これでDBの設定は完了です。Gitリポジトリに変更をpushし、アプリが動作することを確認してください。
Copyright © ITmedia, Inc. All Rights Reserved.