前提条件
・ruby 2.6.6
・rails 5.2.4.1
・refileを導入済
・deviseを使用
概要
heroku + S3 + refile における組み合わせでS3へ画像アップロードする 方法を忘れないように書いていきます。 実装にかなりてこずったので、そういった人の助けになれば幸いです。refile-s3の導入
refileにはAWSのS3と連携してくれる'refile-s3'というgemが存在します。 まずこのgemを導入して、bundle installをします。 また後ほど、環境変数を利用するので'detenv-rails'というgemも入れておきます。gem "refile-s3"
gem "dotenv-rails"
$ bundle install
AWSのアカウント及びバケットの作成
AWSのS3を扱うためには、AWSの設定をしておかなければならないので [Carrierwaveとfog-awsを用いて、画像をAWS S3へアップロードする方法](https://qiita.com/matsubishi5/items/c2abdd7375a4c683392a) を参考にAWSの設定と実装の「キーを環境変数化」までを行ってください。 また、作業工程途中にアクセスキーとシークレットアクセスキーを取得すると思いますが、
他人に見られないような場所に控えておいてください。環境変数の設定で利用します。
#refile.rbを作成する
refileとAWSの関係を記述するために
config/initializers の中に refile.rb を作成してください。その中に
require "refile/s3"
aws = {
access_key_id: ENV["AWS_ACCESS_KEY_ID"],
secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"],
region: "リージョン名",
bucket: "バケット名",
}
Refile.cache = Refile::S3.new(prefix: "cache", **aws)
Refile.store = Refile::S3.new(prefix: "store", **aws)
を記述してください。
リージョン名に関しては、リージョンを東京にした場合は ap-northeast-1 に設定してください。
また、AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYは、AWSの設定時に
控えていただいた値を入れるのですが、セキュリティー上そのまま値を入れるのはまずいので、
別のファイルに環境設定として定義していきます。
#環境変数の設定
環境変数とは、ざっくり言うとコンピュータが動いているときに使えるパスワードです。
詳しくはぐぐったりしてみてください。
最初にgemのdotenv-railsを導入したと思うのですが、これは**.env**というファイルの中を
反映してくれます。ここに環境変数を書いていきます。
.envはターミナルでも作れますが、手動でも作れます。どちらでもいいのでホームディレクトリ直下(gemfile等がある場所)に作成してください。
参考までにターミナルでは以下のようにすれば良いです。
$ touch .env
.envを作成したら、中身を書いていきます。
AWS_ACCESS_KEY_ID = アクセスキー
AWS_SECRET_ACCESS_KEY = シークレットアクセスキー
セキュリティー上、私のキーは書き込めませんが、ここに控えていたアクセスキーと
シークレットアクセスキーの値を入れてください。
また、githubにコードをアップロードするときには、このファイルを見られたらまずいので
.gitignoreに**.env**を記述しておきます。
/.env
#herokuに設定
最後にherokuにS3を使うための設定をしていきます。
S3を利用したいアプリを開いて、Settingを開き、Config Varsにある Reveal Config Vars を押してもらえると、KEYとVALUEを入れる欄が出てくると思います。
そこに、環境変数をして設定していた値を入れていきます。
KEY には AWS_ACCESS_KEY_ID、VALUEにはアクセスキーを
KEY には AWS_SECRET_ACCESS_KEY、VALUEにはシークレットアクセスキーを
それぞれ入れてください。
以上で、設定は終了です。
最後にherokuにデプロイして確認してみましょう。
#herokuにデプロイ
$ git add .
$ git commit -m "commit S3"
$ git push heroku master
$ heroku run rails db:migrate
$ heroku open
一定時間で消えていた画像がずっと残ると思います!
実際にAWSのS3からバケット名をクリックしてもらうと
storeというフォルダがあり、その中に画像が入っていることが確認できると思います。
#最後に
以上でheroku + S3 + refile の組み合わせでS3へ画像アップロードすることができました。
一人でも多くの方の参考になれば幸いです。