2021/03/18
Rails6.1から入ったActiveStorageのPublicAccessが良かった
- 投稿者
- だいそん
最近肉体改造に励んでいるだいそんです。
さてさてRails6.1で色々な機能が追加されましたが、個人的に特に嬉しかったのはActiveStorageにおいてパブリックなURLを利用できるようになったことですね。
専用のカラムを用意しなくて済んだり、リサイズも動的にできたりと何かと便利なActiveStorageですが、以下の記事の通りこのような問題もありました。
- CDNとの相性が悪い
- 画像のリクエストがRailsに向いてしまう
- DBへのリクエストが頻繁に走る
引用
画像管理をActiveStorageからCarrierWaveへ乗り換えた話 - クラシル開発ブログ
どういうことかというと、具体的にはこのようなURLがsrc
に設定されるんですね。
<img src="http://localhost:3000/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBNZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--824a4edeb0c4453e69f1009f97d993962d20fda9/51ouGc6zGFL.jpg">
そしてRailsを経由して以下のような一時署名付きURLが返されます。
https://example-bucket.s3.ap-northeast-1.amazonaws.com/guxjpdra0s66imr9efjglyyv3g54?response-content-disposition=inline%3B%20filename%3D%2251ouGc6zGFL.jpg%22%3B%20filename%2A%3DUTF-8%27%2751ouGc6zGFL.jpg&response-content-type=image%2Fjpeg&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIARH7IVVDBUACAF3O5%2F20210225%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-Date=20210225T065714Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=76e0c64ee1628bd4baec570777d10422553a147f1d5ef179623c1699e09cba5b
なので - CDNのキャッシュが厳しい - クライアントサイドで一時署名付きURLがキャッシュされると、有効期限が切れた場合に困る - Railsに毎回アクセスするのでRailsの負荷が高くなる
のような問題が起きます。
以前、画像一覧機能がメインである個人アプリを作っていたのですが、確かに表示が遅く、仕方なくCarrierWaveに移行したという経験があります…
パブリックアクセスを利用可能にするには
storage.yml
に一行追加するだけです。
public_gcs:
<<: *gcs
credentials: <%= Rails.root.join("path/to/public_keyfile.json") %>
bucket: ""
public: true # 追加
これだけでパブリックURLが利用できるようになります。
今回の変更のおかげでかなりActiveStorageを実戦投入しやすくなったのではないでしょうか?
余談
Railsガイドは原著も目を通した方が良さそうですね。 今回のパブリックアクセスについても日本語版にはまだ記載がありませんでした。
【原著】 https://edgeguides.rubyonrails.org/active_storage_overview.html#public-access
→ こちらに記載されています。