Ruby
carrierwave

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

More than 1 year has 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の設定ができるようです。