hello-world
webエンジニアのメモ。とりあえずやってみる。

[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'

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

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

参考


Related #Rails

[rails]ELB使用時にヘルスチェック用のアクションを作成する

ELBにrailsアプリをぶら下げる場合、railsアプリが落ちたらELBから外れてもらいたいです。

[rails]carrierwaveで保存した画像のurlを取得する

carrierwave 0.10.0 で確認 imageカラムにcarrierwaveで保存した画像を保存している場合、デフォルトのままだとだとurlメソッドを実行してもpublic以下のパスのみで http://~ が設定されていません。