LoginSignup
83
74

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-06-24

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の設定ができるようです。

83
74
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
83
74