Ruby

【Ruby on Rails】CarrierWaveを使って本番環境からS3に画像をアップロードする方法【heroku】

rails5.2以降から、sercret.ymlからcredentials.yml.encに移行になりました。
アクセスキーの指定方法や環境変数の設定方法が以前と異なるため下記に手順をまとめました。

動作環境

  • Ruby 2.5.1
  • Ruby on Rails 5.2.4
  • macOS Mojave 10.14.5

ローカル環境からS3にアップロードする

ローカル環境ではCarrierWaveによる画像のアップロード先がアプリ内のpublicフォルダです。
これをS3に変更します。

①:fog-awsをインストールする

画像をアップロードする際、外部のストレージを選択しアップロードするのを補助してくれるGem

gem 'fog-aws'

②:アップロードにfogを使用するための設定をする

class ImageUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick
  process resize_to_fit: [800, 800]

  #storageを「:file」から「:fog」に変更し、アップロードにfogを使う指定をする
  storage :fog

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

③:fogのアップロード先の設定をする

/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_credentials = {
    provider: 'AWS',
    aws_access_key_id: Rails.application.credentials.aws[:access_key_id],#AWSのaccess_key_id
    aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key],#AWSのsecret_access_key
    region: 'ap-northeast-1' #アジアパシフィック(東京)を表している
  }

  config.fog_directory  = 'ここにバケット名を入れる'
  config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/ここにバケット名を入れる'
end

④:credentials.yml.encでシークレットキーを管理する

$ EDITOR=vim rails credentials:edit
aws:
  access_key_id: 'ここに値をコピー'
  secret_access_key: 'ここに値をコピー'

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: cb2965bfebd75267542611a74ab612b9754f98・・・・・

コメントアウトを消し、AWSのキーを入力。
インデントに注意。インデントがないとエラーになる。
以上の設定を行うことでcarrierwave.rbでAWSのIDとキーを指定できる。

前略

aws_access_key_id: Rails.application.credentials.aws[:access_key_id],#AWSのaccess_key_id
aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key],#AWSのsecret_access_key

後略

ここまでの作業で、ローカル環境でS3に画像が保存されます。

本番環境からS3にアップロードする

続いて本番環境での設定について

①:herokuで環境変数を設定する

rails5.2以降では、.gitignoreに/config/master.keyがデフォルトで指定されているため、本番環境ではcredentials.yml.encを読み取ることが出来ずサーバ起動時にエラーが発生します。
そのため、本番環境でもcredentials.yml.encを読み取ることができるように、環境変数にmaster.keyの値を設定します。

herokuでの環境変数の設定方法に関しては下記の記事にまとめておりますのでご確認ください。↓↓

本番環境でのmaster.keyの指定漏れを防ぐために下記の設定を行う。
下記の設定を行うと、本番環境でmaster keyが指定されてない場合、サーバ起動時にエラーを発生させる。

 #もともと「false」になっているので「true」にする
  config.require_master_key = true

以上で設定は完了です。

②:herokuにデプロイする

$ git push heroku master

$ heroku open

これで本番環境から画像を投稿し、投稿した画像がバケットにうまくアップロードされていれば成功です。

Ruby on Railsのおすすめ本

Ruby on Rails定番の一冊です。Railsの機能について、プログラミングスクールなどでも教わらない内容も学習できて、理解を深めることができました。
Railsについてもっと詳しく知りたいという方はぜひ読んでみてください。↓↓

  • この記事を書いた人

コウダイ

文系・ノースキル・完全未経験・アラサー・地方住み・残業100時間超えの社畜ホテルマンから都内上場IT企業のフルリモートWebエンジニアに転職した人。

都内上場IT企業に勤務するWebエンジニア5年目|プログラミングスクールのテックキャンプ公式アンバサダー|新卒で手取り18万の地方ホテルマン6年→プログラミングを900時間勉強→転職活動100社以上応募→アラサー未経験から7ヶ月でフルリモートのWebエンジニアに転職し年収100万円UP|33歳2児のパパ|ブログ歴4年→月間6,000PV|エンジニア転職ノウハウ、プログラミング、Web制作、副業での稼ぎ方など、「時間や場所に縛られずに稼ぐ」方法を発信しています。

-Ruby