投稿者:國藤(エヌアイシー・ソフト)



こんにちは。先日開催された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 を上書きするので、この時点では何を選んでも構いません。

Spring_boot_app2.png 拡大版


以下のような manifest.yml を作成して、プロジェクトルートフォルダに配置します。
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_app3.png
拡大版


サービスへの接続


Spring boot 特有の Tips ではありませんが、サービスへの接続も確認しておきましょう。今回は Cloudant に接続してみます。
まず、クライアントライブラリを追加します。(Mavenの例)



Pom.xml

<dependency>
	<groupId>com.cloudant</groupId>
	<artifactId>cloudant-client</artifactId>
	<version>2.11.0</version>
</dependency>





IBM Cloud 上でCloudantに接続します。

Spring_boot_app4.png
拡大版



アプリケーションから接続する際は、以下のように VCAP_SERVICES から接続情報を取得します。

	CloudantClient client = ClientBuilder.bluemix( System.getenv("VCAP_SERVICES") ).build();
	Database db = client.database("log", true);


上述の方法で push すると、接続できていることが確認できました。

Spring_boot_app5.png
拡大版



まとめ


いくつか、知らないとつっかかる点がありますが、簡単な設定で IBM Cloud 上で Spring boot App を動かせることがお分かりいただけたと思います。
また、buildpack はさまざまなものが公開されています。眺めているだけでも楽しい気持ちになれますね。