[heroku]PostgresとRedisの環境設定

LaravelをHerokuで使用する際に、Heroku PostgresとHeroku Redisの接続情報を環境変数から取得する設定のメモ。

概要

改めて。
Herokuでは標準のadd-onとしてHeroku PostgresHeroku Redisが用意されている。
クレジットカードさえ登録していれば無料で使えるので便利。

この接続情報はアドオンを登録した際に自動的に以下のような変数で登録がされる。

Postgres
DATABASE_URL = postgres://username:password@hostname.amazonaws.com:5432/database

Redis
REDIS_URL = redis://h:password@hostname.amazonaws.com:port_no

各種情報がURL形式で組み込まれているのだが、間違ってもこれを自分でバラしてそれぞれ個別に環境変数に入れる、などとしてはいけない。
というのも、この接続情報はPostgresやRedisにメンテナンスが入った際に前の接続情報は破棄され、新しい情報が同じ環境変数で設定されるため、
自前でバラして作ってしまうとその変更した情報に対応できなくなり、接続エラーとなってしまう。

よって、必ず自動でセットされる、DATABASE_URLREDIS_URLを使うこと。
これはHerokuを使う際には常識として覚えておくこと。

取得

というわけで、それぞれの値を取得したURLからパースしてLaravel用に環境変数にセットする。
以下のように環境変数があればそれをパースして環境変数としてセットしてやるようにするのがスマートっぽい。
これだとローカルでは個別に.envファイルで設定した値を使用してやることが出来る。

/config/database.php の冒頭に書く。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Postgres
if (getenv('DATABASE_URL')) {
    $url = parse_url(getenv('DATABASE_URL'));
    putenv('DB_HOST='.$url['host']);
    putenv('DB_PORT='.$url['port']);
    putenv('DB_DATABASE='.substr($url["path"], 1));
    putenv('DB_USERNAME='.$url["user"]);
    putenv('DB_PASSWORD='.$url['pass']);
}

//Redis
if (getenv('REDIS_URL')) {
    $url = parse_url(getenv('REDIS_URL'));
    putenv('REDIS_HOST='.$url['host']);
    putenv('REDIS_PORT='.$url['port']);
    putenv('REDIS_PASSWORD='.$url['pass']);
}
   このエントリーをはてなブックマークに追加