犬井です。何とかブログに手を付けられるようになりました。

本日の話題はここ数日悩んでいたHerokuについてです。

結論だけ言うと色々調べて勉強にはなりました。後日、まとめて記事を書こうと思います。です。

事の発端

とあるプログラミングスクールでAWS環境を使っていたのですが、利用期限が終わってしまったのでHeroku上で動かしたいと思っておりました。

理由はうちのWindows10環境でうまく動かなかったため。

ソースを落として設定をしてもRailsのサーバ立ち上げコマンドが起動できず困ってしまったので、ソースをいじるのはローカルにて、動作確認はHerokuにアップロードして、という風に考えました。

ちょっとした開発ならHerokuの無料枠で事足りるっていう記述もネットにあったので、移行してしまおうと安易に考えてしまいました。

一筋縄ではいかなかった

これはすぐにネットで見つかるのですが、HerokuにRailsのアプリをデプロイすると、画像が上手く表示できないという問題がありまして、例外もれず私もぶち当たりました。

assets配下にある画像についてはすぐに対処できました。

しかし、public配下にある方の画像についてはこれがまた対処できないことできないこと。苦戦を強いられてしまいました。

こちらの問題に対処するには2通りあります。

画像を保存する先を別サーバ上にするか、DBにバイナリとして保存するかという2択です。

そこで後者を選んだことが、失敗でした。

ネットに参考ソースがいくつかあったので、すぐに実装できるだろうと思っていたら、なんと実装できない!?

ルートもコントローラもViewに関してもあっているはずなのに、何故か表示できない画像たち。

思い当たった「仮説」

で、数日間の格闘の後に気が付くんですよね。検証中にデータをDBに格納したから悪いのではないかと。

仮にDB格納時点で画像のバイナリデータがおかしくなっていたとしたら、そりゃ読み出せるはずはありません。

という訳で、DB書き込みとDB読み出しの処理を実装したのをチェックしてから、改めて新しく画像を入れてみると……上手くいきました! 正しく画像が表示されました!!

また壁に当たる

しかし、その後、動作確認していたらどういうわけだかエラーが頻発するんですよね。

これが何回も出るのですよ。

そして思い当たったのはDBの容量不足。

なるべく環境を合わせようとMySQL(ClearDB MySQL)を使っていたのですが、こちらは無料枠で使える容量が5MBまで。

もしかして、画像を扱ったテーブルを一度増やしてしまったせいで、使用領域が残り、この制限に引っかかっているのでは?

という訳で、一度DBのバックアップを取り、構築しなおすことにしました。

バックアップを作るのに使ったのはMySQL Wordbenchというソフト。

ついでなのでDBの容量を確認してみました。

うーん、やっぱりそうだよねぇ。

では、バックアップして再構築してやってみよう!!

……と、思ったら一緒に実装していたユーザ登録機能が機能しない。

エラー箇所はDBへの登録部分。

つまり、うまくデータが消えていないか、容量が減っていないかのどちらかですね。

ユーザデータは消えていたので恐らく後者でしょう。

コマンドで容量の解放を試みるもroot権限でないとできないらしく、仕方なくHerokuでの公開をあきらめたのでありました。

今回の反省

Heroku無料枠でRailsアプリを公開するときは、publicで画像を扱うものに関しては外部ストレージを使いましょう。

私の場合、なるべく一つのアプリは一つのサーバで管理したいので、こんなことになりました。

要するに横着しました。

今さら外部ストレージに直す道筋が見えないので、一旦別のものを作ろうと思います。

今後のブログ記事

今回で色々学べたので、Herokuのことをブログにしていきたいと思います。

この3つは書けるかな。

まとめ

とにかくこの記事で何が言いたかったかと言いますと、

  1. Herokuで画像を扱ったアプリを公開する場合、画像は外部ストレージに保存しましょう。
  2. 画像をDBにてバイナリ型のデータで保存する処理をいじった場合は改めて画像をDBに入れてから表示させてみましょう。

でした。

それでは、また次の記事でお会いしましょう。