[rails]production環境のdatabase.ymlでハマったこと(環境変数設定)


[まとめ] 現在開催中のKindleセール情報はこちら

本番環境の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'

のどれかで対応すればよいと思います。

あまり起きない現象だと思いますが、すぐに気付けずハマったので$の変数展開にはご注意を。

参考

[まとめ] 現在開催中のKindleセール情報はこちら