こんにちは。先日開催されたGeekイベント「TechCon 2018」(社内イベント)にて、参加者が投票を行うアプリを作成しました。その際、IBM Cloud 上で Spring boot アプリを動かしてみましたので、今回は設定方法を中心にご紹介します。
Spring boot App
DIコンテナを核とした様々なプロジェクトの集合体がSpringです。Spring boot は 従来、XMLファイルでの設定が必要だった箇所が、アノーテーションベースに対応し、必要な設定が少なくなった点が大きな違いです。もう一点、Apache tomcat を内包した jar が生成される点も違います。そのため、J2EEアプリケーションサーバ上ではなく、Java アプリケーションとして起動する必要があります。
ディプロイまでの流れ
まず、IBM Cloud上でCloudFoundry アプリを作成します。この時、Liberty for Java など、いくつかのランタイムがありますが、後程 buildpack を上書きするので、この時点では何を選んでも構いません。
以下のような manifest.yml を作成して、プロジェクトルートフォルダに配置します。
---
applications:
- name: TechCon2018
buildpack: https://github.com/cloudfoundry/java-buildpack.git
memory: 1024M
instances: 1
path: target/TechCon2018-0.0.2-SNAPSHOT.jar
env:
SPRING_PROFILES_ACTIVE: cloud
(1) buildpack
Javaアプリケーションとして起動するため、java-buildpackを指定します。
(2) memory
デフォルト値のままだと、メモリが不足して立ち上がりませんでした。600M 程度必要なようですが、余裕を見て
1G を指定しています。
(3) env
アクティブなプロファイル(Springの概念です)に
cloud を含めます。こうすることで、cloud(CloudFoundry)
に最適化された bean がインジェクションされるようです。
manifest.yml を置いたディレクトリまで移動して、bxコマンドでログインまで済ませて、以下のコマンドで ディプロイします。
bluemix app push TechCon2018 > nul
私の環境では、push 時のログのエスケープシーケンスが文字化けして、push が終わってもコマンドラインに返ってこない状態になったので、リダイレクトして捨てています。しばらく待つと、ディプロイされて立ち上がってきました。ビルドパックも変更されています。
サービスへの接続
Spring boot 特有の Tips ではありませんが、サービスへの接続も確認しておきましょう。今回は Cloudant に接続してみます。
まず、クライアントライブラリを追加します。(Mavenの例)
<dependency>
<groupId>com.cloudant</groupId>
<artifactId>cloudant-client</artifactId>
<version>2.11.0</version>
</dependency>
IBM Cloud 上でCloudantに接続します。
アプリケーションから接続する際は、以下のように VCAP_SERVICES から接続情報を取得します。
CloudantClient client = ClientBuilder.bluemix( System.getenv("VCAP_SERVICES") ).build();
Database db = client.database("log", true);
上述の方法で push すると、接続できていることが確認できました。
まとめ
いくつか、知らないとつっかかる点がありますが、簡単な設定で IBM Cloud 上で Spring boot App を動かせることがお分かりいただけたと思います。
また、buildpack はさまざまなものが公開されています。眺めているだけでも楽しい気持ちになれますね。