Railsでcarrierwaveを使ってAWS S3に画像をアップロードする

前提

  • AWSアカウント作成済み
  • IAMユーザ作成済み
  • S3のバケット作成済み

Gemのインストール

Gemfileに以下の記述をして、bundle installします。

gem 'carrierwave'
gem 'fog-aws'

carrierwaveの設定

Uploaderクラスを追加します。

rails g uploader Images

app/uploaders/images_uploader.rb 

  if Rails.env.development?
    storage :fog
  elsif Rails.env.test?
    storage :fog
  else
    storage :fog
  end
  # storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def extension_whitelist
    %w(jpg jpeg gif png)
  end

config/initializers/carrierwave.rb 

CarrierWave.configure do |config|
  if Rails.env.production?
    config.storage :fog
    config.fog_provider = 'fog/aws'
    config.fog_directory  = 'S3のバケット名'
    config.fog_credentials = {
      provider: 'AWS',
      aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
      aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
      region: 'ap-northeast-1',
      # region: ENV['AWS_REGION'],
      path_style: true
    }
  else
      config.storage :fog
      config.fog_provider = 'fog/aws'
      config.fog_directory  = 'S3のバケット名'
      config.fog_credentials = {
        provider: 'AWS',
        aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
        aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
        region: 'ap-northeast-1',
        # region: ENV['AWS_REGION'],
        path_style: true
      }
  end

aws_access_key_id S3用に用意したIAMユーザーのアクセスキー

aws_secret_access_key S3用に用意したIAMユーザーのシークレットアクセスキー

次に、モデルにmount_uploaderを設定します。

app/models/photo.rb

class Photo < ActiveRecord::Base
  mount_uploader :image, ImageUploader
end

これで設定は完了です。

使い方

アップロード

<%= f.file_field :image %>

表示

<%= image_tag photo.image.to_s %>

これで、S3を使えるようになったと思います。