LoginSignup
2
1

More than 5 years have passed since last update.

IBM Cloudantを使用するSpring BootのWebアプリを作成し、Cloud Foundryにデプロイする

Last updated at Posted at 2018-09-04

IBM Cloudantを使いたいと思うことあるかもしれませんが、QiitaにはNodeRedの記事が多いですね。。。
javaで使いたい人向けの記事があまりないので入門編として掲載します。
また、IBMのCloud Foundryにデプロイするまで書きます。

dependency

Spring boot 2.0.4
cloudant-client 2.12.0
okhttp3 3.11.0
※ okhttp3についてjava 1.7以上が必須なので、パフォーマンスなどを気にしなければ省いても良い

cloudantの認証について

cloudantの認証も以前はHMAC keyを発行しなければならなかったのですが、
2018/08/21 現在ではHMAC、VCAP_SERVICES、IAM API key、 ローカル認証やaccount endpoint?など多彩な認証によって認証が可能なようです。

どの認証方式でも良いのですが、今回はローカル環境とCloud Foundry環境の違いを気にすることなくかけるVCAP_SERVICESを利用します。

Cloud FoundryとCludantの接続、VCAP_SERVICEの取得

Cludantを起動してCloud Foundryに接続し、VCAP_SERVICESに接続するまでを記載します。

Cloudantを作成する

cloudantを作成します。
cloudant-0.png
cloudant-2.png
できたらDashboardにアクセスしDBを作成してデータを登録します。
cloudant-3.png

Cloud Foundryを作成しCloudantを接続する

Cloud Foundryを作成します。サービスはあとで書き換えますが一応Tomcatで作成しています。
cf-0.png
cf-1.png

作成できたらCloudantを接続します。

cf-2.png
cf-3.png

とりあえずIAMを自動作成します。
cf-4.png

指示に従ってアプリを再起動します。
cf-5.png
cf-6.png

VCAP_SERVICESを取得する

Cloud Foundryにアクセスし、Runtimeのタブを開くとEnvironment Variablesの項目にVCAP_SERVEICEが作成されています。
cf-7.png

application.ymlやapplication.propertiesに登録する際は、JSONの改行を消して1行にして記載しましょう!

実装

propertiesファイルにVCAP_SERVEICESを1行にしたものを記載します。1
また、この設定でCloud Foundry環境にデプロイした場合、変数の優先度の関係でローカルではpropertiesの変数、本番ではCloud Foundryの変数が使われるようになり良い感じに開発できます。

application.properties
VCAP_SERVICES={ YOUR_VCAP_SERVICES_JSON : YOUR_JSON_PROPERTIES }
CloudantConfiguration.java
@Configuration
public class CloudantConfiguration {

    @Value("${VCAP_SERVICES}")
    private String vcapService;

    @Bean
    public CloudantClient cloudantClient()  {
        return ClientBuilder.bluemix(vcapService).build();
    }

}

受け取るDaoを作成していない場合はJsonObjectで受け取るのが良いです。
cloudantのライブラリがデフォルトで使用しているclassなので問題なく動作します。

CloudantdemoApplication.java
@RestController
@SpringBootApplication
public class CloudantdemoApplication {

    @Autowired
    CloudantClient cloudantClient;

    public static void main(String[] args) {
        SpringApplication.run(CloudantdemoApplication.class, args);
    }

    @RequestMapping("/")
    public String index() {
        Database db = cloudantClient.database("users",false);
        QueryResult<JsonObject> result  = db.query(new QueryBuilder(eq("name","LLENN")).build(), JsonObject.class);
        return result.getDocs().toString();
    }
}

$ mvn spring-boot:runなどでアプリを実行し、curlを投げると以下のように返却されます。

$ curl http://localhost:8080/
[{"_id":"18f6e5d603317e7a8189513270bc6e28","_rev":"1-487469bb37faf2e391ce4f8897b54e75","name":"LLENN"}]

Cloud Foundryにデプロイする

pom.xmlでwarを出力するように設定し、
ソースコードをビルドします。

$ mvn -DskipTests=true package

作成した環境にデプロイします。
IBM Cloud CLIのbxコマンドを使用します。

# bx コマンドでログインします。
$ bx login

# cloud foundryの環境を選択します。
$ bx target --cf

# アプリの一覧を取得します。
$ bx cf apps

名前           要求された状態   インスタンス   メモリー   ディスク   URL
Cludant-Demo   started          1/1            768M       1G         Cludant-Demo.mybluemix.net

# アプリをCloud Foundryにデプロイします。
$ bx cf push Cludant-Demo -p ./target/cloudantdemo-0.0.1-SNAPSHOT.war -b https://github.com/cloudfoundry/java-buildpack.git
...
...
     状態   開始日時               CPU    メモリー       ディスク     詳細
#0   実行   2018-09-01T00:00:00Z   0.0%   1.1M of 768M   1.3M of 1G   

自動でCloud Foundryが起動されるので、URLにcurlでアクセスしてみます。

$ curl https://Cludant-Demo.mybluemix.net/
[{"_id":"18f6e5d603317e7a8189513270bc6e28","_rev":"1-487469bb37faf2e391ce4f8897b54e75","name":"LLENN"}]

確認が終わったら停止させておきましょう。

$ bx cf stop Cludant-Demo

備考

ソースコードは以下です。
https://github.com/amanoese/cloudant-demo

参考

https://console.bluemix.net/docs/cli/index.html
https://github.com/cloudant/java-cloudant

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1