[rails]production環境のdatabase.ymlでハマったこと(環境変数設定)
本番環境のdatabase.yml設定はセキュリティの観点からファイルにパスワードを直接記述するのではなく、以下のように環境変数経由で取得するようになっていますが、この環境変数の設定にハマりました。
# config/database.yml
roduction:
password: <%= ENV['DATABASE_PASSWORD'] %>
普段は本番サーバの/etc/environmentに環境変数のexport設定を書き、source /etc/environmentを実行後にunicornを起動するようにしてアプリケーションを動かしています。
# /etc/environment
export DATABASE_PASSWORD="sjhwiufcdh$Hnasge#lkfas" # 適当なパスワードです
今回ハマったのは、なぜかDBアクセスに失敗してunicornを起動できないという現象でした。
上記サンプルでも、同じ現象が発生します。
echo $DATABASE_PASSWORD
=> sjhwiufcdh#lkfas
お気づきでしょうか? $Hnasgeの部分が消えています。
そうなのです。""で囲われた環境変数の値は変数展開が行われるため、$Hnasgeを変数展開し、Hnasgeは環境変数に設定していないので空になってしまっています。
パスワードジェネレータで作成したDBパスワードにたまたま$が含まれていたことが原因で、変数展開に気づかずハマりました。
これを回避するには
- $の前にをつけてエスケープする
export DATABASE_PASSWORD="sjhwiufcdh$Hnasge#lkfas"
- シングルクォートで囲む
export DATABASE_PASSWORD='sjhwiufcdh$Hnasge#lkfas'
- そもそも$を使わない
export DATABASE_PASSWORD='sjhwiufcdhHnasge#lkfas'
のどれかで対応すればよいと思います。
あまり起きない現象だと思いますが、すぐに気付けずハマったので$の変数展開にはご注意を。