【Rails6】herokuで投稿した画像が表示されない


この記事の概要

herokuの無料プラン(Free)プランを使ってると、更新ボタンを久方ぶりに押した時などにアップロードしたはずの画像が消えるよねーって話と、その解決策。

Railsで作成したアプリケーションにActive Storageと、Amazon S3を導入する方法で、どうやって実装していけばいいかを解説する。

目次

  • この記事の概要
  • 目次
  • 仕様
  • 画像が消える問題
  • 対処法
  • 参考文献

  • 解決策

仕様

・mac OS Catarina バージョン10.15.1(2017モデル)
・Rails 6
・heroku

Rails 6で作成したWebアプリケーションをherokuのフリープランでアップロードしたという前提で話します。

herokuは有料プランではなく、無料プランのFreeで登録しているとします。

画像が消える問題

herokuへのwebアプリケーションのアップロードが済んだ日の翌日、localhost:3000にアクセすると、どうやら画像が表示されていない...。

試しに適当な画像を一枚選んで再アップロードしてみたら、きちんと表示される。

どうやら、画像が投稿されてしばらく経つと、画像が勝手に消去されるらしい。なぜだろう。

対処法

・画像が消える理由

herokuのリポジトリがdynoという単位で管理されており、Freeプランだと一定時間経過後にdynoが再起動される仕様になっているから。
→つまり、再起動されるたびに保存されているファイルは消去される。

・では、どうすればいい?

手順をざっくり解説すると、こうなる。

①AWSコンソール(こちら:https://aws.amazon.com/jp/console/)にアクセスし、「S3」を選択。

②「S3」で、新しいバケットを作成し、自分のトークンIDとアクセスキーを取得。

③aws-sdk-s3というgemをインストールし、vim上でcredientalファイルにIDとキーを記述する。

④$heroku buildpacks:add https://github.com/heroku/heroku-buildpack-activestorage-preview

⑤コミット&デプロイ

という流れになる。

詳しい流れは、以下のQiitaの記事が非常に参考になりました。
https://qiita.com/DaichiSaito/items/80e89f0c96d88afcc5ff

Optional: herokuの有料プランをhobby以上にする(自分はhobbyにした)

※追記:freeでも、一応画像の保存はできるが、いちいちスリープするので、色々とめんどくさい。いっそのこと、契約しておいたほうが楽。
https://qiita.com/hmmrjn/items/479c9e9ce82771f1b6d7

参考文献

・【Rails】Herokuで画像を投稿できるようにする方法(ActiveStorage + Amazon S3)

・画像投稿機能のあるアプリでherokuを使っている場合、何故クラウドストレージでの管理が必要か

・Herokuでアップロードした画像が時間経つと消える問題



コメント

このブログの人気の投稿

【Unity】シーンギズモがデフォルトで表示されない時

【Swift4】argument passed to call that takes no arguments の解決策

【Rails5】SyntaxError: (): mapping values are not allowed エラーの解決法