「Cloud Foundry 百日行」第68回目は,spring-boot-cf-service-broker-mongo です。
このアプリは、Cloud Foundry (以下CF) の service broker として機能するアプリで、百日行第2回目のpostgresql-cf-service-brokerと同じ位置づけのアプリケーションとなり、デプロイする事でmongodbが簡単にサービスとして利用可能になります。
基本情報
全体の概要は以下のようなイメージとなります。
全体の流れは概略以下の様になっています:
- MongoDB(ver 2.6) インスタンスの準備
- spring-boot-cf-service-broker-mongo のデプロイ
- 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
今回使用した環境
- cf-release (v211)
https://github.com/cloudfoundry/cf-release/tree/v211
( https://github.com/cloudfoundry/cf-release/tree/2121dc6405e0f036efa4dba963f7f49b07e76ffa ) - bosh-lite
https://github.com/cloudfoundry/bosh-lite/tree/552dc6869600c5350eb7ffb4fb9c9c5e79e3889d - CF CLI (v6.12.0-8c65bbd-2015-06-30T00:10:31+00:00)
https://github.com/cloudfoundry/cli/releases/tag/v6.12.0 - spring-boot-cf-service-broker-mongo
https://github.com/spgreenberg/spring-boot-cf-service-broker-mongo/tree/c906301ecad09e76118bb3186a3ad2dd84bb642d - Docker Image
REPOSITORY=mongo, TAG=2.6
投稿者:NTTソフトウェア株式会社 森川 健