記事の執筆を丸ごとAIに任せようとしたが、生成を待つ時間が億劫になってきた。彼には校正や修正など単純な作業をさせるとして、文章そのものは自分で書いた方がいいのかもしれない。
要約
Rails v6アプリをFly.ioを用いてデプロイを試みた。MissingKeyError
が発生したが、Dockerfileを--precompile=defer
というオプションをつけて再度生成することによって、無事にデプロイができた。
背景
前回の続きで、RailsアプリをFly.ioへデプロイすることを試みた。しかし、fly deploy
を実行すると以下のようなエラーが発生していた。
ActiveSupport::EncryptedFile::MissingKeyError: Missing encryption key to decrypt file with. Ask your team for your master key and write it to /rails/config/master.key or put it in the ENV['RAILS_MASTER_KEY'].
これを解消することにした。
調査
このエラー文はなぜ発生するのか調べた。どうもfly deployを行う際にDockerfileで実行するRUN SECRET_KEY_BASE=DUMMY ./bin/rails assets:precompile
部分でエラーが出ているようだ。DUMMYの箇所が気になったので調べた。以下の記事を見つけた。
【イベントレポート】Railsアプリで秘匿情報を環境変数からCredentialsに移行した話 - Timee Product Team Blog
Rails 7.1から SECRET_KEY_BASE_DUMMY が導入されました。これは、SECRET_KEY_BASE の代わりにダミー値を自動的に設定する SECRET_KEY_BASE_DUMMY です。assets:precompile 実行時に SECRET_KEY_BASE が必要ない場合でも、エラーが発生することを防げます。
そう。SECRET_KEY_BASE=DUMMY
はRails 7.1から使える記法であった。私のアプリはRails6.1だ。このため、SECRET_KEY_BASEがない状態のままプリコンパイルが実行されたためエラーとなっていた。
解決策
このエラーの解消方法は公式のドキュメントに記載されていた。 Existing Rails Apps · Fly Docs
bin/rails generate dockerfile --precompile=defer
これはDockerfileを生成する際にprecompileをdefer これを実行して再度deployするとできた。
Rails 6系ではアセットプリコンパイル時に SECRET_KEY_BASE が必要になる場合がある。これは、プリコンパイル処理の中で暗号化キーを利用してcredentialsやencryptedファイルにアクセスする可能性があるためだ。 今回のように環境変数をデプロイ後に設定できる構成では、ビルド時にプリコンパイルを避ける(defer)方針が有効となる。