Cloud FoundryとSpringはともにPivotalがメインで開発しているが、最近は"Cloud Foundry ❤️ Spring"と 言って、"Cloud FoundryがSpring Bootの最適な実行環境"になるように機能追加やシームレスな連携が進んでいる。Spring Boot 1.5ではSpring Boot ActuatorとCloud Foundryの連携が利用可能になる。
この機能を使うには
- Spring Boot 1.5以上
- CC API v 2.64.0以上 = cf-release v246以上
が必要。Pivotal版Cloud Foundryの対応状況は次の通り。
- Pivotal Web Services (パプリックCloud Foundry)
- Pivotal Cloud Foundry 1.9.0以上 (商用パッケージ版Cloud Foundry)
- PCF Dev v0.23.0以上 (ローカルCloud Foundry)
Pivotal版Cloud Foundryは管理画面がSpring Bootと連携できるので、基本的にはこの記事で説明する内容は上記の3環境を想定している。
この記事では、現時点で利用可能な機能を紹介する。
【注意】 記事執筆時点でSpring Boot 1.5はリリースされておらず、記事の内容は変わる可能性あり。
まずはプロジェクト作成。
Spring Initializrで今回は次の項目を入力して"Generate Project"ボタンをクリック。hello-cf.zipを展開。
Artifact | Search for dependencies | version |
---|---|---|
hello-cf | Web, Actuator | 1.5.0 |
コマンドラインで雛形プロジェクトを一発で作る場合は、次の通り。
$ curl -s https://start.spring.io/starter.tgz \
-d bootVersion=1.5.0.BUILD-SNAPSHOT \
-d artifactId=hello-cf \
-d baseDir=hello-cf \
-d dependencies=web,actuator \
-d applicationName=HelloCfApplication | tar -xzvf -
x hello-cf/mvnw
x hello-cf/
x hello-cf/.mvn/
x hello-cf/.mvn/wrapper/
x hello-cf/src/
x hello-cf/src/main/
x hello-cf/src/main/java/
x hello-cf/src/main/java/com/
x hello-cf/src/main/java/com/example/
x hello-cf/src/main/resources/
x hello-cf/src/main/resources/static/
x hello-cf/src/main/resources/templates/
x hello-cf/src/test/
x hello-cf/src/test/java/
x hello-cf/src/test/java/com/
x hello-cf/src/test/java/com/example/
x hello-cf/.gitignore
x hello-cf/.mvn/wrapper/maven-wrapper.jar
x hello-cf/.mvn/wrapper/maven-wrapper.properties
x hello-cf/mvnw.cmd
x hello-cf/pom.xml
x hello-cf/src/main/java/com/example/HelloCfApplication.java
x hello-cf/src/main/resources/application.properties
x hello-cf/src/test/java/com/example/HelloCfApplicationTests.java
$ cd hello-cf
HelloCfApplication
を実行、あるいは./mvnw spring-boot:run
を実行して空のアプリケーションを起動。
http://localhost:8080/envにアクセス。
実はSpring Boot 1.5からは/info
, /health
を除くActuatorのエンドポイントはSpring Securityなしでもデフォルトで認可ありになる。
1.4以前のように認可なしにするには
management.security.enabled=false
を設定する必要がある。もしくはROLE_ACTUATOR
権限を持つユーザーでアクセスする必要がある。 (gh-6889, gh-7673)
http://localhost:8080/healthとhttp://localhost:8080/infoに関してはアクセスできる。
/health
と/info
も認可対象にしたい場合は、application.properties
に
endpoints.health.sensitive=true
endpoints.info.sensitive=true
を設定する。
この状態でこのアプリケーションをCloud Foundryにデプロイする。
今回はPivotal Web Servicesを利用する。アカウント作成方法はこちら。
まずはログイン。
cf login -a api.run.pivotal.io
ビルド。
./mvnw package -Dmaven.test.skip=true
Cloud Foundryにデプロイ。
cf push hello-cf-boot15 -m 256m -p target/hello-cf-0.0.1-SNAPSHOT.jar
hello-cf-boot15
の部分は、重複しないように変更する必要あり。
では、いよいよ連携機能を見ていく。
Apps Manager (アプリケーション管理画面)にログイン。
ヘルスチェック連携
アプリケーション名の左にSpring Bootのロゴが出ていたら、連携成功である。
まずはヘルスチェック連携。Spring Boot Actuatorの/health
エンドポイントの内容がApps Managerから見れるようになる。
">"をクリックすると詳細が見れる。
"View JSON"をクリックすると、JSON形式(/health
の結果そのまま)で見ることもできる。
もちろん、endpoints.health.sensitive=true
を設定していても管理画面からはアクセスできる。
ブラウザで直接/health
エンドポイントにアクセスしても401エラーが返る。
https://hello-cf-boot15.cfapps.io/health
Spring Bootにこの自動認可処理(Spring Security不要)が組み込まれているのが連携ポイントである。
アプリケーションをスケールアウトしても個々のインスタンスのヘルスチェックが可能。
3インスタンスにスケールアウトしてみる。
cf scale hello-cf-boot15 -i 3
管理画面には次のように表示される。
アプリケーションにMySQLやRabbitMQと言ったバックエンドサービスをバインドした場合は次のように各サービス(Spring Boot Actuatorがサポートしている場合)のヘルスチェックも見れる。
ダウンしたサービスがいると次のように表示される。
ヘルスチェックは自分で追加することも可能。
Git連携
次に/info
連携。
まずは次のようにgit-commit-id-plugin
を使って/info
の結果にGit情報を埋め込む。
<build>
<plugins>
<!-- ... -->
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
</plugin>
</plugins>
</build>
/info
にアクセスすると次のような結果が返る。(ただしendpoints.info.sensitive=true
を設定している場合は401になる)
このアプリケーションを再度ビルド&cf push
。
./mvnw clean package -DskipTests=true && cf push hello-cf-boot15 -m 256m -p target/hello-cf-0.0.1-SNAPSHOT.jar
Apps Managerを見ると、"View App"ボタンの下に小さくGitの情報が埋め込まれる。
とても地味だけど、ありがたい。特にマイクロサービスアーキテクチャでたくさんのアプリケーションがデプロイされている場合は、どのバージョンが動いているのかわからなくなりがちなので、組み込みでこのような情報が見れるのは助かる。
ちなみにデプロイされいるアプリはmaking/hello-cf#5935679。
(前に見た時はGitHubのコミットログに飛べたはずだけど、PWS版では飛べない...)
↑[追記] management.info.git.mode=full
が必要っぽい
ここは今後もう少し改善されていくと思う。
ログレベルの動的変更
次に/loggers
連携。
Spring Boot 1.5からはActuatorに/loggers
エンドポイントが追加され、ログレベルの変更リクエストを送ることができるようになる。(gh-7396)
このエンドポイントを使って、Apps Managerから起動中のアプリケーションのログレベルを動的に変更することができる。
Logsタブを開いて、"Configure Logging Levels"をクリックすると、
ログレベル変更のダイアログが立ち上がる。
ここではorg.spring.framework.web.client.RestTemplate
のログレベルをINFOからDEBUGに変更する。
Logsタブの▶️ボタンをクリックして、ログをTailした状態で、先ほどのHealth Checkの"Vieww JSON"をクリックするとRestTemplate
のログが流れていることがわかる。
ちなみにPivotal Web ServicesのCloud Controller API (api.run.pivotal.io
)に対して、https://api.run.pivotal.io/v2/apps/:guid/permissions
のリクエストを送っていることがわかる。このAPIがcf-release v246以上必須となる。
(おまけ) Zipkinヘッダー連携
Cloud FoundryのルーターにZipkinのヘッダー(X-B-Trace-Id
, X-B3-Span-Id
, X-B3-ParentSpanId
)がつくようになった。(cf-release v243以上)
これでSpring Cloud Sleuthを入れた場合のSpring BootアプリケーションログとCloud Foundryのリクエストログが結びつく。 ZipkinによるトレーシングもCloud Foundryの入り口から始まるようになる。
今後はPCF Metricsと連携される予定。
今後は全Actuatorの機能が管理画面に搭載されている予定。 Spring BootとCloud Foundryの親和性はどんどん高くなっているので、ぜひ試してみてほしい。