皆さんご存知の通り、symfony2のapp/config/parameters.yml(以下parameters.yml)は環境に依存するパラメータを設定する場所です。 DBのパスワード等々保存してますよね。

ciサーバーで自動テスト・自動デプロイが当たり前になってきた昨今、デプロイ先のparameters.ymlも自動化できてますか? もしsshでログインしてviで編集したり、スクリプトで置換していたらこの記事は見る価値があるかもしれません。

incenteev/composer-parameter-handler

incenteev/composer-parameter-handlerenv-map を使って実現します。

symfony/framework-standard-editionでsymfonyプロジェクトをセットアップした場合は既にインストールされているのでセットアップ方法は割愛します。

方法

  1. parameters.yml.dist に 環境依存のパラメータの定義
  2. composer.json1.で定義したパラメータに対する環境変数を指定

こうするだけで環境変数を元にparameters.ymlが自動的にビルドされるようになります。

parameters.yml.dist に環境依存のパラメータの定義

parameters:
  database_name: symfony
  database_user: root
  database_password: ~

composer.jsonにパラメータに対する環境変数を指定

{
  "extra": {
    "incenteev-parameters": {
      "file": "app/config/parameters.yml"
    }
  }
}

symfony/framework-standard-edition を使用している場合、既にこのような定義があると思います。 ここにパラメータの定義を追加していきます。

{
  "extra": {
    "incenteev-parameters": {
      "file": "app/config/parameters.yml",
      "env-map": {
        "パラメータのキー": "環境変数名",
        "database_name": "APP_DATABASE_NAME",
        "database_user": "APP_DATABASE_USER",
        "database_password": "APP_DATABASE_PASSWORD"
      }
    }
  }
}

こういった感じでパラメータと環境変数とを紐付けるだけです。 そうすればparameters.ymlビルド時に環境変数の値が設定されます。

後は実パラメータを環境変数に設定するだけなので、パスワードもバージョン管理等する事なくセキュアな感じに出来ます。

後の具体的な運用…

  • ciサーバーのテストスクリプトで環境変数を設定
  • デプロイ先のデプロイユーザーの環境変数にDBのパスワードや各種apiのキーなどを設定

具体的な運用方法としては上記のような感じになるかと思います