Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 6.1: Active Storageのファイルをプロキシ経由で配信する(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしました。

参考: 「Rails 6.1で新しく入る機能について」iCARE Dev Meetup #12 の登壇内容 https://icare.connpass.com/event/183716/

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) %>

関連記事

Rails 6のB面に隠れている地味にうれしい機能たち(翻訳)


  1. 訳注: このリダイレクトの挙動がデフォルトであることが原文では「変更前」セクションに書かれていますが、#34477のActive Storage READMEには「変更後」の仕様として追記されています。 

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。