Rails 6.1: Active Storageのファイルをプロキシ経由で配信する(翻訳)
Railsはどの機能も手軽に使えることで知られていますが、ストレージについては苦労がつきものです。Rails 5や6で導入されたActive Storageにはこの数年さまざまな改良が加えられ、多数のgemを使わなくてもRailsコアに依存するだけで基本的な機能を使えるようになりました。プロキシ経由のファイル配信もそうした機能のひとつです。
この機能を掘り下げる前に、プロキシの意味と一般のプロキシサーバーについておさらいしてみます。英語のproxyは「自分の代わりに何かをする権限を与える」という意味です。これをコンピュータサイエンスの世界に置き換えると、プロキシサーバーは本質的に元のリクエストの「バイパス」の役割を果たします。リクエストが送信先のサーバーで実行されるのではなく、リクエストの処理がプロキシサーバーに移管され、プロキシサーバーが代わりにレスポンスを返します。
これは、特に静的アセットを配信するときに有用です(ファイルアップロードなど)。Railsサーバーはビジネスロジックのクエリ対応だけを担当し、ファイル配信のようなリソースを食うタスクはCDNに任せる形になります。こうしたCDNは、ストリーミングやマルチロケーション配信といった多くの強化機能を提供しています。
変更前
プロキシ機能が導入される前は、Webサーバーから直接ファイルを配信していました。これによってアプリケーションサーバーの負荷は軽減しましたが、まだ改良の余地があります。ActiveStorageが生成するファイル用のURLにアクセスすると、短時間だけ有効な署名付きURLにリダイレクトします。これがデフォルトのファイル配信戦略です1。
<%= image_tag rails_storage_redirect_path(current_user.profile_picture) %>
変更後
#34477でプロキシ機能が導入され、署名付きURLにリダイレクトすることなく、背後のストレージサービスからファイルを配信できるようになりました。
この機能を有効にするには、config.active_storage.resolve_model_to_route
コンフィグを以下のように設定します。
config.active_storage.resolve_model_to_route = :rails_storage_proxy
後は以下のように書くだけです。
<%= image_tag current_user.profile_picture %>
特定の添付ファイルを明示的にプロキシしたい場合は、以下のコードが使えます。
<%= image_tag rails_storage_proxy_path(current_user.profile_picture) %>
関連記事
- 訳注: このリダイレクトの挙動がデフォルトであることが原文では「変更前」セクションに書かれていますが、#34477のActive Storage READMEには「変更後」の仕様として追記されています。 ↩
概要
原著者の許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。
参考: 「Rails 6.1で新しく入る機能について」iCARE Dev Meetup #12 の登壇内容 https://icare.connpass.com/event/183716/