SpringBootでIBMCloudantに接続する手順

Pocket

IBMCloud環境のデータベース(NoSQL)IBM Cloudantを利用する方法です。

ネット上の記事など多いのですが、node.jsだったり認証が部分的に記述されていたりしてうまく実装できませんでした。最終的にIBMの資料(チュートリアル)をベースに進めて動作を確認できました。

特に理解するのに苦しんだ点は以下。
・IBM Cloudantの認証
・ローカルにおけるプロキシ環境下の接続

まずはIBMCloudにログインし、IBM Cloudantの資料にあるLiberty for JavaおよびIBM Cloudantの入門チュートリアル通りに作業します。
①IBM Cloudにログインし、カタログを選択する

②データベースを選択した後、Cloudantを選択する

③資料の表示を選択する

④チュートリアルの概説にあるLiberty for JavaおよびIBM Cloudantを選択する

以降はチュートリアル通りに作業します。ただし作業順が入れ替えた方が良いかと思われます。私はSTSを使ってmavenの作業を短縮しています。
※サンプルアプリ:get-started-java(Github)
【サイトの作業順】
(1)Githubからサンプルアプリケーションを取得する
(2)mavenコマンドでプログラムをwarファイル化する
(3)mavenコマンドでliberty環境でプログラムを起動する(ローカルでの起動確認)
(4)CLIを使い、IBM Cloud(Cloud Foundry)にサンプルアプリケーションをpushする
(5)IBM Cloud上でCloudantのサービスを作成する
(6)IBM Cloud上で、(4)で登録したCloud Foundryを(5)のIBM Cloudantサービスと接続する
(7)資格情報の中のURL情報を控え、サンプルアプリの設定ファイルに記述する
 ※再度、Cloud Foundryにアプリを上げ直す
【実際の作業順】
(1)STS上で、Githubからサンプルアプリケーションをインポートする
(2)maven installを行う(warファイル作成)
(3)IBM Cloud上でCloudantのサービスを作成する
(4)IBM Cloud上でサンプルアプリを動かすためのCloud Foundryアプリケーションを作成する
(5)IBM Cloud上で(4)のCloud Foundryアプリを(3)のIBM Cloudantサービスと接続する
(6)資格情報の中のURL情報を控え、サンプルアプリの設定ファイルに記述する
(7)CLIを使い、IBM Cloud(Cloud Foundry)にサンプルアプリケーションをpushする

ここで作業時に困ったのが以下の点。
【1】IBM Cloudantとの認証方法
【2】サンプルアプリの内容

【1】IBM Cloudantとの認証方法
IAM、VCAP_SERVICES、urlなど、用語の意味がよく分かりません。
とりあえず自分なりに理解した感じだと、IAMはサービスごと個別にIDやパスワードを発行するのではなく、根本的なユーザ情報(IBM Cloudアカウント)に基づいて発行した別の情報(urlやapikeyなど)を使って認証する方法のようです。
とりあえず認証が確認できたやり方は以下の2つ。
①urlを使った認証
IBM Cloudant側でサービス資格情報を新規作成し、そのurl情報を使うか、Cloud FoundryアプリをCloudantと接続した際に自動設定される環境変数VCAP_SERVICESの内容のurl情報を使います。
サンプルアプリケーションではurl情報を設定ファイル内に記載して使用します。
②VCAP_SERVICESを使った認証
Cloud FoundryアプリをCloudantと接続した際に自動設定される環境変数VCAP_SERVICESの内容です。ローカル実行する際は存在しない変数なので、実行時の環境変数として設定しておくとよいです。STSやEclipseなどでは実行構成から設定できます。

プログラムをGithub等で公開している場合は「②VCAP_SERVICESを使った認証」が良いかと思います。ローカル実行ではIDE等の設定として記録するのでGithub等には公開されません。本番環境ではIBM Cloud Foundryに環境変数が設定済みなので問題なく動作します。

【2】サンプルアプリの内容
サンプルアプリはJavaですが、Apache GeronimoやApache CXFなどのフレームワークを使っており、画面はjqueryを使った実装になっています。更にliberty環境で動作するための設定、MongoDB、kubenetes関連のファイルまで含んでいるため、重要な箇所を見付け辛くなっています。
「VisitorAPI.java」というクラスがSpringBootでいうControllerクラスとなってHTTPリクエストを処理しているので、このクラスを中心に処理を追うとよいかと思われます。

私はSpringBootで動作するか確認したかったので、pom.xmlの内容を一掃してSpringBoot用に置き換え、エラーの出たファイルのうち不要そうなものを削除しました。使用しないMongoDB、kubenetis、wlp(liberty関連)のファイルも削除しています。

SpringBootとしてサンプルアプリを作り変えましたが、問題なく動作することを確認しています。

最後に、ローカルの開発がプロキシ環境下にある場合は以下で対応可能です。
クラス「CloudantVisitorStore.java」のメソッド「private static CloudantClient createClient()」にプロキシ接続を記述します。最後の方にある以下の箇所を修正してください。
【修正前】

CloudantClient client = ClientBuilder.url(new URL(url)).build();

【修正後】

CloudantClient client = ClientBuilder.url(new URL(url)).proxyURL(new URL("http://IPアドレス:ポート番号")).proxyUser("").proxyPassword("").build();

私はローカルのプロキシ環境に加えてフィルタリングも施されたネットワークを使っています。今までIBMCloudでフィルタリングにひっかかったことはなかったのですが、このCloudantとの接続はフィルタリングに引っかかってしまいました。

困った。。。

広告

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です