Cloud Foundry Advent Calendar 2017の16日目の記事です。
自分も1ユーザとして、cloudfoundryにアプリケーションをpushしたりしているのですが、credential情報の管理が難しいなと思ったのでここで共有しちゃいたいと思います。
credential情報とは
DBやAPIの認証に用いるためのID、Passなどをひっくるめて本投稿ではcredential情報と呼ぶことにします。
モチベーション
cf push
ってめちゃくちゃ事故りませんかwww
pushする際に...
- ステージング環境にpushしたかったのに、manifestファイル指定ミスって本番環境にpushしたったw
- ドキュメントが更新されてなくて、
cf set-env
で古い値に上書きしたったw
などなどみなさん一回は経験したことがあるんじゃないかと思います。
なんでこんな問題が起こるのか自分なりに考えてみました。
単純に デプロイ時の手順が多いからなんじゃないでしょうか!
cf push -f path/to/manifest
で済めば限りなく事故は減らせるはずです。
1についてはmanifest.yml
という名前のmanifestファイルを置かなければ多少改善されます。(cf push
での参照されるmanifestファイルのデフォルトがmanifest.yml
だから)
2についてが本投稿のメインになります。
credential情報の持ち方を工夫して、cf set-env
を撲滅していこうと思います。
credential情報の持ち方
cf push -f path/to/manifest
で済めば限りなく事故は減らせるはずです。
必要な情報をうまくmanifestに落とし込む必要があります。
3つほど手段を考えました。
githubで管理(ダメ、ゼッタイ。)
---
applications:
- name: app-stg
buildpack: php_buildpack
instances: 1
routes:
- route: app-stg.hogehoge.com
env:
DB_USERNAME: fooooooo
DB_PASSWORD: damedamedamedame
cf set-env
をしなくて済むようにmanifetで構成管理してみました。
これはBad Practiceですね。
credentialな情報はgithub等にあげちゃだめって小さい頃におばあちゃんから聞いた気がします(privateなリポジトリだからいいやって人にあんまり強く言えないのでぼかしておきます
concourseで管理
cloudfoundryのCI/CDツールとしてConcourseがあります。Concourseは各Jobをパイプラインとして管理し、可視化することができて なんかかっこいいから好きです。
さて、Concourseの詳細な使い方は割愛しますが、cfへのpushを行うためのResourceとしてcf-resourceがあります。
READMEから抜粋しますが、
- put: resource-deploy-web-app
params:
manifest: build-output/manifest.yml
environment_variables:
key: value
key2: value2
といった感じでpushを行うことができます。
このenvironment_variables
をうまく使ってcredential情報を隠蔽します。
- put: resource-deploy-web-app
params:
manifest: build-output/manifest.yml
environment_variables:
key: ((value))
key2: ((value2))
Concourseではパイプラインのset時に別ファイルから値を参照することができます(参考:Concourse:set-pipeline)
credential情報を別ファイルにおいておき、githubで管理しないようにしましょう。
じゃあそのファイルはどうやって管理するんや。。。って思いますよね。
うまいことチームとかで共有してください。
vaultや、credhubと合わせて使うと別ファイルを持たなくてよくなりますよ。
Serviceで管理
最後にServiceで管理する方法を書きます。
が 、明日の@legnohさんの記事でServiceについて詳しくやるらしいのでここではさらっとだけ紹介します。
---
applications:
- name: app-stg
buildpack: php_buildpack
instances: 1
routes:
- route: app-stg.hogehoge.com
services:
- dbservice
このようにして、対象のappとserviceを紐付けます。
serviceとしてmarket place(cf market-place
)に存在する場合はそのまま使っちゃってください。
そんなのないわ!って人はUserProvidedServiceインスタンスを作成しちゃいましょう。
$ cf cups devservice -p "DB_USERNAME, DB_PASSWORD"
## ここらから対話式
DB_USERNAME> gooood
DB_PASSWORD> ariariariari
OK
これでおk。
このやり方はConcourseに依存しないので、誰でも実施することができます。
もっと詳しく知りたくなってきましたよね。
なので明日の@legnohさんの投稿をチェックしましょう!
さいごに
これがBestなのかはわかないですが、みなさんもcredential情報を隠蔽して安心・安全なcf lifeを送ってください
クリスマスが近いということでテンション高めでお送りいたしました。