この資料について
CloudFoundryにデプロイしているSpringBootアプリケーションの鍵を管理する際に直接書いたりしたくないので、CloudFoundryが用意しているUserProviededService(UPS)を使っていい感じにやる方法を記述する
導入までの大筋
- UPSインスタンスを立ち上げて鍵を登録する
- アプリケーションからUPSで登録した鍵を引けるように記述する
- manifest.ymlにUPSをバインドする設定を記述する
- アプリケーションをCFにpushする
導入するアプリケーション
MySQLに接続してデータを返却するAPIとする。詳細なコードは巻末のソースを参照すること
導入する
1. UPSインスタンスを立ち上げて鍵を登録する
下記コマンドを実行して鍵を対話的に登録する
$ cf cups my-user-provided-service -p "url, user, password"
url> jdbc:mysql://your.mysql.server.domain:3306/demo
user> demo
password> secret
補足. 登録すると下記のようなJSONがバインドしたインスタンスの環境変数に登録される
"VCAP_SERVICES": {
"user-provided": [
{
"credentials": {
"password": "secret",
"url": "jdbc:mysql://your.mysql.server.domain:3306/demo",
"user": "demo"
},
"label": "user-provided",
"name": "my-user-provided-service",
"syslog_drain_url": "",
"tags": [],
"volume_mounts": []
}
]
}
2. アプリケーションからUPSで登録した鍵を引けるように記述する
application.ymlにMySQLの接続情報を下記のように記述する
spring:
datasource:
url: ${vcap.services.my-user-provided-service.credentials.url}
username: ${vcap.services.my-user-provided-service.credentials.user}
password: ${vcap.services.my-user-provided-service.credentials.password}
補足. 配信されるVCAP_SERVICEの情報は下記で取得できる
SpringBootでは、内部的にVCAP_*の情報をパースして下記の指定方法で使用できるようしているため、独自でJSONのパーサ等を作る必要はない
${vcap.services.UPSのnameにあたるもの.user-provided以下のkey名.前で指定したオブジェクトのkey名}
もしくは、
${cloud.services.UPSのnameにあたるもの.user-provided以下のkey名.前で指定したオブジェクトのkey名}
3. manifest.ymlにUPSをバインドする設定を記述する
applications:
- name: bind-ups-sample
buildpack: https://github.com/cloudfoundry/java-buildpack.git
memory: 1G
path: build/libs/bind-ups-sample-0.0.1-SNAPSHOT.jar
services:
- my-user-provided-service # これがバインドする設定
4. アプリケーションをCFにpushして起動できれば完了
$ cf push