LoginSignup
12
20

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-01-13

デプロイするたびに画像が消える問題

以下のように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章
S3に直接画像をアップロードする(Ruby on Rails)

注意点としては、githubにpushするときに
IAMユーザーのアクセスキーやシークレットキー
をハードコーディング(直書き)したものを絶対にpushしないこと。

アカウント不正利用されまくってしまうのでご注意。
(環境変数で設定すべし)

12
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
20