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についてもっと詳しく知りたいという方はぜひ読んでみてください。↓↓