Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

CarrierwaveでS3にアップロードさせるとき、キャッシュもS3に置く

More than 3 years have passed since last update.

rubyで画像アップロード機能を作成するには様々なgemがありますが、carrierwaveが一番お手軽でわかりやすいので一番使っています。
carrierwaveではストレージを自由に選択できるので、ストレージをfogにすればS3との連携も簡単にできます。

以下の例は管理しているrailsアプリケーションのストレージをfogにする設定です。

config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  config.cache_dir = "#{Rails.root}/tmp/uploads"

  config.fog_credentials = {
    :provider               => 'AWS',
    :aws_access_key_id      => 'YOUR ACCESS KEY',
    :aws_secret_access_key  => 'YOUR SECRET',
    :region                 => 'ap-northeast-1'
  }

  config.storage = :fog
  config.fog_directory = "PATH_TO_DIRECTORY"
  config.fog_public = true
  config.fog_authenticated_url_expiration = 60
end

この設定だけでS3にアップロードしたデータを登録できるので簡単です。

しかし、複数サーバをロードバランサ配下に置いている場合、キャッシュファイルが各サーバの片方にしか置かれないので、ページ遷移した際にキャッシュファイルが正常に受け継がれないことになってしまいます。
キャッシュファイルを共有するためにnfsサーバを用意するといった解決策もあるのですが、今回はキャッシュもS3に置くようにしてみます。

githubにあがっているcarrierwaveは、キャッシュをS3にすることが可能になっているので、こちらをGemfileに記入します。

Gemfile
gem 'fog'
gem 'carrierwave',github: 'carrierwaveuploader/carrierwave'

そして、carrierwaveのconfigファイルに以下の1行を追加します。

config/initializers/carrierwave.rb
  config.cache_storage = :fog

これでキャッシュストレージの向き先をAWSにすることができました。
S3を利用して、ファイルをアップロードする機能があるアプリケーションをスケールさせる場合のキャッシュファイルの扱いが、だいぶ楽になると思います。
ちなみにファイルストレージもキャッシュも自由に変更することができるので、自前のストレージエンジンを利用するのも可能です。

追記:

現在はgemにあがっているものでもcache_storageの設定ができるようです。

doima_
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away