Heroku スターターガイド (Java)
はじめに
このチュートリアルを使用して Java アプリを数分でデプロイします。
このチュートリアルでは、以下が用意されていることを前提としています。
- 確認済みの Heroku アカウント
- Java 8 がインストールされている
- Maven 3 がインストールされている
- Postgres がローカルにインストールされている
- Eco dyno プランのサブスクリプション (推奨)
Maven の代わりに Gradle を使用する場合は、「Heroku スターターガイド (Gradle)」を参照してください。
Heroku dyno、Heroku Postgres、および Heroku Data for Redis の無料プランは 2022 年 11 月 28 日で提供を終了します。
低料金プランを使用してこのチュートリアルを完了することをお勧めします。資格のある学生の皆様は、新しい Heroku for GitHub Students プログラムを通じてプラットフォームクレジットを申請できます。
設定する
Heroku CLI には、一般によく使われている Git というバージョン管理システムが必要です。Git がまだインストールされていない場合は、先に進む前に次の手順を完了してください。
このステップでは、Heroku Command Line Interface (CLI) をインストールします。CLI は、アプリケーションの管理やスケール、アドオンのプロビジョニング、最近のアプリケーションログの表示、アプリケーションのローカル実行に使用します。
お使いのプラットフォーム用のインストーラをダウンロードし、実行してください。
$ brew tap heroku/brew && brew install heroku
インストールが完了したら、ターミナルで heroku
コマンドを使用できます。
heroku login
コマンドを使って Heroku CLI にログインします。
$ heroku login
heroku: Press any key to open up the browser to login or q to exit
› Warning: If browser does not open, visit
› https://cli-auth.heroku.com/auth/browser/***
heroku: Waiting for login...
Logging in... done
Logged in as me@example.com
このコマンドにより、Web ブラウザで認証を完了するための Heroku ログインページが開きます。ブラウザですでに Heroku にログインしている場合は、ページに表示されているLog in
(ログイン) ボタンをクリックします。
heroku
と git
のコマンドが両方とも正しく機能するには、この認証が必要です。
外部の HTTP/HTTPS サービスへの接続にプロキシが必要なファイアウォールを使っている場合は、heroku
コマンドを実行する前に、ローカルの開発環境で HTTP_PROXY
または HTTPS_PROXY
環境変数を設定してください。
アプリを準備する
このステップでは、サンプルアプリケーションをクローンし、Heroku にデプロイできるように準備します。
Heroku をはじめて使う場合は、 Heroku が提供するサンプルアプリケーションを使ってこのチュートリアルを行うことをお勧めします。
デプロイするアプリケーションを用意してある場合は、 「Heroku のデプロイ用にコードベースを準備する」を参照してください。
ローカルのコマンドシェルまたはターミナルで次のコマンドを実行して、サンプルアプリのローカルコピーを作成します。
$ git clone https://github.com/heroku/java-getting-started
$ cd java-getting-started
この正常な Git リポジトリには、単純な Java アプリケーションが格納されています。アプリケーションには、Heroku アプリによって使用される特殊なプレーンテキストファイルである Procfile
が含まれています。このファイル内で、アプリを開始するために使用されるプロセスおよびコマンドを明示的に宣言します。
サンプルアプリのソースコードの Procfile
は、次のようになっています。
web: java -jar target/java-getting-started-1.0.jar
このファイルでは、単一のプロセスタイプの web
と、その実行に必要なコマンドを宣言しています。web
という名前が重要です。これにより、このプロセスタイプが Heroku の HTTP ルーティングスタックにアタッチされ、Web トラフィックを受信できることが宣言されます。
Procfile には追加のプロセスタイプを含めることができます。たとえば、アイテムをキューから外す処理を実行するバックグラウンドワーカーを宣言できます。このチュートリアルでは他の処理について説明しませんが、Procfile およびプロセスモデルで詳しい情報を参照できます。
このサンプルアプリには、Java の依存関係マネージャである Maven が使用する pom.xml
ファイルも含まれています。次のステップでは、このファイルを使用して依存関係を宣言する方法について説明します。
アプリの依存関係を宣言する
Heroku では、アプリのルートディレクトリに pom.xml
ファイルがあると、自動的にそのアプリを Java アプリと認識します。Heroku では Java アプリを検出すると、公式の Java buildpack がアプリに追加され、これによってアプリの依存関係がインストールされます。mvn archetype:generate
コマンドで、独自アプリの pom.xml
ファイルを作成できます。
デプロイしたサンプルアプリには、事前に pom.xml
が用意されています (こちらを参照)。次に一部を抜粋して示します。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
アプリをデプロイすると、Heroku はこのファイルを読み出し、mvn clean install
を実行して依存関係をインストールします。pom.xml
に一覧表示される依存関係を確認してください。
別の system.properties
ファイルで、使用する Java のバージョンを指定します。このオプションのファイルの内容は、次のようになります。
java.runtime.version=1.8
Heroku では、多数の異なるバージョンをサポートしています。異なるバージョンの Java を使用して、独自のアプリをプッシュできます。
アプリをデプロイする
このステップでは、アプリを Heroku にデプロイします。
Java ビルドパックにより、Mini Heroku Postgres データベースがアプリ用に自動プロビジョニングされます。Eco にサブスクライブしている場合、アプリではデフォルトで Eco dyno が使用されます。それ以外の場合は、デフォルトで Basic dyno が使用されます。Eco dyno プランは、アカウントのすべての Eco dyno 間で共有され、多数の小さなアプリを Heroku にデプロイする場合にお勧めします。詳細は、こちらを参照してください。資格のある学生の皆様は、Heroku for GitHub Students プログラムを通じてプラットフォームクレジットを申請できます。
Heroku でアプリを作成して、デプロイ用のソースコードを受け取るよう準備します。
$ heroku create
Creating app... done, calm-beyond-57162
https://calm-beyond-57162.herokuapp.com/ | https://git.heroku.com/calm-beyond-57162.git
このコマンドにより、アプリと、ローカルの Git リポジトリと関連付けられた heroku
という名前の Git リモートが作成されます。
デフォルトでは、アプリの名前はランダムに生成されます。パラメータを渡すと、独自のアプリ名を指定できます。
CLI コマンドの代わりに Heroku Dashboard 経由でアプリを作成した場合、heroku git:remote --app example-app
でローカルリポジトリにリモートを追加します。
コードをデプロイします。
$ git push heroku main
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-20 stack
remote: -----> Determining which buildpack to use for this app
remote: -----> Java app detected
remote: -----> Installing JDK 1.8... done
remote: -----> Executing Maven
...
remote: [INFO] ------------------------------------------------------------------------
remote: [INFO] BUILD SUCCESS
remote: [INFO] ------------------------------------------------------------------------
remote: [INFO] Total time: 16.451 s
remote: [INFO] Finished at: 2021-09-28T02:37:53Z
remote: [INFO] ------------------------------------------------------------------------
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing...
remote: Done: 72.4M
remote: -----> Launching...
remote: Released v5
remote: https://calm-beyond-57162.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/calm-beyond-57162.git
* [new branch] main -> main
デフォルトでは、アプリは Eco dyno でデプロイされます。dyno は、Procfile
で指定されているコマンドを実行する軽量の Linux コンテナです。デプロイ後に、1 つの web
dyno がアプリを実行していることを確認します。実行されている dyno の数を確認するには、heroku ps
コマンドを使います。
$ heroku ps
Eco dyno hours quota remaining this month: 997h 48m (99%)
Eco dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping
=== web (Eco): java -jar target/java-getting-started-1.0.jar (1)
web.1: up 2021/09/27 22:38:10 -0400 (~ 6s ago)
実行中の web
dyno がリクエストに応答します。アプリ名で生成された URL にあるアプリを開きます。次のショートカットを使うと、簡単に Web サイトを開くことができます。
$ heroku open
Eco dyno は、アイドル状態 (トラフィックを何も受信しない状態など) が 30 分続くとスリープします。このスリープ動作により、スリープ解除するときの最初のリクエスト時に数秒の遅延が発生します。その後のリクエストは正常に処理されます。Eco dyno は、月ごとに割り当てられるアカウント別の Eco dyno 時間を消費します。割り当て時間が残っている限り、アプリは稼働し続けます。
dyno がスリープしないようにするには、「dyno タイプ」で紹介されている Basic または Professional の dyno タイプにアップグレードしてください。
アプリをスケールする
Heroku でアプリケーションを水平方向にスケーリングすることは、実行中の dyno の数を変更することを意味します。
Web dyno の数を 0 にスケールしてみます。
$ heroku ps:scale web=0
ブラウザを更新するか、heroku open
を実行して、もう一度アプリにアクセスします。リクエストに応答できる Web dyno がアプリにないので、エラーメッセージが表示されます。
もう一度スケールしてみましょう。
$ heroku ps:scale web=1
大規模な dyno にアップグレードすることによって、垂直方向のスケーリングを行うこともできます。詳細は、「dyno タイプ」および「Dyno formation のスケーリング」を参照してください。
ログを表示する
Heroku では、アプリとプラットフォームのコンポーネントの両方の出力ストリームがすべて単一チャネルの時系列ログに集約されます。
実行中のアプリに関する情報を表示するには、heroku logs --tail
コマンドを使います。
$ heroku logs --tail
2021-09-28T02:38:10.241301+00:00 app[web.1]: 2021-09-28 02:38:10.241 INFO 4 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 29967 (http) with context path ''
2021-09-28T02:38:10.259364+00:00 app[web.1]: 2021-09-28 02:38:10.259 INFO 4 --- [ main] com.example.Main : Started Main in 4.128 seconds (JVM running for 4.754)
2021-09-28T02:38:10.473747+00:00 heroku[web.1]: State changed from starting to up
2021-09-28T02:38:20.063423+00:00 app[api]: Scaled to web@0:Eco by user developer@example.com2021-09-28T02:38:22.169497+00:00 app[api]: Scaled to web@1:Eco by user developer@example.com2021-09-28T02:38:23.674418+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=calm-beyond-57162.herokuapp.com request_id=b556d972-c53d-423d-bdc6-76064b678ec1 fwd="204.14.236.156" dyno= connect= service= status=503 bytes= protocol=https
2021-09-28T02:38:24.206795+00:00 app[web.1]: 2021-09-28 02:38:24.206 INFO 4 --- [io-29967-exec-3] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-09-28T02:38:24.206859+00:00 app[web.1]: 2021-09-28 02:38:24.206 INFO 4 --- [io-29967-exec-3] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-09-28T02:38:24.212934+00:00 app[web.1]: 2021-09-28 02:38:24.212 INFO 4 --- [io-29967-exec-3] o.s.web.servlet.DispatcherServlet : Completed initialization in 6 ms
2021-09-28T02:38:24.359785+00:00 heroku[router]: at=info method=GET path="/favicon.ico" host=calm-beyond-57162.herokuapp.com request_id=5ff143f2-5d22-4a62-8141-23946b1c8adc fwd="204.14.236.156" dyno=web.1 connect=0ms service=183ms status=404 bytes=346 protocol=https
ブラウザで再びアプリケーションを表示すると、別のログメッセージが生成されます。
ログのストリーム出力を停止するには、CTRL+C
を押します。
デフォルトで、Heroku では、アプリの最新ログが 1500 行、保存されます。長期の保存のために、ログ記録アドオンをプロビジョニングするか、独自のログドレインを実装することができます。次のステップでは、ログ記録アドオンをアプリに追加します。
アドオンをプロビジョニングする
アドオンは、アプリケーションにデータベース、ログ記録、監視などの追加サービスを提供するクラウドのサービスです。
ログの永続化、検索、アラートなどの機能を提供するいくつかのログ記録アドオンを利用できます。Papertrail は、無料プランで使えるそのようなアドオンです。
次のようにして、アドオンをプロビジョニングします。
$ heroku addons:create papertrail
Creating papertrail on calm-beyond-57162... free
Welcome to Papertrail. Questions and ideas are welcome (technicalsupport@solarwinds.com). Happy logging!
Created papertrail-asymmetrical-88691 as PAPERTRAIL_API_TOKEN
Use heroku addons:docs papertrail to view documentation
このコマンドを使用して、アドオンのプロビジョニングを行い、アプリケーションのためにアドオンを設定します。このアドオンが動作していることを確認するため、アプリケーションの Heroku URL に数回アクセスします。アクセスする度にログメッセージが生成され、Papertrail のアドオンに送られます。Papertrail のコンソールにアクセスし、ログメッセージを確認します。
$ heroku addons:open papertrail
ブラウザで Papertrail の Web コンソールが開き、最新のログイベントが表示されます。このインターフェースでは、検索したり通知を設定したりできます。
次のようにして、アプリのアクティブなアドオンをすべて一覧表示できます。
$ heroku addons
サンプルアプリに対してこのコマンドを実行すると、その Papertrail と Heroku Postgres のアドオンが一覧表示されます。Heroku では、すべての Java アプリのデプロイを使用して、Postgres データベースアドオンを自動的にプロビジョニングします。このデータベースの使用方法は、次のステップで学習します。
データベースを使用する
Heroku には Postgres と Redis のマネージドデータサービスがあり、add-on marketplace には MongoDB や MySQL などの追加のデータサービスがあります。
Heroku では、Postgres ドライバーを含むすべての Java アプリのデプロイを使用して、mini
プランで Heroku Postgres アドオンを自動的にプロビジョニングします。
heroku addons
コマンドを使用すると、アプリに対してプロビジョニングされるデータベースの概要が示されます。
$ heroku addons
Add-on Plan Price State
──────────────────────────────────────────── ───────── ───── ───────
heroku-postgresql (postgresql-concave-20762) mini mini created
└─ as DATABASE
papertrail (papertrail-asymmetrical-88691) choklad free created
└─ as PAPERTRAIL
The table above shows add-ons and the attachments to the current app (calm-beyond-57162) or other apps.
アプリの環境設定を一覧表示すると、アプリがデータベースに接続するときに使用する URL (DATABASE_URL
) が表示されます。
$ heroku config
=== calm-beyond-57162 Config Vars
DATABASE_URL: postgres://avhrhofbiyvpct:3ab23026d0fc225bde4544cedabc356904980e6a02a2418ca44d7fd19dad8e03@ec2-23-21-4-7.compute-1.amazonaws.com:5432/d8e8ojni26668k
PAPERTRAIL_API_TOKEN: ChtIUu9fHbij1cBn7y6z
heroku pg
コマンドを使用すると、アプリの Heroku Postgres データベースについて、より詳細な情報が表示されます。
$ heroku pg
=== DATABASE_URL
Plan: Mini
Status: Available
Connections: 10/20
PG Version: 13.4
Created: 2021-09-28 02:38 UTC
Data Size: 7.9 MB/1.00 GB (In compliance)
Tables: 0
Rows: 0/10000 (In compliance)
Fork/Follow: Unsupported
Rollback: Unsupported
Continuous Protection: Off
Add-on: postgresql-concave-20762
アプリに対してこのコマンドを実行すると、アプリに Mini
Postgres データベースがあり、現在のデータ件数は 0 行であることが示されます。
デプロイしたサンプルアプリにはデータベース機能が備わっています。これにはアプリの URL に /db
パスを追加することでアクセスできます。たとえば、アプリのルート URL が https://example-app-287.herokuapp.com/
の場合は、https://example-app-287.herokuapp.com/db
にアクセスします。
次のように表示されます。
Database Output
* Read from DB: 2014-08-08 14:48:25.155241
* Read from DB: 2014-08-08 14:51:32.287816
* Read from DB: 2014-08-08 14:51:52.667683
ローカル環境に Postgres がインストールされているという前提で、heroku pg:psql
コマンドを使ってリモートデータベースに接続し、すべての行を表示します。
$ heroku pg:psql
psql (10.1, server 9.6.10)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
DATABASE=> SELECT * FROM ticks;
tick
----------------------------
2018-03-01 20:53:27.148139
2018-03-01 20:53:29.288995
2018-03-01 20:53:29.957118
2018-03-01 21:07:28.880162
(4 rows)
=> \q
次の情報は、サンプルアプリでデータベース機能を実装する方法を示しています。このステップで、サンプルアプリのコードを変更しないでください。
サンプルアプリのコードは、次のようになっています。
private DataSource dataSource;
public static void main(String[] args) throws Exception {
SpringApplication.run(Main.class, args);
}
public DataSource dataSource() throws SQLException {
if (dbUrl == null || dbUrl.isEmpty()) {
return new HikariDataSource();
} else {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(dbUrl);
return new HikariDataSource(config);
}
}
}
このメソッドでは、/db
ルートを使用してアプリにアクセスしたとき、新しい行が tick
テーブルに追加されます。次に、出力に表示するすべての行を返します。
サンプルアプリのコードで示す spring.datasource.url
は、src/main/resources/application.properties
で定義される設定値を参照します。HikariCP データベース接続プールは、この値で初期化されます。
サンプルアプリでは、データベースへの接続のプールを設定するために、spring.datasource.url
が JDBC_DATABASE_URL
の値に設定されています。
spring.datasource.url: ${JDBC_DATABASE_URL:}
アプリに自動的に追加される公式の Heroku Java buildpack では、この JDBC_DATABASE_URL
環境変数が設定されています。この変数は動的であり、heroku config
を実行しても環境設定の一覧に表示されません。次のコマンドを実行すると表示できます。
$ heroku run echo \$JDBC_DATABASE_URL
詳細は、「Heroku PostgreSQL」を参照してください。MongoDB、Redis、または他のデータアドオンも、heroku addons:create
によってインストールできます。
ローカル環境を準備する
以下のステップでは、アプリをローカルで操作し、変更内容を Heroku にプッシュする方法について学習します。このステップでは、依存関係をローカルにインストールすることから開始します。
ローカルディレクトリで mvn clean install
を実行する前に、Maven がインストールされていることを確認します。このコマンドにより依存関係がインストールされ、アプリをローカルで実行できるようシステムが準備されます。
$ mvn clean install
...
[INFO] Installing /Users/example-user/java-getting-started/pom.xml to /Users/example-user/.m2/repository/com/example/java-getting-started/1.0/java-getting-started-1.0.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.201 s
[INFO] Finished at: 2021-09-27T22:38:43-04:00
[INFO] ------------------------------------------------------------------------
Maven がインストールされていないか、'mvn' is not recognized as an internal or external command
のようなエラーを受け取る場合、代わりに以下のラッパーコマンドを使用します。Windows では mvnw clean install
、Mac および Linux では ./mvnw clean install
を実行します。このコマンドにより、Maven のインストールと Maven コマンドの実行の両方が行われます。
Maven のプロセスで、依存関係を使用して JAR がコンパイルおよびビルドされ、アプリケーションの target
ディレクトリに格納されます。この処理は、pom.xml
の spring-boot-maven-plugin
によって提供されます。
アプリで Spring を使用していない場合は、pom.xml
ファイルに次のプラグイン設定を追加します。
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>helloworld</finalName>
</configuration>
</plugin>
依存関係がインストールされたら、アプリをローカルで実行できます。ただし、/db
ルートは機能せず、データベースに接続する必要があります。ローカルで実行するときに /db
ルートにアクセスする必要がある場合、ローカルの Postgres データベースを作成し、ローカルの .env
ファイルを更新します。アプリをローカルで実行するために使用される heroku local
により、アプリのルートディレクトリにある .env
ファイルに基づき環境が自動的に設定されます。JDBC_DATABASE_URL
環境変数にローカルの Postgres データベースの接続文字列を設定します。
JDBC_DATABASE_URL=jdbc:postgresql://localhost:5432/java_database_name
これで、アプリを実行してデータベースに接続するためのローカル環境の準備ができました。
アプリをローカルで実行する
アプリをローカルで実行する前に mvn clean install
がすでに実行されていることを確認します。
heroku local
CLI コマンドを使用して、アプリケーションをローカルで開始します。
$ heroku local web
...
10:38:47 PM web.1 | 2021-09-27 22:38:47.549 INFO 75467 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
10:38:47 PM web.1 | 2021-09-27 22:38:47.657 INFO 75467 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
10:38:48 PM web.1 | 2021-09-27 22:38:48.008 INFO 75467 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
10:38:48 PM web.1 | 2021-09-27 22:38:48.061 INFO 75467 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 5000 (http) with context path ''
Heroku プラットフォームと同じように、heroku local
も Procfile
を確認して実行するコマンドを判断します。
Web ブラウザで http://localhost:5000 を開き、アプリがローカルで実行中であることを確認します。
アプリの /db
ルートにローカルでアクセスする必要がある場合、URL にアクセスする前にローカルの Postgres データベースが実行中であることを確認してください。
アプリのローカルでの実行を停止するには、ターミナルウィンドウに戻り、CTRL+C
を押して終了します。
ローカルの変更をプッシュする
このステップでは、ローカルでアプリに変更を加え、変更を Heroku にデプロイする方法について学びます。以下の依存関係と、それを使用するコードを追加します。
pom.xml
を編集し、<dependencies>
要素内に次のコードを追加して、jscience
の依存関係を追加します。
ファイル pom.xml
の 28 行目に以下を追加します。
<dependency>
<groupId>org.jscience</groupId>
<artifactId>jscience</artifactId>
<version>4.3.1</version>
</dependency>
src/main/java/com/example/Main.java
に以下の import
文を追加して、ライブラリをインポートします。
ファイル src/main/java/com/example/Main.java
の 19 行目に以下を追加します。
import static javax.measure.unit.SI.KILOGRAM;
import javax.measure.quantity.Mass;
import org.jscience.physics.model.RelativisticModel;
import org.jscience.physics.amount.Amount;
Main.java
に以下の hello
メソッドを追加して、ライブラリを使用します。
ファイル src/main/java/com/example/Main.java
の 59 行目に以下を追加します。
@RequestMapping("/hello")
String hello(Map<String, Object> model) {
RelativisticModel.select();
Amount<Mass> m = Amount.valueOf("12 GeV").to(KILOGRAM);
model.put("science", "E=mc^2: 12 GeV = " + m.toString());
return "hello";
}
最後に、上記の内容で src/main/resources/templates/hello.html
ファイルを作成します。
ファイル src/main/resources/templates/hello.html
で、以下のように記述します。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:replace="~{fragments/layout :: layout (~{::body},'hello')}">
<body>
<div class="container">
<p th:text="${science}"/>
</div>
</body>
</html>
Main.java
の最終的なソースコードはこのようになります。変更内容が同じようになっていることを確認します。ローカルで行ったすべての変更の差分はこちらです。
ローカルで変更をテストします。
$ mvn clean install
...
[INFO] Installing /Users/example-user/java-getting-started/pom.xml to /Users/example-user/.m2/repository/com/example/java-getting-started/1.0/java-getting-started-1.0.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.268 s
[INFO] Finished at: 2021-09-27T22:38:51-04:00
[INFO] ------------------------------------------------------------------------
$ heroku local web
...
10:38:55 PM web.1 | 2021-09-27 22:38:55.496 INFO 75574 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
10:38:55 PM web.1 | 2021-09-27 22:38:55.608 INFO 75574 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
10:38:55 PM web.1 | 2021-09-27 22:38:55.951 INFO 75574 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
10:38:56 PM web.1 | 2021-09-27 22:38:56.004 INFO 75574 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 5000 (http) with context path ''
http://localhost:5000/hello でアプリケーションの /hello
パスにアクセスすると、科学的な換算式が表示されます。
E=mc^2: 12 GeV = (2.139194076302506E-26 ± 1.4E-42) kg
テスト後に、変更内容をデプロイします。Heroku のデプロイは、ほとんどの場合、このパターンで行います。まず、git add
コマンドを使用して、編集したファイルをコミットのためにステージングします。
$ git add .
次に、変更内容をリポジトリにコミットします。
$ git commit -m "Demo"
前と同じ方法でデプロイします。
$ git push heroku main
最後に、そのルートでブラウザを開いて、更新されたコードが正しくデプロイされていることを確認します。
$ heroku open hello
環境設定を定義する
Heroku では、暗号鍵や外部リソースのアドレスなどのデータを環境設定に保存することで、アプリの設定を外部に置くことができます。
ランタイムでは、環境設定は環境変数としてアプリに提供されます。例として、src/main/java/com/example/Main.java
を編集し、環境変数 ENERGY
から energy の値を取得するメソッドを追加します。
ファイル src/main/java/com/example/Main.java
の 56 行目に以下を追加します。
@RequestMapping("/hello")
String hello(Map<String, Object> model) {
RelativisticModel.select();
String energy = System.getenv().get("ENERGY");
if (energy == null) {
energy = "12 GeV";
}
Amount<Mass> m = Amount.valueOf(energy).to(KILOGRAM);
model.put("science", "E=mc^2: " + energy + " = " + m.toString());
return "hello";
}
mvn clean install
を実行して、この変更を統合するようアプリを再コンパイルします。
heroku local
は、アプリのルートディレクトリにある .env
ファイルに基づいて、ローカル環境を自動的に設定します。サンプルアプリには、すでに以下の内容の .env
ファイルがあります。
ENERGY=20 GeV
アプリのローカル実行 ステップで設定した場合、ローカルの .env
ファイルには、JDBC_DATABASE_URL
変数も含まれています。
.env
ファイルをバージョン管理にコミットしないでください。多くの場合、このファイルには機密性の高い資格情報が入っているためです。.env
は、リポジトリの .gitignore
ファイルに入れてください。サンプルアプリのリポジトリには、このチュートリアルステップの例としての .env
ファイルのみを格納します。
heroku local
でアプリを実行して http://localhost:5000/hello にアクセスすると、換算値として 20 GeV が表示されます。
ローカルで期待通り機能することがわかったので、Heroku 上で実行するアプリの環境設定としてこの変数を設定します。以下を実行します。
$ heroku config:set ENERGY="20 GeV"
Setting ENERGY and restarting calm-beyond-57162... done, v9
ENERGY: 20 GeV
heroku config
を使用してアプリの環境設定を表示し、正しく操作したことを確認します。
$ heroku config
=== calm-beyond-57162 Config Vars
DATABASE_URL: postgres://avhrhofbiyvpct:3ab23026d0fc225bde4544cedabc356904980e6a02a2418ca44d7fd19dad8e03@ec2-23-21-4-7.compute-1.amazonaws.com:5432/d8e8ojni26668k
ENERGY: 20 GeV
PAPERTRAIL_API_TOKEN: ChtIUu9fHbij1cBn7y6z
ローカルでの変更内容を Heroku にデプロイし、/hello
ルートにアクセスして動作中の変更内容を確認します。
$ git add .
$ git commit -m "Demo"
$ git push heroku main
$ heroku open hello
One-off Dyno を開始する
heroku run
コマンドを使用して、One-off dyno 内のアプリでメンテナンスや管理のタスクを実行できます。このコマンドでは、アプリの環境で試行錯誤するためにローカルのターミナルにアタッチされた REPL プロセスや、デプロイされたアプリケーションコードを起動することもできます。
$ heroku run java -version
Running java -version on calm-beyond-57162... connecting, run.4685 (Eco)Running java -version on calm-beyond-57162... up, run.4685 (Eco)
openjdk version "1.8.0_302-heroku"
OpenJDK Runtime Environment (build 1.8.0_302-heroku-b08)
OpenJDK 64-Bit Server VM (build 25.302-b08, mixed mode)
Error connecting to process
というエラーが表示された場合は、ファイアウォールを設定します。
必ず exit
と入力してシェルを閉じ、dyno を終了してください。
次のステップ
おめでとうございます! ここまでは、アプリのデプロイ、アプリの設定変更、アプリのスケール、ログの表示、アドオンのアタッチ、ローカルでの実行方法を説明しました。
引き続き Heroku を活用するためにお勧めするリソースを以下に紹介します。
- 「Heroku の仕組み」では、アプリの作成、設定、デプロイ、および実行時に必要な技術的な概念の概要を紹介しています。
- 「Java カテゴリ」では、Java アプリケーションの開発とデプロイに関する詳細を確認できます。
- 「デプロイカテゴリ」では、デプロイを効率的かつ簡単に行うことができるようにする、多くの強力な統合や機能を紹介しています。
- Heroku の開発者としての体験および CI/CD 機能についての詳細は、「Heroku Enterprise Developer Learning Journey」を参照してください。