マトリョーシカ的日常

ワクワクばらまく明日のブログ。

RailsアプリをFly.ioへデプロイする際に発生したエラー(MissingKeyError)を解消した話

記事の執筆を丸ごと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)方針が有効となる。