Rails のプラグイン carrierwave と fog を使って、Amazon S3 をストレージとして使う方法のメモです。

使用環境

  • Rails 3.2.1
  • carrierwave 0.6.0.beta
  • fog 1.1.2

carrierwave のインストール

Terminal

$
gem install carrierwave

config の書き方

initializers に carrierwave.rb というファイルを作成し、以下のような設定を書きます。

initializers/carrierwave.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#-*- encoding: utf-8 -*-

unless Rails.env.test?
  CarrierWave.configure do |config|
    config.cache_dir = "#{Rails.root}/tmp/uploads"
    config.storage                          = :fog
    config.fog_credentials                  = {
        :provider              => 'AWS',
        :aws_access_key_id     => ENV["AWS_S3_KEY_ID"],
        :aws_secret_access_key => ENV["AWS_S3_SECRET_KEY"]
    }
    config.fog_directory                    = ENV["AWS_S3_BUCKET"]
    config.fog_public                       = false
    config.fog_authenticated_url_expiration = 60
  end
else
  CarrierWave.configure do |config|
    config.storage = :file
  end
end

ENV[“AWS_S3_KEY_ID”] にはユーザアクセスID、ENV[“AWS_S3_SECRET_KEY”] にはシークレットアクセスキー、ENV[“AWS_S3_BUCKET”] にはバケット名をそれぞれ設定する。

各値は、Amazon S3 の設定画面で確認できる。

この設定を行い、carrierwave で Uploader を作成して、ファイルをアップロードすると、S3 にファイルを置くことができる。また、S3 上のファイルの URL には、60秒のタイムアウト設定を掛けており、アプリからのアクセスでのみ参照可能なURLが表示されるようになる。(config.fog_public = false、config.fog_authenticated_url_expiration = 60 の設定)