cloudfoundry
Security
spring-boot

CloudFoundry × SpringBoot環境でDBの鍵をUserProvidedServiceで管理

この資料について

CloudFoundryにデプロイしているSpringBootアプリケーションの鍵を管理する際に直接書いたりしたくないので、CloudFoundryが用意しているUserProviededService(UPS)を使っていい感じにやる方法を記述する

導入までの大筋

  1. UPSインスタンスを立ち上げて鍵を登録する
  2. アプリケーションからUPSで登録した鍵を引けるように記述する
  3. manifest.ymlにUPSをバインドする設定を記述する
  4. アプリケーションを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

ソース

mitsuya-saida/bind-ups-sample

参考にした資料