-
Notifications
You must be signed in to change notification settings - Fork 9
config vars
コードベースのソースは本番環境、ステージング環境、各開発者のローカル環境など多数の環境にdeployされる可能性があります。オープンソースのコードの場合、数百〜数千の環境が存在する可能性があります。
すべて同じコードで開発していても、各環境は固有の構成を持っています。例えば、Amazon S3などの外部サービスの認証情報がそれにあたります。ステージングサイトと本番サイトがそれぞれ独自のキーを持っていながら、開発者は、1つのS3のアカウントを共有することがあります。
伝統的なアプローチは、それらの変数を記述したファイルをソースコードに含めることです。これは、不都合が発生しやすく、特に頻繁に別ブランチにおけるアプリケーションの環境を構築する必要があるようなオープンソースのアプリケーションにおいては顕著です。
より良い解決策は、環境変数を使用して、コードのキーを維持することです。従来のホスト上、またはローカルの作業、あなたのbashrcファイルの
環境のvarsを設定することができます。 Herokuでは、環境変数の内容を使用しています。
deployしたアプリケーションに環境変数を設定する方法を示します。
あなたの環境変数を管理するために、HerokuのCLIのconfig
, config:set
, config:get
and config:unset
を使ってください。
:::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したアプリケーションは環境変数に設定されたキーを使うようになります。
上記の例では、アプリケーションは開発者の環境または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
に追加しておきましょう。
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_ENV
にdevelopment
をセットすることでそのような環境にモードを切り替えます。
Herokuのアプリ上のこれらの環境変数を理解しておくことが重要です。開発環境モードは、開発時には素晴らしい効果がありますが、本番環境としてはパフォーマンスの低下に繋がるため、好ましい設定ではありあません。