未来エンジニア養成所Blog

プログラミングを皆に楽しんでもらうための情報をお届けします。

Java Servlet のプログラムを Heroku へデプロイしてみる。【DB使用版】

以前にデプロイのお試しとして、Java Servlet で作成したプログラムを Heroku へデプロイしてみました。

phoeducation.work

その時にはデータベースを使用していない(「Hello World!」と表示するだけの)アプリのデプロイでしたので、今回はデータベースを使用している場合のデプロイ方法について解説します。

※ローカルで使用しているデータベースはMySQLを前提に解説しています。


Heroku準備

まずHerokuの準備は以前と同じですので、「Heroku へのアカウント登録」「Heroku CLIツールのインストール」「デプロイツールをインストール」まで、前回の記事を参考に準備しましょう。

phoeducation.work


データベースのバックアップを取得

ターミナル(コマンドプロンプト)を開き、現在のローカルのMySQLについて、 データベースのバックアップを取得します。

$ mysqldump -u root -p [データベース名] > [データベース名].sql
Enter password: ********(rootユーザのパスワードを入力)

これで、[データベース名].sql という名前でバックアップファイルが作成されます。

これは後でHeroku上にデータベースを作成するときに使用します。


Herokuへログイン

ターミナル上で、Herokuにログインします。

$ heroku login -i

Enter your Heroku credentials.
Email: Herokuに登録したメールアドレスを入力
Password: Herokuに登録したパスワードを入力

Herokuにログイン成功すると以下のメッセージが表示されます。

Logged in as Herokuに登録したメールアドレス


アプリケーション用の領域確保

Heroku上に自分のアプリケーション用の領域を名前をつけて確保します。

Herokuでは他のユーザがすでに登録している領域の名前と同じものを登録できないため、独自の名前で領域を作成します。

今回は「hello-db-norris」という名前で作成します。

$ heroku create hello-db-norris
Creating ⬢ hello-db-norris... done
https://hello-db-norris.herokuapp.com/ | https://git.heroku.com/hello-db-norris.git


サーバインスタンスのタイムゾーンを設定

念のためサーバインスタンスのタイムゾーンを設定しておきます。

デフォルトがグリニッジ標準時に設定されていますので、タイムゾーンの設定を追加して日本時間に合わせます。

$ heroku config:add TZ=Asia/Tokyo --app hello-db-norris
Setting TZ and restarting ⬢ hello-db-norris... done, v3
TZ: Asia/Tokyo

下記コマンドで設定が反映されているか確認します。

$ heroku run date -a hello-db-norris
Running date on ⬢ hello-db-norris... up, run.5054 (Free)
Thu Mar  4 08:48:18 JST 2021

表示される日付時刻が現在日付時刻であることと、タイムゾーンが JST となっているのを確認できればOKです。


HerokuのMySQL(clearDB)を設定

Herokuにクレジットカード情報と氏名、住所を登録します。

https://heroku.com/verify

データベースを使用するのにクレジットカード情報の登録が必要ですが課金はされません。


登録ができたら、以下のコマンドを実行します。

$ heroku addons:create cleardb:ignite --app hello-db-norris
Creating cleardb:ignite on ⬢ hello-db-norris... free
Created cleardb-spherical-39242 as CLEARDB_DATABASE_URL
Use heroku addons:docs cleardb to view documentation


以下のコマンドでデータベースのURLを確認します。


(Macの場合)

$ heroku config --app hello-db-norris | grep CLEARDB_DATABASE_URL
CLEARDB_DATABASE_URL: mysql://bce320a8674be8:d852ed25@us-cdbr-east-03.cleardb.com/heroku_44f7cd486a498c3?reconnect=true


(Windowsの場合)

> heroku config --app hello-db-norris | findstr CLEARDB_DATABASE_URL
CLEARDB_DATABASE_URL: mysql://be7e2ae07ffe78:x17x7746@us-cdbr-east-03.cleardb.com/heroku_7d616eab354e8ff?reconnect=true


表示されたURLの構造は mysql://(ユーザ名):(パスワード)@(ドメイン)/(データベース名)?reconnect=true となっています。

これらの設定は環境によって異なりますので、自分の環境に合わせて読み替えてくださいね。


この情報をもとに、まずターミナル(コマンドプロンプト)から以下のように入力してパスワードを入力すれば自分のPCからHerokuのMySQLにログインできます。

$ mysql -h us-cdbr-east-03.cleardb.com -u bce320a8674be8 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2342857
Server version: 5.6.50-log MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>


次のコマンドを実行するため、一旦MySQLは exitコマンドで終了します。

Herokuに作成したMySQLデータベースは latin1 という文字コードで設定されているため、そのまま利用するとアプリケーション上で文字化けを発生する可能性があります。
そこで、下記のコマンドを実行して「UTF-8 の文字コードでMySQLを利用する」設定をHerokuに追加します。


(Macの場合)

$ heroku config:add CLEARDB_DATABASE_URL='mysql://bce320a8674be8:d852ed25@us-cdbr-east-03.cleardb.com/heroku_44f7cd486a498c3?reconnect=true&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8'
Setting CLEARDB_DATABASE_URL and restarting ⬢ hello-db-norris... done, v6
CLEARDB_DATABASE_URL: mysql://bce320a8674be8:d852ed25@us-cdbr-east-03.cleardb.com/heroku_44f7cd486a498c3?reconnect=true&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8


(Windowsの場合)

> heroku config:add CLEARDB_DATABASE_URL="mysql://be7e2ae07ffe78:c17d7746@us-cdbr-east-03.cleardb.com/heroku_7d616eab354e8ff?reconnect=true^^^&useSSL=false^^^&useUnicode=ture^^^&characterEncoding=utf8^^^&characterSetResults=utf8" --app hello-db-norris
Setting CLEARDB_DATABASE_URL and restarting ? hello-db-norris... done, v6
CLEARDB_DATABASE_URL: mysql://be7e2ae07ffe78:c17d7746@us-cdbr-east-03.cleardb.com/heroku_7d616eab354e8ff?reconnect=true^^^&useSSL=false^^^&useUnicode=ture^^^&characterEncoding=utf8^^^&characterSetResults=utf8


Windowsの場合はコマンドで ^^^& とする点に注意です。
(私はこれに気が付かず、悩んでしまいました。)

& を文字情報としてHerokuに送るためにエスケープ処理をしています。
Windowsの場合、このようにしないとコマンドが正常に実行できません。
また、Macの場合はシングルクォーテーションを使用していますが、Windowsでは必ずダブルクォーテーションを使ってください。


HerokuのMySQLにテーブルを作成する

ターミナルでMySQLにログインしなおして、バックアップとして取得しておいて [データベース名].sql のファイルを実行します。

まずはMySQLへログインします。

$ mysql -h us-cdbr-east-03.cleardb.com -u bce320a8674be8 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2349475
Server version: 5.6.50-log MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

次に使用するデータベースを選択します。

mysql> use heroku_44f7cd486a498c3;
Database changed

mysql>

そしてファイルの実行です。

mysql> source (sqlファイルまでのパス)/[データベース名].sql
Query OK, 0 rows affected (0.17 sec)

Query OK, 0 rows affected (0.19 sec)

mysql>


persistence.xmlの設定

persistance.xmlにHerokuのMySQLのURLを設定します。

さきほどの CLEARDB_DATABASE_URL の設定値を基に、persistence.xmlの接続情報タブの内容にあるURLを下記の通り変更しておきます。

jdbc:mysql://(ドメイン)/(データベース名)?reconnect=true&useSSL=false&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8

接続情報


また、あわせてユーザー名とパスワードも変更します。


最後にスキーマ生成タブで database action と script generation を両方とも「なし」に設定します。

スキーマ生成


プロジェクトのwarファイルを作る

デプロイするWebアプリケーションのwarファイルを作成します。

Eclipseでプロジェクトを右クリック→エクスポート→WARファイルを選択すればOKです。


WARファイルをHerokuにデプロイ

作成したwarファイルをHrokuにデプロイするのですが、そのまえに自身のPCの環境を設定しておきます。

$ export PATH=$PATH:/Applications/Eclipse_2020-06.app/Contents/java/8/Home/bin
$ export JAVA_HOME=/Applications/Eclipse_2020-06.app/Contents/java/8/Home


設定ができたら、下記のコマンドでいよいよデプロイ開始です。

$ HEROKU_DEBUG=1 heroku war:deploy /Users/norris/Downloads/hello-db-norris.war --app hello-db-norris --webapp-runner 8.0.50.0
Uploading hello-db-norris.war
java -Dheroku.appName=hello-db-norris -Xmx1g -Dheroku.webappRunnerVersion=8.0.50.0 -Dheroku.warFile=/Users/norris/Downloads/hello-db-norris.war -jar /Users/norris/.local/share/heroku/node_modules/@heroku-cli/plugin-java/lib/heroku-deploy-complete.jar
-----> Packaging application...
       - app: hello-db-norris
       - including: webapp-runner.jar
       - including: /Users/norris/Downloads/hello-db-norris.war
Procfile:
===================
web: java $JAVA_OPTS -jar webapp-runner.jar ${WEBAPP_RUNNER_OPTS} --port $PORT .//Users/norris/Downloads/hello-db-norris.war

===================
Heroku existing config variables: [CLEARDB_DATABASE_URL, TZ]
-----> Creating build...
       - file: slug.tgz
       - size: 21MB
Heroku Blob URL: https://s3-external-1.amazonaws.com/heroku-sources-production/f489373e-0d93-4449-ae59-95355631927c?AWSAccessKeyId=AKIAJ6LKZGKGPARPZE4A&Signature=AVby7fGJ2IThEC6ZsByLOXdquXc%3D&Expires=1614820182
-----> Uploading build...
       - success
-----> Deploying...
remote:
remote: -----> Building on the Heroku-20 stack
remote: -----> heroku-deploy app detected
remote: -----> Installing JDK 1.8... done
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 73.6M
remote: -----> Launching...
remote:        Released v7
remote:        https://miyazon-norris.herokuapp.com/ deployed to Heroku
remote:
-----> Done

これでデプロイ成功です!

最後に表示されているURLにアクセスすればページが表示されます!


まとめ

自身で作成したWebアプリケーションを公開して、色々な人に見てもらいましょう。

せっかく作成したアプリケーションなので、多くの人に使ってもらえると嬉しいですよね。


参考図書



さらに学習をしたい場合は、オンラインプログラミングスクール
未来エンジニア養成所Logo