今回はデプロイのお試しとして、Java Servlet で作成したプログラムを Heroku へデプロイしてみたいと思います。
- Heroku とは
- Webアプリケーションの準備
- Heroku へのアカウント登録
- Heroku CLIツールのインストール
- デプロイツールをインストール
- いよいよデプロイ
- サーバインスタンスのタイムゾーンを設定
- プロジェクトのwarファイルを作る
- WARファイルをHerokuにデプロイ
Heroku とは
Heroku とは、PaaS(Platform as a Service) と呼ばれるサービスで、サーバコンピュータを提供してくれるサービスになっています。
作成したWebアプリケーションを Heroku にデプロイ(アップロード)することで、自身で作成したWebアプリケーションをWebサービスとして一般に公開することができます。
Heroku には有料プランと無料プランがありますが、本格的にWebサービスとして公開するのでなければ無料プランで十分でしょう。
ちなみに、無料プランには下記のような制限が設けられています。
- アカウント毎に、アプリケーションは月に550時間までの稼働時間が割り当てられる
- アカウントにクレジットカードを紐付けると1000時間に増える
- 公開しているアプリケーションに、30分間アクセスがないと、スリープモードに移行する
Webアプリケーションの準備
何はともあれ、デプロイするためのWebアプリケーションが必要なので、それを作成します。
今回は単純に「Hello World!」とブラウザ上に表示するだけのアプリにします。(データベースは使用しません。データベースを使用したバージョンはまた別でやってみたいと思います。)
開発環境は、
OS : macOS Big Sur(バージョン 11.1)
IDE : Eclipse2020-06 (4.16.0)
JDK : SE8
です。
プログラムは「Hello World!」を表示するだけですので、
package testservlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class HelloWorldServlet */ @WebServlet("/helloworld") public class HelloWorldServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"); out.println("<!DOCTYPE html>"); out.println("<html lang=\"ja\">"); out.println("<head>"); out.println("<meta charset=\"UTF-8\">"); out.println("<title>Servlet Test</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); out.close(); } }
となっています。
実行すると下記のような表示になるアプリケーションです。
これでWebアプリケーションとしては完成しているのですが、Heroku へデプロイするためにはMavenプロジェクトにしておく必要があります。
Mavenプロジェクトへ変更するためには、Eclipseでプロジェクトを右クリックし、「構成」→「Maven プロジェクトへ変換」を選ぶだけです。
選択すると下記のような画面が表示されますが、とりあえずデフォルトのまま「完了」にします。
プロジェクトの中に「pom.xml」というファイルが作成されればOKです。
Heroku へのアカウント登録
Heroku を利用するために、まずはアカウントを作成します。
Heroku のトップページから新規アカウント登録ページに遷移します。
クラウド・アプリケーション・プラットフォーム | Heroku
「無料で新規登録」をクリックすると、下記のような画面になりますので、必要事項を入力して「無料アカウント作成」ボタンを押します。
登録を行うと、登録したメールアドレスに確認用のメールが届きますので、
メールに記載されているリンクを踏んで認証を行います。
認証が完了すると次はパスワード設定画面へ遷移します。パスワード設定後、ダッシュボード画面に遷移してHerokuのアカウント作成は完了です。
Heroku CLIツールのインストール
もう一つ準備する必要があります。 HerokuにWebアプリケーションをデプロイするには、Herokuのコマンドラインツールをインストールする必要があります。
Getting Started on Heroku with Java | Heroku Dev Center
今回はmacを利用していますのでbrewを使ってインストールします。
$ brew install heroku/brew/heroku
デプロイツールをインストール
これはコマンドを入力するだけです。
$ heroku plugins:install heroku-cli-deploy
いよいよデプロイ
これから作成したWebアプリケーションをデプロイしていきます。
Herokuへログイン
まずは、ターミナル上で、Herokuにログインします。
$ heroku login -i Enter your Heroku credentials. Email: Herokuに登録したメールアドレスを入力 Password: Herokuに登録したパスワードを入力
Herokuにログイン成功すると以下のメッセージが表示されます。
Logged in as Herokuに登録したメールアドレス
Heroku上に自分のアプリケーション用の領域を名前をつけて確保する
Herokuでは他のユーザがすでに登録している領域の名前と同じものを登録できないため、独自の名前で領域を作成します。
今回は「hello-world-norris」という名前で作成します。
$ heroku create hello-world-norris Creating ⬢ hello-world-norris... done https://hello-world-norris.herokuapp.com/ | https://git.heroku.com/hello-world-norris.git
サーバインスタンスのタイムゾーンを設定
念のためサーバインスタンスのタイムゾーンを設定しておきます。
デフォルトがグリニッジ標準時に設定されていますので、タイムゾーンの設定を追加して日本時間に合わせます。
$ heroku config:add TZ=Asia/Tokyo --app hello-world-norris Setting TZ and restarting ⬢ music-message-board-norris... done, v3 TZ: Asia/Tokyo
下記コマンドで設定が反映されているか確認します。
$ heroku run date -a hello-world-norris Running date on ⬢ hello-world-norris... up, run.5054 (Free) Sat Jan 30 14:17:38 JST 2021
表示される日付時刻が現在日付時刻であることと、タイムゾーンが JST となっているのを確認できればOKです。
プロジェクトの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 ~/servlet.war --app hello-world-norris --webapp-runner 8.0.50.0 Uploading servlet.war java -Dheroku.appName=hello-world-norris -Xmx1g -Dheroku.webappRunnerVersion=8.0.50.0 -Dheroku.warFile=/Users/norris/servlet.war -jar /Users/norris/.local/share/heroku/node_modules/@heroku-cli/plugin-java/lib/heroku-deploy-complete.jar -----> Packaging application... - app: hello-world-norris - including: webapp-runner.jar - including: servlet.war Procfile: =================== web: java $JAVA_OPTS -jar webapp-runner.jar ${WEBAPP_RUNNER_OPTS} --port $PORT ./servlet.war =================== Heroku existing config variables: [TZ] -----> Creating build... - file: slug.tgz - size: 8MB Heroku Blob URL: https://s3-external-1.amazonaws.com/heroku-sources-production/f9e6a55a-5bb5-45a0-abbf-3443c0bfca36?AWSAccessKeyId=AKIAJ6LKZGKGPARPZE4A&Signature=Erdth9fr5bHosltBAENR338ESr4%3D&Expires=1611987877 -----> 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: 60.4M remote: -----> Launching... remote: Released v4 remote: https://hello-world-norris.herokuapp.com/ deployed to Heroku remote: -----> Done
これでデプロイ成功です!
最後に表示されているURLにアクセスすればページが表示されます!
今回の場合は
https://hello-world-norris.herokuapp.com/helloworld
となります。