Skip to content
shunter1112 edited this page Sep 6, 2013 · 5 revisions

コードベースのソースは本番環境、ステージング環境、各開発者のローカル環境など多数の環境にdeployされる可能性があります。オープンソースのコードの場合、数百〜数千の環境が存在する可能性があります。

すべて同じコードで開発していても、各環境は固有の構成を持っています。例えば、Amazon S3などの外部サービスの認証情報がそれにあたります。ステージングサイトと本番サイトがそれぞれ独自のキーを持っていながら、開発者は、1つのS3のアカウントを共有することがあります。

伝統的なアプローチは、それらの変数を記述したファイルをソースコードに含めることです。これは、不都合が発生しやすく、特に頻繁に別ブランチにおけるアプリケーションの環境を構築する必要があるようなオープンソースのアプリケーションにおいては顕著です。

より良い解決策は、環境変数を使用して、コードのキーを維持することです。従来のホスト上、またはローカルの作業、あなたのbashrcファイルの環境のvarsを設定することができます。 Herokuでは、環境変数の内容を使用しています。 deployしたアプリケーションに環境変数を設定する方法を示します。

デプロイされているアプリケションのための環境変数の設定

あなたの環境変数を管理するために、HerokuのCLIのconfig, config:set, config:get and config:unsetを使ってください。

以前のバージョンのHeroku Toolbeltは`config:add`と`config:remove`を使っていました。
:::term
$ heroku config:set GITHUB_USERNAME=joesmith
Adding config vars and restarting myapp... done, v12
GITHUB_USERNAME: joesmith

$ heroku config
GITHUB_USERNAME: joesmith
OTHER_VAR:       production

$ heroku config:get GITHUB_USERNAME
joesmith

$ heroku config:unset GITHUB_USERNAME
Unsetting GITHUB_USERNAME and restarting myapp... done, v13

Herokuは、アプリケーションに環境変数としてこれらを設定します。これらの環境変数は永続的です - それらはdeployし、アプリを再起動しても残ります - よって、値を変更する必要がない限り、それらは一度だけ設定すれば良いです。

環境変数を設定したり削除した際はいつでも、アプリケーションは再起動します。

制限

環境変数のデータ(全てのキーバリューの集まり)はそれぞれのアプリケーションにつき16kbまでと制限されています。

S3アカウントのキーを環境変数へ追加する例:

:::term
$ cd myapp
$ heroku config:add S3_KEY=8N029N81 S3_SECRET=9s83109d3+583493190
Adding config vars:
  S3_KEY    => 8N029N81
  S3_SECRET => 9s83109d3+583493190
Restarting app...done.

実行時に環境変数の内容を読み取るようにコードを設定します。たとえば、Rubyでは、 ENV['KEY']といったように環境変数へアクセスします。 - 以下のように初期化の処理を書くことができます。

:::ruby
AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

Javaでは、System.getenv('key')でアクセス可能です。:

:::java
S3Handler = new S3Handler(System.getenv("S3_KEY"), System.getenv("S3_SECRET"))

Python:

:::python
s3 = S3Client(os.environ['S3_KEY'], os.environ['S3_SECRET'])

Herokuにdeployしたアプリケーションは環境変数に設定されたキーを使うようになります。

ローカルの環境構築

Foremanを利用する

上記の例では、アプリケーションは開発者の環境またはHerokuの以外の他のホスト上ではS3のキーはnilに設定されます。典型的には局所的に異なるサービスを使用することができます。

たとえば、deployされたアプリケーションではDATABASE_URLはHeroku上のPostgreSQLを参照しますが、ローカルアプリケーションでは、ローカルのストレージを参照することでしょう。

Foremanはforeman -e alternate_env startというように、起動時に別の環境ファイルを選択できるという利点があります。

ではどこにローカル用の環境変数を置くのでしょう。1つの解決方法は、.envファイルを使いForemanを利用することです。foremanはHeroku Toolbeltをインストールした際のパッケージに含まれまれています。foremanを使えば、Procfileに書かれたプロセスが立ち上がる前に、環境変数がセットされた状態でアプリケーションが立ち上がります。

以下のような.envを用意します。

S3_KEY=mykey
S3_SECRET=mysecret

foremanを以下のようにスタートさせます。

:::term
foreman start

このアプローチを利用する際には、環境変数を書き込んだファイルは.gitignoreに追加しておきましょう。

foremanとheroku configを使う

heroku-config はHeroku コマンドラインツールのプラグインです。これらを使えばアプリケーションに設定された環境変数を取得し、ローカルの.envファイルに設定したり、その逆も出来ます。

以下のようにインストールします。:

:::term
$ heroku plugins:install git://github.com/ddollar/heroku-config.git
heroku-config installed

対話形式でアプリケーションの環境変数をローカルに取得するコマンドは以下のようになります。各環境変数ごとに上書きの確認をしてくれます。

:::term
$ heroku config:pull --overwrite --interactive	

ローカルの環境変数をHerokuにpushする手順です。

Herokuの環境変数を上書きするので、このコマンドを実行する際には十分に気をつけてください。

:::term
$ heroku config:push

その他のローカルオプション

foremanと.envを利用する方法以外には、以下のように~/.bashrcファイルに環境変数を記述する方法があります。

export S3_KEY=mykey
export S3_SECRET=mysecret

もしくは起動時のコマンドの前に環境変数をセットする方法があります。

:::term
$ S3_KEY=mykey S3_SECRET=mysecret application

本番環境と開発環境について

多くのフレームワークは開発環境モードをサポートしています。デバック目的や、ファイルの変更を検知して動的に再読み込みを行ったり再コンパイルを行うようなことがあります。

例えば、Rubyの環境ではRACK_ENVdevelopmentをセットすることでそのような環境にモードを切り替えます。

Herokuのアプリ上のこれらの環境変数を理解しておくことが重要です。開発環境モードは、開発時には素晴らしい効果がありますが、本番環境としてはパフォーマンスの低下に繋がるため、好ましい設定ではありあません。

Clone this wiki locally