はじめに
本記事ではAWSの設定等は含まれておりません。あらかじめご了承ください
AmazonS3とは
S3とは、AWSが提供するサービスの一つで、インターネット上にデータを保存する箱を借りられるサービスというものです。
S3を利用することで、画像を保存したり、保存してある画像を取得したりすることができます。
実装方法
まずは画像投稿した際などに画像の保存先がS3となるように変更していきます。
はじめにS3が使用できるようにしましょう。
#一番下に記述
gem "aws-sdk-s3", require: false
※bundle installを忘れずに!!
続いて、画像の保存先を指定します。
# ~省略~
#config.active_storage.service = :local #コメントアウト!!!!!
config.active_storage.service = :amazon
# ~省略~
次に、S3で使用するバケット名とリージョン名を記述します。
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
local:
service: Disk
root: <%= Rails.root.join("storage") %>
#以下を追記
amazon:
service: S3
region: ap-northeast-1
bucket: ご自身の「バケット名」を入力
#ここまで
# ~省略~
次に、S3にアクセスするための認証情報を設定します。
これは機密情報なので環境変数にいれます。
% vim ~/.zshrc
以下を記述してください
export AWS_ACCESS_KEY_ID="CSVファイルのAccess key IDの値を貼り付け"
export AWS_SECRET_ACCESS_KEY="CSVファイルのSecret access keyの値を貼り付け"
なお、ここにいれるものは、AWSでIAMユーザを作った際にダウンロードする「new_user_credentials.csv」に記載してあります。
入力したら保存して(esc+:wq)してパスを通します
% source ~/.zshrc
ここまでで、環境変数を設定することができました。
実際にソースコード内で環境変数を使用して、S3への認証情報を記述しましょう。
#省略
amazon:
service: S3
region: ap-northeast-1
bucket: (自身のバケット名が記載されている状態です)
#追加
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
# ~省略~
ここまででローカル環境では保存先がS3になっているかと思います。何かを投稿した時、AWS側で確認することができるかと思います。
さあ!後少し!!
ローカル同様に、heroku上でも環境変数を設定します。Herokuで環境変数を扱うには、「heroku config:setコマンド」を打つ必要があります。
% heroku config:set AWS_ACCESS_KEY_ID="CSVファイルのAccess key IDの値を貼り付け"
% heroku config:set AWS_SECRET_ACCESS_KEY="CSVファイルのSecret access keyの値を貼り付け"
反映されたかどうかは、以下のコマンドで確認できます
% heroku config
あ!!!忘れてた、、、
本番環境でも保存先を変更しておきましょう
# ~省略~
#config.active_storage.service = :local #コメントアウト
config.active_storage.service = :amazon
# ~省略~
あとは、これらの変更点をherokuに反映っと、、、
% git push heroku master
完成!!!!
補足(エラー発生した人向け)
画像の保存先の設定を変更することにより、画像の参照先がアプリケーション内からS3へ置き換わります。
当然、S3導入前に投稿した画像が表示できなくなります。
それが嫌だ!!という方や何かしらのエラーが出た方は以下のコマンドを実行し、一度データベースをリセットしてください。
この際、データベースに保存されていたデータは全て消えるため注意しましょう。
% heroku run DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:drop db:create db:migrate
おわりに
前回の記事と合わせれば、ひとまずherokuでのデプロイは完璧にできるかと思います。
次はCircleCIやDocker、AWSの導入に挑戦していきます!!!
前回の記事([Rails]ノーエラーでherokuへデプロイしていく)
https://qiita.com/tochisuke221/items/62d114989e872fa4e50a