@making's memo

All Categories All Tags Premium (Beta)


Cloud Foundry ❤️ Spring Boot

Edit History

Cloud FoundryとSpringはともにPivotalがメインで開発しているが、最近は"Cloud Foundry ️ Spring"と
言って、"Cloud FoundryがSpring Bootの最適な実行環境"になるように機能追加やシームレスな連携が進んでいる。Spring Boot 1.5ではSpring Boot ActuatorとCloud Foundryの連携が利用可能になる。

この機能を使うには

が必要。Pivotal版Cloud Foundryの対応状況は次の通り。

Pivotal版Cloud Foundryは管理画面がSpring Bootと連携できるので、基本的にはこの記事で説明する内容は上記の3環境を想定している。

この記事では、現時点で利用可能な機能を紹介する。

【注意】 記事執筆時点でSpring Boot 1.5はリリースされておらず、記事の内容は変わる可能性あり。

まずはプロジェクト作成。

image

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にアクセス。

image

実はSpring Boot 1.5からは/info, /healthを除くActuatorのエンドポイントはSpring Securityなしでもデフォルトで認可ありになる。

1.4以前のように認可なしにするにはmanagement.security.enabled=falseを設定する必要がある。もしくはROLE_ACTUATOR権限を持つユーザーでアクセスする必要がある。 (gh-6889, gh-7673)

http://localhost:8080/healthhttp://localhost:8080/infoに関してはアクセスできる。

image

/health/infoも認可対象にしたい場合は、application.properties

endpoints.health.sensitive=true
endpoints.info.sensitive=true

を設定する。

image

この状態でこのアプリケーションを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 (アプリケーション管理画面)にログイン。

image

ヘルスチェック連携

アプリケーション名の左にSpring Bootのロゴが出ていたら、連携成功である。

まずはヘルスチェック連携。Spring Boot Actuatorの/healthエンドポイントの内容がApps Managerから見れるようになる。

image

image

">"をクリックすると詳細が見れる。

image

"View JSON"をクリックすると、JSON形式(/healthの結果そのまま)で見ることもできる。

image

もちろん、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

管理画面には次のように表示される。

image

アプリケーションにMySQLやRabbitMQと言ったバックエンドサービスをバインドした場合は次のように各サービス(Spring Boot Actuatorがサポートしている場合)のヘルスチェックも見れる。

image

ダウンしたサービスがいると次のように表示される。

image

ヘルスチェックは自分で追加することも可能

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になる)

image

このアプリケーションを再度ビルド&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の情報が埋め込まれる。

image

とても地味だけど、ありがたい。特にマイクロサービスアーキテクチャでたくさんのアプリケーションがデプロイされている場合は、どのバージョンが動いているのかわからなくなりがちなので、組み込みでこのような情報が見れるのは助かる。

ちなみにデプロイされいるアプリは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"をクリックすると、

image

ログレベル変更のダイアログが立ち上がる。

image

ここではorg.spring.framework.web.client.RestTemplateのログレベルをINFOからDEBUGに変更する。

image

Logsタブの▶️ボタンをクリックして、ログをTailした状態で、先ほどのHealth Checkの"Vieww JSON"をクリックするとRestTemplateのログが流れていることがわかる。

image

ちなみに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以上)

image

これでSpring Cloud Sleuthを入れた場合のSpring BootアプリケーションログとCloud Foundryのリクエストログが結びつく。
ZipkinによるトレーシングもCloud Foundryの入り口から始まるようになる。

今後はPCF Metricsと連携される予定。


今後は全Actuatorの機能が管理画面に搭載されている予定。
Spring BootとCloud Foundryの親和性はどんどん高くなっているので、ぜひ試してみてほしい。

このエントリーをはてなブックマークに追加