#デプロイするたびに画像が消える問題
以下のようにPictureUploaderを実装しているとします。
class PictureUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
process resize_to_limit: [300, 300]
storage :file
# アップロードファイルの保存先ディレクトリは上書き可能
# 下記はデフォルトの保存先
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# アップロード可能な拡張子のリスト
def extension_whitelist
%w(jpg jpeg gif png)
end
end
とりあえずはユーザーがあげた画像はローカル(storage: file)で
管理して、後でクラウドストレージで管理すればいいよねと思っていました
が、しかし
pushして自動デプロイするたびにローカルの画像が消える由々しき事態!何故なんだ、、、
#理由はデプロイのたびにコンテナ変わるから
herokuはコンテナ(仮想サーバ環境)で動いていて、新しくデプロイされるとそのコンテナごと新しく作り変えられるので、保存すべきファイルなどはs3や外部のストレージに保存しないといけないらしい。
こういう仕組みを**「Immutable Infrastructure」**という。
これに関しては以下の記事がよくまとまっているので是非。
(ここら辺はアプリ側の人間もがっつり学ばないといけない時代になってきましたね)
「Immutable Infrastructure」 by 伊藤 直也氏 #jawsdays – JAWS DAYS 2014 参加レポート Vol.02
#AWSのS3で管理しよう
そこでS3で管理しようという流れになるんですね。
みんな大好きrailsチュートリアルでS3の導入方法は
書かれているので、こういった背景を踏まえつつ実装すると良いんではないでしょうか。
[Rails on Rails チュートリアル 13章]
(https://railstutorial.jp/chapters/user_microposts?version=5.1#cha-user_microposts)
[S3に直接画像をアップロードする(Ruby on Rails)]
(https://qiita.com/DaichiSaito/items/80e89f0c96d88afcc5ff)
注意点としては、githubにpushするときに
IAMユーザーのアクセスキーやシークレットキー
をハードコーディング(直書き)したものを絶対にpushしないこと。
アカウント不正利用されまくってしまうのでご注意。
(環境変数で設定すべし)