Heroku に Spring Boot アプリケーションをデプロイする
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2023年04月04日(火)
Spring Boot 型のスタンドアロンアプリケーションのデプロイは、Heroku にとても適しています。Heroku への Spring アプリケーションのデプロイには Maven か Gradle を使用できますが、このガイドでは、Maven を使用していて、コンピュータに Maven 3 がインストールされていることを前提としています。
初めに、無料の Heroku アカウントを作成します。 次に、Heroku CLI をダウンロードしてインストールします。
インストールしたら、ターミナルから heroku
コマンドを使用して、Heroku アカウントを作成したときに使用したメールアドレスとパスワードでログインします。
$ 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
Spring Boot アプリを作成する
新しい Spring Boot アプリケーションを作成するには、まず、Spring Boot のドキュメント に記載されている説明に従って Spring Boot CLI をインストールします。これにより、パスに spring
コマンドが追加されます。
必要に応じて、実際に稼働しているサンプルアプリ から始めることもできます。
CLI で次のコマンドを実行して、新しいアプリケーションを作成します。
$ spring init --dependencies=web demo
作成したら、アプリケーションのディレクトリに移動します。
$ cd demo
デフォルトでは、アプリケーションにカスタムロジックはありません。ただの空のテンプレートです。動作を追加するには、src/main/java/com/example/demo/DemoApplication.java
ファイルを開いて、次のコードを追加します。
ファイル src/main/java/com/example/demo/DemoApplication.java
で、以下のように記述します。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.*;
@Controller
@SpringBootApplication
public class DemoApplication {
@RequestMapping("/")
@ResponseBody
String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
このコードにより、ブラウザに「Hello World!」と表示される簡単なリクエストマッピングが作成されます。ローカルでアプリケーションを実行してこのコードを確認することもできますが、今回は直接 Heroku での実行に進みます。
Heroku で Spring Boot アプリを準備する
Heroku にアプリをデプロイする前に、次のコマンドを実行して、アプリケーションの Git リポジトリを作成し、そのリポジトリにすべてのコードを追加する必要があります。
$ git init
$ git add .
$ git commit -m "first commit"
この Git リポジトリを Heroku にプッシュすると、アプリがデプロイされます。Heroku Maven プラグイン を使用してデプロイすることもできますが、このガイドでは、Git と Heroku CLI を使用する方法のみ説明します。
Heroku にデプロイするためには、まず、新しい Heroku アプリをプロビジョニングする必要があります。次のコマンドを実行します。
$ heroku create
Creating app... done, tranquil-mountain-19785
https://tranquil-mountain-19785.herokuapp.com/ | https://git.heroku.com/tranquil-mountain-19785.git
このコマンドにより、heroku
という名前のリモートリポジトリもローカルの Git リポジトリに作成されます。Heroku によってランダムなアプリ名 (この場合は nameless-lake-8055
) が生成されます。この名前は、後で heroku apps:rename
コマンドで変更できます。
コードをデプロイします。
$ git push heroku main
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Java app detected
remote: -----> Installing JDK 1.8... done
remote: -----> Executing Maven
...
remote: [INFO] BUILD SUCCESS
remote: [INFO] ------------------------------------------------------------------------
remote: [INFO] Total time: 15.129 s
remote: [INFO] Finished at: 2020-05-20T09:17:47Z
remote: [INFO] ------------------------------------------------------------------------
remote: -----> Discovering process types
remote: Procfile declares types -> (none)
remote: Default types for buildpack -> web
remote:
remote: -----> Compressing...
remote: Done: 65M
remote: -----> Launching...
remote: Released v3
remote: https://tranquil-mountain-19785.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/tranquil-mountain-19785.git
* [new branch] main -> main
pom.xml
ファイルが存在するため、このアプリケーションは自動的に Maven/Java アプリとして検知されます。デフォルトでは Java 8 がインストールされますが、Java のバージョンは、Dev Center の記事「Java のバージョンを指定する」の説明に従って、system.properties
ファイルで簡単に設定できます。デフォルトのコマンドを使用してアプリが実行されます。
これでアプリケーションがデプロイされました。次のコマンドを実行すると、アプリの URL にアクセスできます。
$ heroku open
ブラウザに「Hello World!」というテキストが表示されます。
次のコマンドを実行すると、アプリケーションのログを表示できます。
$ heroku logs --tail
2020-05-20T09:18:00.899237+00:00 app[web.1]: 2020-05-20 09:18:00.899 INFO 4 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to default profiles: default
2020-05-20T09:18:02.348822+00:00 app[web.1]: 2020-05-20 09:18:02.348 INFO 4 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 40371 (http)
2020-05-20T09:18:02.365045+00:00 app[web.1]: 2020-05-20 09:18:02.364 INFO 4 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2020-05-20T09:18:02.365316+00:00 app[web.1]: 2020-05-20 09:18:02.365 INFO 4 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.35]
2020-05-20T09:18:02.457002+00:00 app[web.1]: 2020-05-20 09:18:02.456 INFO 4 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2020-05-20T09:18:02.457162+00:00 app[web.1]: 2020-05-20 09:18:02.457 INFO 4 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1486 ms
2020-05-20T09:18:02.692238+00:00 app[web.1]: 2020-05-20 09:18:02.691 INFO 4 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2020-05-20T09:18:02.891409+00:00 app[web.1]: 2020-05-20 09:18:02.891 INFO 4 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 40371 (http) with context path ''
2020-05-20T09:18:02.903573+00:00 app[web.1]: 2020-05-20 09:18:02.903 INFO 4 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 2.739 seconds (JVM running for 3.302)
2020-05-20T09:18:03.300746+00:00 heroku[web.1]: State changed from starting to up
ブラウザでアプリケーションをリロードすると、そのリクエストの別のログメッセージが生成されます。ログのストリーム出力を停止するには、Control+C
を押します。
Heroku での Maven ベースの Java アプリケーションのデプロイに関する基本の詳細については、「Heroku スターターガイド (Java)」を参照してください。このガイドでは、Spring Boot 以外でも使用できる多くのステップを説明しています。
この記事の後半では、調整する必要がある最も一般的な設定について、ざっと概要を説明します。
データベースに接続する
CLI から次のコマンドを実行すると、アプリに PostgresSQL データベースをアタッチできます。
$ heroku addons:create heroku-postgresql
MySQL または別のデータベースベンダーを使用する場合は、使用可能なデータベースを Add-ons Marketplace で確認します。
次に、アプリの環境設定をリスト表示して、データベースに接続するために必要な URL (DATABASE_URL) を表示できます。
$ heroku config
=== tranquil-mountain-19785 Config Vars
DATABASE_URL: postgres://user:password@ec2-1-2-3.compute-1.amazonaws.com:5432/databasename
Heroku には、さらに詳細を表示する pg
コマンドもあります。
$ heroku pg
=== DATABASE_URL
Plan: Mini
Status: Available
Connections: 0/20
PG Version: 14.2
Created: 2020-05-20 09:18 UTC
Data Size: 7.9 MB
Tables: 0
Rows: 0/10000 (In compliance)
Fork/Follow: Unsupported
Rollback: Unsupported
Continuous Protection: Off
Add-on: postgresql-animated-55555
表示内容から、Mini データベースが Postgres 14.2 で稼働していて、1 行のデータがあることがわかります。
データベースアドオンが作成されると、環境変数 SPRING_DATASOURCE_URL
、SPRING_DATASOURCE_USERNAME
、SPRING_DATASOURCE_PASSWORD
が自動的に設定されます。次のようにして PostgreSQL JDBC ドライバを依存関係に追加すれば、ほかの設定を行わなくても、これらの環境変数により Spring Boot アプリケーションからデータベースに接続できます。
ファイル pom.xml
の 26 行目に以下を追加します。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
application.properties
でアプリケーションのデータベース設定をカスタマイズできます。次に例を示します。
ファイル src/main/resources/application.properties
で、以下のように記述します。
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.maxActive=10
spring.datasource.maxIdle=5
spring.datasource.minIdle=2
spring.datasource.initialSize=5
spring.datasource.removeAbandoned=true
次に、設定 Bean をアプリに追加できます。
ファイル src/main/java/demo/DatabaseConfig.java
で、以下のように記述します。
package com.example.demo;
import com.zaxxer.hikari.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import javax.sql.DataSource;
@Configuration
public class DatabaseConfig {
@Value("${spring.datasource.url}")
private String dbUrl;
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(dbUrl);
return new HikariDataSource(config);
}
}
詳細は、「Java を使用して Heroku でリレーショナルデータベースに接続する」を参照してください。
これで、アプリケーションからデータベースに接続できます。Heroku ガイドの「Java アプリのデータベース移行を実行する」の説明に従って、データベースを初期化できます。サンプルアプリでは、Liquibase を使用しています。
起動コマンドをカスタマイズする
Procfile
を使用して、アプリの実行やカスタムプロセスタイプの定義に使用するデフォルトコマンドをオーバーライドできます。適切なコマンドは、アプリで行う必要がある処理に応じて変わります。Web プロセスを実行したり、データベースの移行を実行するには、一般的なプロセスタイプを使用します。
次のステップ
Heroku で実行する Spring Boot アプリの詳細な例については、次の情報を参照してください。
Heroku には、Spring アプリケーション用の機能が豊富にあります。アドオンをプロビジョニングして、永続化、ログ記録、監視などのサードパーティ製のクラウドサービスを導入できます。 add-on marketplace には、Redis や MongoDB、Postgres、MySQL など、多数のデータストアが揃っています。
「Heroku の仕組み」では、 アプリケーションの作成、設定、デプロイ、および実行時に必要な技術的な概念の概要を紹介しています。 「Dev Center の Java カテゴリ」では、 Spring アプリケーションの開発とデプロイに関する詳細を確認できます。 Heroku への移行時にアプリケーションで問題が発生した場合は、Heroku のいずれかのサポートチャネルにお知らせください。
Spring アプリのデプロイに関する詳細は、「Spring のドキュメント」を参照してください。Heroku へのデプロイについては、「Spring Boot のドキュメント」を参照してください。