cloudfoundry
credential
Concourse

credential情報を隠蔽して安全にdeployする

Cloud Foundry Advent Calendar 2017の16日目の記事です。

自分も1ユーザとして、cloudfoundryにアプリケーションをpushしたりしているのですが、credential情報の管理が難しいなと思ったのでここで共有しちゃいたいと思います。

credential情報とは

スクリーンショット 2017-12-12 4.29.21.png

DBやAPIの認証に用いるためのID、Passなどをひっくるめて本投稿ではcredential情報と呼ぶことにします。

モチベーション

cf pushってめちゃくちゃ事故りませんかwww
pushする際に...

  1. ステージング環境にpushしたかったのに、manifestファイル指定ミスって本番環境にpushしたったw
  2. ドキュメントが更新されてなくて、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で管理(ダメ、ゼッタイ。)

manifest-stg.yml
---
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をパイプラインとして管理し、可視化することができて なんかかっこいいから好きです。

スクリーンショット 2017-12-12 4.57.59.png

さて、Concourseの詳細な使い方は割愛しますが、cfへのpushを行うためのResourceとしてcf-resourceがあります。
READMEから抜粋しますが、

pipeline.yml
- put: resource-deploy-web-app
    params:
      manifest: build-output/manifest.yml
      environment_variables:
        key: value
        key2: value2

といった感じでpushを行うことができます。
このenvironment_variablesをうまく使ってcredential情報を隠蔽します。

pipeline.yml
- 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について詳しくやるらしいのでここではさらっとだけ紹介します。

manifest-stg.yml
---
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インスタンスを作成しちゃいましょう。

terminalにて
$ cf cups devservice -p "DB_USERNAME, DB_PASSWORD"
## ここらから対話式
DB_USERNAME> gooood
DB_PASSWORD> ariariariari
OK

これでおk。

このやり方はConcourseに依存しないので、誰でも実施することができます。
もっと詳しく知りたくなってきましたよね。

なので明日の@legnohさんの投稿をチェックしましょう!

さいごに

これがBestなのかはわかないですが、みなさんもcredential情報を隠蔽して安心・安全なcf lifeを送ってください

クリスマスが近いということでテンション高めでお送りいたしました。