Rails6.1から入ったActiveStorageのPublicAccessが良かった

投稿者
だいそん

最近肉体改造に励んでいるだいそんです。

さてさてRails6.1で色々な機能が追加されましたが、個人的に特に嬉しかったのはActiveStorageにおいてパブリックなURLを利用できるようになったことですね。

専用のカラムを用意しなくて済んだり、リサイズも動的にできたりと何かと便利なActiveStorageですが、以下の記事の通りこのような問題もありました。

  1. CDNとの相性が悪い
  2. 画像のリクエストがRailsに向いてしまう
  3. 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://railsguides.jp/active_storage_overview.html#%E3%83%9F%E3%83%A9%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9

【原著】 https://edgeguides.rubyonrails.org/active_storage_overview.html#public-access

→ こちらに記載されています。

一緒にスタートアップを盛り上げませんか?
JAWS DAYS 2021 -RE:CONNECT- セッション配信サイトを構築しました
2021/02/19