オープンソースのPaaSソフトウェア CloudFoundry の技術情報やイベント告知などを掲載します

2015-09-29

spring-boot-cf-service-broker-mongoを Cloud Foundry で動かす

「Cloud Foundry 百日行」第68回目は,spring-boot-cf-service-broker-mongo です。
このアプリは、Cloud Foundry (以下CF) の service broker として機能するアプリで、百日行第2回目のpostgresql-cf-service-brokerと同じ位置づけのアプリケーションとなり、デプロイする事でmongodbが簡単にサービスとして利用可能になります。

基本情報

全体の概要は以下のようなイメージとなります。

全体の流れは概略以下の様になっています:

  1. MongoDB(ver 2.6) インスタンスの準備
  2. spring-boot-cf-service-broker-mongo のデプロイ
  3. Service Broker 化

MongoDB(ver 2.6) インスタンスの準備

今回は検証用ということで,MongoDB(ver 2.6) は Docker を使って用意することにしました。

手順の概要は以下の通りです:

  • 1) Docker のインストール
  • 2) MongoDB Clientのインストール
  • 3) MongoDB Docker Image の起動

Docker のインストール

CFは Ubuntu 上で動作するので,同じ Ubuntu 上で MongoDB Docker image を動かします。まずは Ubuntu に Docker をインストールします。

$ sudo apt-get install -y docker.io

確認:

$ sudo docker version
Client:
 Version:      1.8.2
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   0a8c2e3
 Built:        Thu Sep 10 19:19:00 UTC 2015
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.2
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   0a8c2e3
 Built:        Thu Sep 10 19:19:00 UTC 2015
 OS/Arch:      linux/amd64

MongoDB Clientのインストール

※こちらの手順はMongoDBの動作確認の為の手順となります。spring-boot-cf-service-broker-mongo の動作には必須ではない為、こちらの手順は省略してしまっても問題ありません。
$ sudo apt-get install -y mongodb-clients

確認:

$ mongo --version
MongoDB shell version: 2.4.9

MongoDB Docker Image の起動

Docker Image の取得

$ sudo docker pull mongo:2.6

※MongoDBのバージョンがタグ指定で2.6になっているのはspring-boot-cf-service-broker-mongoが2.6でないと正常に動かない為です。

Docker image の起動

ホストのポート 27017 をコンテナーのポート 27017 に転送に設定し、取得した Docker Image を起動します。

$ sudo docker run -p 27017:27017 -d mongo:2.6

接続確認

$  mongo --port 27017
MongoDB shell version: 2.4.9
connecting to: 127.0.0.1:27017/test

以上でMongoDBインスタンスの準備は完了です。

spring-boot-cf-service-broker-mongo のデプロイ

続いてspring-boot-cf-service-broker-mongoをCF上にデプロイしていきます。

以下手順の概要です:

  • 0) デプロイ準備
    • 0.1) JDK, Gradle のインストール
    • 0.2) ソースコードの取得
    • 0.3) ソースコードの修正
    • 0.4) アプリのビルド
    • 0.5) Org, Space の作成
    • 0.6) Application Security Group の開放
  • 1) デプロイ
    • 1.1) アプリのPush

デプロイ準備

JDK, Gradle のインストール

このアプリは名前からもわかるようにspring-bootのアプリケーションですのでJDKとGradleを導入します。

  • Oracle JDK8

OracleのJDK 8のページから環境に応じたtar.gzを取得します。
※記事執筆時点の最新版はjdk-8u60-linux-x64.tar.gzでした。

$ ls -lha jdk-8u60-linux-x64.tar.gz
-rw-rw-r-- 1 morika-t morika-t 173M Aug  7 08:32 jdk-8u60-linux-x64.tar.gz

tar.gzの展開

$ tar zxfv jdk-8u60-linux-x64.tar.gz

JAVA_HOMEの設定とPATHを通します。

$ export JAVA_HOME=~/work/jdk1.8.0_60
$ export PATH=$JAVA_HOME/bin:$PATH

バージョン確認

$ java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
  • Gradle
$ wget https://services.gradle.org/distributions/gradle-2.5-all.zip
$ unzip gradle-2.5-all.zip

GRADLE_HOMEの設定とPATHを通します。

$ export GRADLE_HOME=~/work/gradle-2.5
$ export PATH=$GRADLE_HOME/bin:$PATH

バージョン確認

$ gradle -version
------------------------------------------------------------
Gradle 2.5
------------------------------------------------------------

Build time:   2015-07-08 07:38:37 UTC
Build number: none
Revision:     093765bccd3ee722ed5310583e5ed140688a8c2b

Groovy:       2.3.10
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0_60 (Oracle Corporation 25.60-b23)
OS:           Linux 3.13.0-55-generic amd64

ソースコードの取得

アプリのソースコードをGitHubからcloneします。

$ git clone https://github.com/spgreenberg/spring-boot-cf-service-broker-mongo
$ cd spring-boot-cf-service-broker-mongo

ソースコードの修正

アプリをビルドする前に、今回の検証環境のcf-release v211でサポートされるservice broker APIバージョン2.5にアプリを対応させる為に、ソースコードの修正を行います。
※執筆時点のspring-boot-cf-service-broker-mongoの最新版コードで対応するバージョンはservice broker APIのバージョン2.4

Service Broker API versionのヘッダーチェック箇所を無効化する修正

参考URL: https://github.com/cloudfoundry-community/spring-boot-cf-service-broker/blob/a30748549291e6ab2b0b793be3514b249708f47c/README.md#api-version-verification

$ vi src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/CatalogConfig.java
$ git diff src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/CatalogConfig.java
diff --git a/src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/CatalogConfig.java b/src/main/java/org/cloudfoundry
index 295b844..9b51e87 100644
--- a/src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/CatalogConfig.java
+++ b/src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/CatalogConfig.java
@@ -8,6 +8,7 @@ import java.util.Map;
 import org.cloudfoundry.community.servicebroker.model.Catalog;
 import org.cloudfoundry.community.servicebroker.model.Plan;
 import org.cloudfoundry.community.servicebroker.model.ServiceDefinition;
+import org.cloudfoundry.community.servicebroker.model.BrokerApiVersion;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;

@@ -15,6 +16,11 @@ import org.springframework.context.annotation.Configuration;
 public class CatalogConfig {

        @Bean
+       public BrokerApiVersion brokerApiVersion() {
+               return new BrokerApiVersion();
+       }
+
+       @Bean

Service Catalogのrequireにsyslog_drainを追加する修正

参考URL:
http://cf-dev.70369.x6.nabble.com/cf-dev-Document-for-service-broker-api-version-2-5-tp537p582.html
http://docs.cloudfoundry.org/services/app-log-streaming.html

$ vi src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/CatalogConfig.java

$ git diff src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/CatalogConfig.java
@@ -30,7 +36,7 @@ public class CatalogConfig {
                                                                        getPlanMetadata())),
                                        Arrays.asList("mongodb", "document"),
                                        getServiceDefinitionMetadata(),
-                                       null,
+                                       Arrays.asList("syslog_drain"),
                                        null)));
        }

接続先のMongoDBの設定

$ vi src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/MongoConfig.java
$ git diff src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/MongoConfig.java
diff --git a/src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/MongoConfig.java b/src/main/java/org/cloudfoundry/c
index 4f403c0..d12c07a 100644
--- a/src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/MongoConfig.java
+++ b/src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/MongoConfig.java
@@ -14,7 +14,7 @@ public class MongoConfig {

        @Bean
        public MongoClient mongoClient() throws UnknownHostException {
-               return new MongoClient();
+               return new MongoClient("192.168.15.91", 27017);
        }

 }

アプリのビルド

$ ./gradlew build -x test

Org, Space の作成

百日行第2回目のpostgresql-cf-service-brokerと同様にservice brokerをデプロイする専用のorgとspaceを作成します。
今回は過去の記事で作成済みの為、そのまま利用しましたが、新しく作成する場合は以下のようにコマンドを実行します。

$ cf create-org admin
$ cf create-space svcs

Application Security Group の開放

本検証環境ではbosh-liteで構築されており、bosh-lite のデフォルトでは、アプリはプライベート・アドレス (10..., 192.168..*) には接続できません。

今回構築したMongoDBは 192.168.. 上に存在するので、Security Groupの設定を行います。

  • security group の作成

先ほど構築した MongoDB インスタンスにアクセスできるルールを持つ application security group を作成します。

まずはルール(JSON形式)を記述したファイルを作成します。

$ vi ~/spring-boot-cf-service-broker-mongo.security-groups.json
$ cat ~/spring-boot-cf-service-broker-mongo.security-groups.json
[
    {
        "protocol": "tcp",
        "destination": "192.168.15.91",
        "ports": "27017"
    }
]
  • security groupの登録
$ cf create-security-group spring-boot-cf-service-broker-mongo-security-groups ~/spring-boot-cf-service-broker-mongo.security-groups.json

確認:

$ cf security-group spring-boot-cf-service-broker-mongo-security-groups
Getting info for security group spring-boot-cf-service-broker-mongo-security-groups as admin
OK

Name    spring-boot-cf-service-broker-mongo-security-groups
Rules
        [
                {
                        "destination": "192.168.15.91",
                        "ports": "27017",
                        "protocol": "tcp"
                }
        ]

No spaces assigned
  • Default Running Security Group に bind

この設定をする事で同一CF内の全てのアプリが実行時にMongoDBのインスタンスに接続可能になります。

$ cf bind-running-security-group spring-boot-cf-service-broker-mongo-security-groups

デプロイ

アプリの push

manifest.ymlが既に準備されているのでcf pushのみでpushします。

$ cf push
App started


OK

App mongo-broker was started using this command `SERVER_PORT=$PORT $PWD/.java-buildpack/open_jdk_jre/bin/java -cp $PWD/.:$PWD/.java-bu
ildpack/spring_auto_reconfiguration/spring_auto_reconfiguration-1.10.0_RELEASE.jar -Djava.io.tmpdir=$TMPDIR -XX:OnOutOfMemoryError=$PW
D/.java-buildpack/open_jdk_jre/bin/killjava.sh -Xmx382293K -Xms382293K -XX:MaxMetaspaceSize=64M -XX:MetaspaceSize=64M -Xss995K org.spr
ingframework.boot.loader.WarLauncher`

Showing health and status for app mongo-broker in org admin / space svcs as admin...
OK

requested state: started
instances: 1/1
usage: 512M x 1 instances
urls: mongo-broker.10.244.0.34.xip.io
last uploaded: Thu Sep 24 09:25:12 UTC 2015
stack: cflinuxfs2
buildpack: java-buildpack=v3.0-https://github.com/cloudfoundry/java-buildpack.git#3bd15e1 java-main open-jdk-jre=1.8.0_60 spring-auto-
reconfiguration=1.10.0_RELEASE

     state     since                    cpu     memory           disk      details
#0   running   2015-09-24 06:25:57 PM   11.9%   329.8M of 512M   0 of 1G

Service Broker 化

service broker としてCF環境に認識させます。

本節の手順の概要は以下の通りです:

  • 1) Service Brokerに登録する為のクレデンシャル情報の確認
  • 2) Service Broker として登録
  • 3) Marketplace に公開する為のラベル情報の確認
  • 4) Marketplace に公開

Service Brokerに登録する為のクレデンシャル情報の確認

  • cf logsの–recentオプションでログを確認します。
1$ cf logs mongo-broker --recent

下記のログ部分の『password:』の後がService Brokerに登録する為のパスワードになります。
user名はuser固定です。

12015-09-25T10:32:39.97+0900 [App/0]      OUT 2015-09-25 01:32:39.972  INFO 29 --- [           main] b.a.s.AuthenticationManagerConfiguration :
22015-09-25T10:32:39.97+0900 [App/0]      OUT Using default security password: cbbed27c-b42a-489b-8d1b-ce3cb9c6e779
32015-09-25T10:32:40.24+0900 [App/0]      OUT 2015-09-25 01:32:40.245  INFO 29 --- [           main] s.b.c.e.t.TomcatEmbeddedServletCon
4tainer : Tomcat started on port(s): 61139/http
52015-09-25T10:32:40.24+0900 [App/0]      OUT 2015-09-25 01:32:40.248  INFO 29 --- [           main] o.c.c.s.mongodb.config.Application
6       : Started Application in 7.613 seconds (JVM running for 8.284)

Service Broker として登録

$ cf create-service-broker mongodb user cbbed27c-b42a-489b-8d1b-ce3cb9c6e779 http://mongo-broker.10.244.0.34.xip.io

Marketplace に公開する為のラベル情報の確認

登録する際に使うラベル名は”Mongo DB”となります。
値を確認するにはCatalogConfig.javaのServiceDefinitionの2番目の引数の値を確認します。

$ vi src/main/java/org/cloudfoundry/community/servicebroker/mongodb/config/CatalogConfig.java
 23         @Bean
 24         public Catalog catalog() {
 25                 return new Catalog( Arrays.asList(
 26                                 new ServiceDefinition(
 27                                         "mongo",
 28                                         "Mongo DB",
 29                                         "A simple mongo implementation",
 30                                         true,
 31                                         false,

Marketplace に公開

本手順を実行する事で全ユーザに対してサービスプランを提供します。

$ cf enable-service-access "Mongo DB"

確認:

$ cf service-access
broker: mongodb
   service    plan                 access   orgs
   Mongo DB   Default Mongo Plan   all

$ cf marketplace
service      plans                     description
Mongo DB     Default Mongo Plan*       A simple mongo implementation

動作確認

サービスの作成

$ cf create-service 'Mongo DB' 'Default Mongo Plan' mongodb-test

アプリのclone

MongoDBを使うsinatraの簡易アプリとして以下のアプリをcloneします

https://github.com/nota-ja/app-sinatra-mongodb.git

$ git clone https://github.com/nota-ja/app-sinatra-mongodb.git
$ cd app-sinatra-mongodb

アプリのpush

$ cf push sinatra-mongo --no-start

サービスのバインド

$ cf bind-service sinatra-mongo mongodb-test

アプリの起動

$ cf start sinatra-mongo

MongoDBへの書き込み&読み出し

『1』というキーに対し『Taro』というデータを格納します。

$ curl -X POST http://sinatra-mongo.10.244.0.34.xip.io/service/mongo/1 -d 'Taro'

『Taro』を確認した表示がでます。

Taro

キー名『1』のデータを読み込みます。

$ curl http://sinatra-mongo.10.244.0.34.xip.io/service/mongo/1

格納した『Taro』が返ってきます。

Taro

アプリを一旦再起動します。

$ cf restart sinatra-mongo

再度、キー名『1』のデータを読み込みます。

$ curl http://sinatra-mongo.10.244.0.34.xip.io/service/mongo/1

再起動後もデータが永続化されているので格納した『Taro』が返ってきます。

Taro

今回使用した環境



投稿者:NTTソフトウェア株式会社 森川 健