⌨️

dotenv-rails 利用環境で、書き換えたキーが再読み込みされなくて詰む

2023/12/18に公開

問題

dotenv-rails をデフォルトのまま特に設定をせずに使っています。
このとき、

  • 同名キーの書き換え
  • Unicorn のワーカープロセスのみの再起動

という条件で、再読み込みがされないという事象にぶち当たりました。
(新規キーは読み込まれる)

原因

色々探りましたが、明確には分かりません。
恐らく dotenv-rails の「overloadしない」という戦略が影響していそう。

By default, it won't overwrite existing environment variables as dotenv assumes the deployment environment has more knowledge about configuration than the application does. To overwrite existing environment variables you can use Dotenv.overload.

これにより、恐らく下記のような流れが起こっている。

  1. 同名キー書き換え
  2. ワーカープロセス再起動
  3. dotenv-rails は 同名のENVが既存であると判断。
  4. 新しいキーの内容を読み込まずにスキップ。

(キャッシュみたいな動きですね)

ワークアラウンド

2つ考えられます。

  1. Unicornを完全停止して再起動
  2. Dotenv.overload を application.rb などに入れる。

今後、.envファイルは無くそうという方針があり、またDotenv.overloadを入れることにより想定外の挙動をする可能性もあるので、 今回は 1. で行きました。

もちろん、環境によってはダウンタイムが発生します。
現環境では、ALBによるロードバランシングが行われているので、ローリング再起動にしました。

ステップ

kill -QUIT `cat /run/unicorn.pid` # 完全停止
bundle exec unicorn -c /path/to/your/unicorn/config.rb -E production -D # Unicorn起動

備考

.env は使わないに越したことがないですね。。。😂

Discussion