S3にCarrierWaveを使ってローカル環境・本番環境(heroku)で画像をアップロードする

パソコン

架空サイトを制作していた際に手こずったのでメモしておく。

こちらの記事を参考にして行いました!→ https://qiita.com/kodaii/items/cdcfcb538937f1a0bcca

1.fog-awsをGemfileにインストールする

ローカル環境のCarrierWaveの初期設定では、画像のアップロード先がアプリケーション内のpublicフォルダになっているため、これをS3に変更する必要がある。

Gemfile
gem 'fog-aws'

2.xxx_uploader.rbにfogを設定する

class PictureUploader < CarrierWave::Uploader::Base

 #storageを「:file」から「:fog」に変更する。
  storage :fog

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

3./config/initializersに、carrierwave.rbファイルを作る

app/config/initializers/carrierwave.rb

require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'


CarrierWave.configure do |config|
    config.storage = :fog
    config.fog_provider = 'fog/aws'
    config.fog_directory = ENV['AWS_BUCKET']
    config.fog_credentials = {
        provider: 'AWS',
        aws_access_key_id: Rails.application.credentials.aws[:access_key_id],
        aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key],
        region: ENV['AWS_DEFAULT_REGION']
    }
end

# 日本語の文字化けを防ぐ
CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/

4.シークレットキーの管理をcredentials.yml.encで行う

ターミナル

$ EDITOR=vim rails credentials:edit
ターミナル

aws:
     access_key_id: 'S3で作られた値を入れる'
     secret_access_key: 'S3で作られた値を入れる'
#コメントアウトを消してあげる
#インデントに注意しないとエラーになる

ここまでをクリアすることでローカル環境からS3に画像が保存されているはず。

5.herokuで環境変数を設定してあげる

下記の設定を行うと、master keyが設定されていない場合に、サーバー起動時にエラーを発生させることができるのでおすすめ。

config.require_master_key = true
#初期設定で「false」になっているので変更する

そして最後にherokuへデプロイしてあげると本番環境から画像の投稿や、バケットに投稿した画像がアップロードされるようになる。

$ git add -A
$ git commit -m ""
$ git push heroku master

TOP